Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,7 @@ public Optional<FragmentAndParameters> render() {
return model.initialCriterion()
.map(this::renderWithInitialCriterion)
.orElseGet(this::renderWithoutInitialCriterion)
.map(rc -> FragmentAndParameters.withFragment(rc.fragmentAndParameters().fragment())
.withParameters(rc.fragmentAndParameters().parameters())
.build()
);
.map(RenderedCriterion::fragmentAndParameters);
}

private Optional<RenderedCriterion> renderWithInitialCriterion(SqlCriterion initialCriterion) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.mybatis.dynamic.sql.common.OrderByRenderer;
import org.mybatis.dynamic.sql.delete.DeleteModel;
import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator;
import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
Expand Down Expand Up @@ -85,10 +86,10 @@ private Optional<FragmentAndParameters> calculateLimitClause() {
}

private FragmentAndParameters renderLimitClause(Long limit) {
RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo();
RenderedParameterInfo parameterInfo = renderingContext.calculateParameterInfo();

return FragmentAndParameters.withFragment("limit " + parameterInfo.renderedPlaceHolder()) //$NON-NLS-1$
.withParameter(parameterInfo.mapKey(), limit)
.withParameter(parameterInfo.parameterMapKey(), limit)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.Objects;
import java.util.Optional;

import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.util.AbstractColumnMapping;
import org.mybatis.dynamic.sql.util.ConstantMapping;
Expand Down Expand Up @@ -83,11 +84,11 @@ private Optional<FieldAndValueAndParameters> buildNullFragment(AbstractColumnMap
}

private Optional<FieldAndValueAndParameters> buildFragment(AbstractColumnMapping mapping, Object value) {
RenderingContext.ParameterInfo parameterInfo = mapping.mapColumn(renderingContext::calculateParameterInfo);
RenderedParameterInfo parameterInfo = mapping.mapColumn(renderingContext::calculateParameterInfo);

return FieldAndValueAndParameters.withFieldName(mapping.columnName())
.withValuePhrase(parameterInfo.renderedPlaceHolder())
.withParameter(parameterInfo.mapKey(), value)
.withParameter(parameterInfo.parameterMapKey(), value)
.buildOptional();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2016-2023 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.mybatis.dynamic.sql.render;

import java.util.Objects;

public class RenderedParameterInfo {
private final String parameterMapKey;
private final String renderedPlaceHolder;

public RenderedParameterInfo(String parameterMapKey, String renderedPlaceHolder) {
this.parameterMapKey = Objects.requireNonNull(parameterMapKey);
this.renderedPlaceHolder = Objects.requireNonNull(renderedPlaceHolder);
}

public String parameterMapKey() {
return parameterMapKey;
}

public String renderedPlaceHolder() {
return renderedPlaceHolder;
}
}
58 changes: 20 additions & 38 deletions src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,22 @@
*/
public class RenderingContext {

private final AtomicInteger sequence;
private final RenderingStrategy renderingStrategy;
private final AtomicInteger sequence;
private final TableAliasCalculator tableAliasCalculator;
private final String configuredParameterName;
private final String calculatedParameterName;

private RenderingContext(Builder builder) {
this.sequence = builder.sequence == null ? new AtomicInteger(1) : builder.sequence;
renderingStrategy = Objects.requireNonNull(builder.renderingStrategy);
tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator);
configuredParameterName = builder.parameterName;
if (configuredParameterName == null) {
calculatedParameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX;
} else {
calculatedParameterName =
configuredParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$
}

// reasonable defaults
sequence = builder.sequence == null ? new AtomicInteger(1) : builder.sequence;
tableAliasCalculator = builder.tableAliasCalculator == null ? TableAliasCalculator.empty()
: builder.tableAliasCalculator;
calculatedParameterName = builder.parameterName == null ? RenderingStrategy.DEFAULT_PARAMETER_PREFIX
: builder.parameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$
}

public TableAliasCalculator tableAliasCalculator() {
Expand All @@ -70,18 +69,14 @@ private <T> String renderedPlaceHolder(String mapKey, BindableColumn<T> column)
.getFormattedJdbcPlaceholder(column, calculatedParameterName, mapKey);
}

public ParameterInfo calculateParameterInfo() {
ParameterInfo p = new ParameterInfo();
p.mapKey = nextMapKey();
p.renderedPlaceHolder = renderedPlaceHolder(p.mapKey);
return p;
public RenderedParameterInfo calculateParameterInfo() {
String mapKey = nextMapKey();
return new RenderedParameterInfo(mapKey, renderedPlaceHolder(mapKey));
}

public <T> ParameterInfo calculateParameterInfo(BindableColumn<T> column) {
ParameterInfo p = new ParameterInfo();
p.mapKey = nextMapKey();
p.renderedPlaceHolder = renderedPlaceHolder(p.mapKey, column);
return p;
public <T> RenderedParameterInfo calculateParameterInfo(BindableColumn<T> column) {
String mapKey = nextMapKey();
return new RenderedParameterInfo(mapKey, renderedPlaceHolder(mapKey, column));
}

public <T> String aliasedColumnName(SqlColumn<T> column) {
Expand Down Expand Up @@ -128,18 +123,18 @@ public static Builder withRenderingStrategy(RenderingStrategy renderingStrategy)
}

public static class Builder {
private AtomicInteger sequence;
private RenderingStrategy renderingStrategy;
private TableAliasCalculator tableAliasCalculator = TableAliasCalculator.empty();
private AtomicInteger sequence;
private TableAliasCalculator tableAliasCalculator;
private String parameterName;

public Builder withSequence(AtomicInteger sequence) {
this.sequence = sequence;
public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
this.renderingStrategy = renderingStrategy;
return this;
}

public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
this.renderingStrategy = renderingStrategy;
public Builder withSequence(AtomicInteger sequence) {
this.sequence = sequence;
return this;
}

Expand All @@ -157,17 +152,4 @@ public RenderingContext build() {
return new RenderingContext(this);
}
}

public static class ParameterInfo {
private String mapKey;
private String renderedPlaceHolder;

public String mapKey() {
return mapKey;
}

public String renderedPlaceHolder() {
return renderedPlaceHolder;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ private Avg(BindableColumn<T> column) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters.withFragment("avg(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(s -> "avg(" + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,7 @@ private Count(BasicColumn column, String alias) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters
.withFragment("count(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(s -> "count(" + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,8 @@ private CountDistinct(BasicColumn column, String alias) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters
.withFragment("count(distinct " + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext)
.mapFragment(s -> "count(distinct " + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$)
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ private Max(BindableColumn<T> column) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters.withFragment("max(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(s -> "max(" + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ private Min(BindableColumn<T> column) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters.withFragment("min(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(s -> "min(" + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$)
}

@Override
Expand Down
19 changes: 7 additions & 12 deletions src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import org.mybatis.dynamic.sql.BindableColumn;
import org.mybatis.dynamic.sql.VisitableCondition;
import org.mybatis.dynamic.sql.exception.DynamicSqlException;
import org.mybatis.dynamic.sql.exception.InvalidSqlException;
import org.mybatis.dynamic.sql.render.RenderingContext;
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
Expand Down Expand Up @@ -46,29 +46,24 @@ public FragmentAndParameters render(RenderingContext renderingContext) {
}

private FragmentAndParameters renderWithoutCondition(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters.withFragment("sum(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(this::applyAggregate);
}

private FragmentAndParameters renderWithCondition(RenderingContext renderingContext) {
if (!condition.shouldRender()) {
throw new DynamicSqlException(Messages.getString("ERROR.37", "sum")); //$NON-NLS-1$ //$NON-NLS-2$
throw new InvalidSqlException(Messages.getString("ERROR.37", "sum")); //$NON-NLS-1$ //$NON-NLS-2$
}

DefaultConditionVisitor<T> visitor = new DefaultConditionVisitor.Builder<T>()
.withColumn(column)
.withRenderingContext(renderingContext)
.build();

FragmentAndParameters renderedCondition = condition.accept(visitor);
return condition.accept(visitor).mapFragment(this::applyAggregate);
}

return FragmentAndParameters
.withFragment("sum(" + renderedCondition.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedCondition.parameters())
.build();
private String applyAggregate(String s) {
return "sum(" + s + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,10 @@ protected Concat(BindableColumn<T> firstColumn, List<BasicColumn> subsequentColu
@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
// note - the cast below is added for type inference issues in some compilers
FragmentCollector fc = allColumns.stream()
return allColumns.stream()
.map(column -> column.render(renderingContext))
.collect(FragmentCollector.collect());

String fragment = fc.collectFragments(
Collectors.joining(", ", "concat(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

return FragmentAndParameters.withFragment(fragment)
.withParameters(fc.parameters())
.build();
.collect(FragmentCollector.collect()).toFragmentAndParameters(
Collectors.joining(", ", "concat(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,7 @@ private Lower(BindableColumn<T> column) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

return FragmentAndParameters
.withFragment("lower(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$
.withParameters(renderedColumn.parameters())
.build();
return column.render(renderingContext).mapFragment(s -> "lower(" + s + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,15 @@ protected OperatorFunction<T> copy() {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
String paddedOperator = " " + operator + " "; //$NON-NLS-1$ //$NON-NLS-2$

// note - the cast below is added for type inference issues in some compilers
FragmentCollector fc = Stream.of(Stream.of((BasicColumn) column),
return Stream.of(Stream.of((BasicColumn) column),
Stream.of(secondColumn), subsequentColumns.stream())
.flatMap(Function.identity())
.map(column -> column.render(renderingContext))
.collect(FragmentCollector.collect());

String paddedOperator = " " + operator + " "; //$NON-NLS-1$ //$NON-NLS-2$
String fragment = fc.collectFragments(
Collectors.joining(paddedOperator, "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$

return FragmentAndParameters.withFragment(fragment)
.withParameters(fc.parameters())
.build();
.collect(FragmentCollector.collect())
.toFragmentAndParameters(Collectors.joining(paddedOperator, "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$
}

public static <T> OperatorFunction<T> of(String operator, BindableColumn<T> firstColumn, BasicColumn secondColumn,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,13 @@ private Substring(BindableColumn<T> column, int offset, int length) {

@Override
public FragmentAndParameters render(RenderingContext renderingContext) {
FragmentAndParameters renderedColumn = column.render(renderingContext);

String fragment = "substring(" //$NON-NLS-1$
+ renderedColumn.fragment()
return column.render(renderingContext).mapFragment(s -> "substring(" //$NON-NLS-1$
+ s
+ ", " //$NON-NLS-1$
+ offset
+ ", " //$NON-NLS-1$
+ length
+ ")"; //$NON-NLS-1$

return FragmentAndParameters.withFragment(fragment)
.withParameters(renderedColumn.parameters())
.build();
+ ")"); //$NON-NLS-1$
}

@Override
Expand Down
Loading