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
This commit is contained in:
schauder
2022-10-19 14:32:08 +02:00
committed by Mark Paluch
parent e228757494
commit d5f7ab56c2
4 changed files with 40 additions and 6 deletions

View File

@@ -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;
@@ -48,12 +50,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;

View File

@@ -123,6 +123,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);
}

View File

@@ -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);
}
}

View File

@@ -54,6 +54,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.