Browse Source

Fix broken join conditions with InlineQuery.

Before this fix, whenever a column of an inline query was rendered the `InlineQuery` and all its children were visited, resulting in spurious output.
This is no prevented by injecting a NoopVisitor.

Closes: #1362
Original pull request: #1368
pull/1564/head
schauder 3 years ago committed by Mark Paluch
parent
commit
fe181e1679
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 8
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java
  2. 5
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ExpressionVisitor.java
  3. 26
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/NoopVisitor.java
  4. 7
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/TypedSubtreeVisitor.java

8
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java

@ -39,7 +39,9 @@ class ComparisonVisitor extends FilteredSubtreeVisitor { @@ -39,7 +39,9 @@ class ComparisonVisitor extends FilteredSubtreeVisitor {
private @Nullable PartRenderer current;
ComparisonVisitor(RenderContext context, Comparison condition, RenderTarget target) {
super(it -> it == condition);
this.condition = condition;
this.target = target;
this.context = context;
@ -52,12 +54,6 @@ class ComparisonVisitor extends FilteredSubtreeVisitor { @@ -52,12 +54,6 @@ class ComparisonVisitor extends FilteredSubtreeVisitor {
@Override
Delegation enterNested(Visitable segment) {
if (segment instanceof Condition) {
ConditionVisitor visitor = new ConditionVisitor(context);
current = visitor;
return Delegation.delegateTo(visitor);
}
if (segment instanceof Expression) {
ExpressionVisitor visitor = new ExpressionVisitor(context);
current = visitor;

5
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ExpressionVisitor.java

@ -131,6 +131,11 @@ class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartR @@ -131,6 +131,11 @@ class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartR
return Delegation.delegateTo(visitor);
}
if (segment instanceof InlineQuery) {
NoopVisitor<InlineQuery> partRenderer = new NoopVisitor(InlineQuery.class);
return Delegation.delegateTo(partRenderer);
}
return super.enterNested(segment);
}

26
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/NoopVisitor.java

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
/*
* Copyright 2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.relational.core.sql.render;
import org.springframework.data.relational.core.sql.Visitable;
class NoopVisitor<T extends Visitable> extends TypedSubtreeVisitor<T> {
NoopVisitor(Class<T> type) {
super(type);
}
}

7
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/TypedSubtreeVisitor.java

@ -53,6 +53,13 @@ abstract class TypedSubtreeVisitor<T extends Visitable> extends DelegatingVisito @@ -53,6 +53,13 @@ abstract class TypedSubtreeVisitor<T extends Visitable> extends DelegatingVisito
this.type = ResolvableType.forClass(getClass()).as(TypedSubtreeVisitor.class).getGeneric(0);
}
/**
* Creates a new {@link TypedSubtreeVisitor} with an explicitly provided type.
*/
TypedSubtreeVisitor(Class <T> type) {
this.type = ResolvableType.forType(type);
}
/**
* {@link Visitor#enter(Visitable) Enter} callback for a {@link Visitable} that this {@link Visitor} is responsible
* for. The default implementation retains delegation by default.

Loading…
Cancel
Save