Browse Source
We now support condition groups (WHERE (a = b OR b = c) AND (e = f)) with the SQL AST via Condition.group(). Original pull request: #193.pull/198/head
5 changed files with 162 additions and 6 deletions
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
/* |
||||
* Copyright 2020 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; |
||||
|
||||
/** |
||||
* Condition group wrapping a nested {@link Condition} with parentheses. |
||||
* |
||||
* @author Mark Paluch |
||||
* @since 2.0 |
||||
*/ |
||||
public class ConditionGroup extends MultipleCondition implements Condition { |
||||
|
||||
ConditionGroup(Condition condition) { |
||||
super("", condition); |
||||
} |
||||
|
||||
/* |
||||
* (non-Javadoc) |
||||
* @see java.lang.Object#toString() |
||||
*/ |
||||
@Override |
||||
public String toString() { |
||||
return "(" + super.toString() + ")"; |
||||
} |
||||
} |
||||
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
/* |
||||
* Copyright 2019-2020 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.Condition; |
||||
import org.springframework.data.relational.core.sql.ConditionGroup; |
||||
import org.springframework.data.relational.core.sql.Visitable; |
||||
import org.springframework.lang.Nullable; |
||||
|
||||
/** |
||||
* Renderer for {@link ConditionGroup}. Uses a {@link RenderTarget} to call back for render results. |
||||
* |
||||
* @author Mark Paluch |
||||
* @since 2.0 |
||||
*/ |
||||
class ConditionGroupVisitor extends TypedSubtreeVisitor<ConditionGroup> { |
||||
|
||||
private final RenderContext context; |
||||
private final RenderTarget target; |
||||
|
||||
private @Nullable ConditionVisitor conditionVisitor; |
||||
|
||||
ConditionGroupVisitor(RenderContext context, RenderTarget target) { |
||||
this.context = context; |
||||
this.target = target; |
||||
} |
||||
|
||||
/* |
||||
* (non-Javadoc) |
||||
* @see org.springframework.data.relational.core.sql.render.TypedSubtreeVisitor#enterNested(org.springframework.data.relational.core.sql.Visitable) |
||||
*/ |
||||
@Override |
||||
Delegation enterNested(Visitable segment) { |
||||
|
||||
DelegatingVisitor visitor = getDelegation(segment); |
||||
|
||||
return visitor != null ? Delegation.delegateTo(visitor) : Delegation.retain(); |
||||
} |
||||
|
||||
@Nullable |
||||
private DelegatingVisitor getDelegation(Visitable segment) { |
||||
|
||||
if (segment instanceof Condition) { |
||||
return conditionVisitor = new ConditionVisitor(context); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
/* |
||||
* (non-Javadoc) |
||||
* @see org.springframework.data.relational.core.sql.render.TypedSubtreeVisitor#leaveNested(org.springframework.data.relational.core.sql.Visitable) |
||||
*/ |
||||
@Override |
||||
Delegation leaveNested(Visitable segment) { |
||||
|
||||
if (conditionVisitor != null) { |
||||
target.onRendered("(" + conditionVisitor.getRenderedPart() + ")"); |
||||
conditionVisitor = null; |
||||
} |
||||
|
||||
return super.leaveNested(segment); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue