From 47ac63ab23838fe0721e4a6c645e8aaa5319fdf0 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 15:59:21 -0400 Subject: [PATCH 01/20] Add some reasonable defaults to RenderingContext --- .../AbstractBooleanExpressionRenderer.java | 7 ------ .../sql/delete/render/DeleteRenderer.java | 6 ++--- .../insert/render/GeneralInsertRenderer.java | 5 +++- .../GeneralInsertValuePhraseVisitor.java | 18 +++++++------- .../dynamic/sql/render/RenderingContext.java | 24 +++++++++++++++++-- .../dynamic/sql/select/SelectModel.java | 6 +---- .../render/FetchFirstPagingModelRenderer.java | 3 +-- .../select/render/JoinConditionRenderer.java | 3 +-- .../LimitAndOffsetPagingModelRenderer.java | 5 ++-- .../select/render/MultiSelectRenderer.java | 6 +---- .../render/QueryExpressionRenderer.java | 2 +- .../sql/update/render/SetPhraseVisitor.java | 5 ++-- .../sql/update/render/UpdateRenderer.java | 7 +++--- .../mybatis/dynamic/sql/where/WhereModel.java | 21 +++++----------- .../sql/where/render/CriterionRenderer.java | 10 +------- .../where/render/DefaultConditionVisitor.java | 13 +--------- .../mybatis/dynamic/sql/InvalidSQLTest.java | 4 +--- .../sql/mybatis3/CriterionRendererTest.java | 18 ++++---------- .../dynamic/sql/select/HavingModelTest.java | 6 +---- .../where/render/CriterionRendererTest.java | 9 ++----- 20 files changed, 65 insertions(+), 113 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java index 0650f30ec..d047729ea 100644 --- a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java @@ -39,7 +39,6 @@ protected AbstractBooleanExpressionRenderer(String prefix, AbstractBuilder criterionRenderer = new CriterionRenderer.Builder() .withRenderingContext(Objects.requireNonNull(builder.renderingContext)) - .withParameterName(builder.parameterName) .build(); } @@ -89,7 +88,6 @@ private String addPrefix(String fragment) { public abstract static class AbstractBuilder> { private final M model; - private String parameterName; private RenderingContext renderingContext; protected AbstractBuilder(M model) { @@ -101,11 +99,6 @@ public B withRenderingContext(RenderingContext renderingContext) { return getThis(); } - public B withParameterName(String parameterName) { - this.parameterName = parameterName; - return getThis(); - } - protected abstract B getThis(); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java index e1b591ec8..e54e7751f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java @@ -39,13 +39,13 @@ public class DeleteRenderer { private DeleteRenderer(Builder builder) { deleteModel = Objects.requireNonNull(builder.deleteModel); + // TODO - calculate this in the caller? TableAliasCalculator tableAliasCalculator = builder.deleteModel.tableAlias() .map(a -> ExplicitTableAliasCalculator.of(deleteModel.table(), a)) .orElseGet(TableAliasCalculator::empty); - renderingContext = new RenderingContext.Builder() + renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy)) .withTableAliasCalculator(tableAliasCalculator) - .withSequence(new AtomicInteger(1)) .build(); } @@ -94,7 +94,7 @@ private Optional calculateLimitClause() { private FragmentAndParameters renderLimitClause(Long limit) { String mapKey = renderingContext.nextMapKey(); String jdbcPlaceholder = renderingContext - .renderingStrategy().getFormattedJdbcPlaceholder(RenderingStrategy.DEFAULT_PARAMETER_PREFIX, mapKey); + .renderingStrategy().getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); return FragmentAndParameters.withFragment("limit " + jdbcPlaceholder) //$NON-NLS-1$ .withParameter(mapKey, limit) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java index 3acb2d6b2..5cdee9706 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java @@ -20,6 +20,7 @@ import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.GeneralInsertModel; +import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.Messages; @@ -34,7 +35,9 @@ private GeneralInsertRenderer(Builder builder) { } public GeneralInsertStatementProvider render() { - GeneralInsertValuePhraseVisitor visitor = new GeneralInsertValuePhraseVisitor(renderingStrategy); + RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy).build(); + + GeneralInsertValuePhraseVisitor visitor = new GeneralInsertValuePhraseVisitor(renderingContext); FieldAndValueCollector collector = model.mapColumnMappings(m -> m.accept(visitor)) .filter(Optional::isPresent) .map(Optional::get) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java index ca3222c8a..bc8f5fbea 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java @@ -15,11 +15,11 @@ */ package org.mybatis.dynamic.sql.insert.render; +import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import org.mybatis.dynamic.sql.SqlColumn; -import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.ConstantMapping; import org.mybatis.dynamic.sql.util.GeneralInsertMappingVisitor; @@ -31,11 +31,9 @@ public class GeneralInsertValuePhraseVisitor extends GeneralInsertMappingVisitor> { - private final RenderingStrategy renderingStrategy; - private final AtomicInteger sequence = new AtomicInteger(1); - - public GeneralInsertValuePhraseVisitor(RenderingStrategy renderingStrategy) { - this.renderingStrategy = renderingStrategy; + private final RenderingContext renderingContext; + public GeneralInsertValuePhraseVisitor(RenderingContext renderingContext) { + this.renderingContext = Objects.requireNonNull(renderingContext); } @Override @@ -85,7 +83,7 @@ private Optional buildNullFragment(AbstractColumnMap } private Optional buildFragment(AbstractColumnMapping mapping, Object value) { - String mapKey = renderingStrategy.formatParameterMapKey(sequence); + String mapKey = renderingContext.nextMapKey(); String jdbcPlaceholder = mapping.mapColumn(c -> calculateJdbcPlaceholder(c, mapKey)); @@ -96,7 +94,7 @@ private Optional buildFragment(AbstractColumnMapping } private String calculateJdbcPlaceholder(SqlColumn column, String parameterName) { - return column.renderingStrategy().orElse(renderingStrategy) - .getFormattedJdbcPlaceholder(column, RenderingStrategy.DEFAULT_PARAMETER_PREFIX, parameterName); + return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) + .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), parameterName); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index e5e5a8118..6f82f8d70 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -23,11 +23,17 @@ public class RenderingContext { private final AtomicInteger sequence; private final RenderingStrategy renderingStrategy; private final TableAliasCalculator tableAliasCalculator; + private final String parameterName; private RenderingContext(Builder builder) { sequence = Objects.requireNonNull(builder.sequence); renderingStrategy = Objects.requireNonNull(builder.renderingStrategy); tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator); + if (builder.parameterName == null) { + parameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; + } else { + parameterName = builder.parameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ + } } public AtomicInteger sequence() { @@ -42,14 +48,23 @@ public TableAliasCalculator tableAliasCalculator() { return tableAliasCalculator; } + public String parameterName() { + return parameterName; + } + public String nextMapKey() { return renderingStrategy.formatParameterMapKey(sequence); } + public static Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { + return new Builder().withRenderingStrategy(renderingStrategy); + } + public static class Builder { - private AtomicInteger sequence; + private AtomicInteger sequence = new AtomicInteger(1); private RenderingStrategy renderingStrategy; - private TableAliasCalculator tableAliasCalculator; + private TableAliasCalculator tableAliasCalculator = TableAliasCalculator.empty(); + private String parameterName; public Builder withSequence(AtomicInteger sequence) { this.sequence = sequence; @@ -66,6 +81,11 @@ public Builder withTableAliasCalculator(TableAliasCalculator tableAliasCalculato return this; } + public Builder withParameterName(String parameterName) { + this.parameterName = parameterName; + return this; + } + public RenderingContext build() { return new RenderingContext(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java index 123db5056..24f3839ee 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -62,11 +62,7 @@ public Optional pagingModel() { @NotNull public SelectStatementProvider render(RenderingStrategy renderingStrategy) { - RenderingContext renderingContext = new RenderingContext.Builder() - .withRenderingStrategy(renderingStrategy) - .withSequence(new AtomicInteger(1)) - .withTableAliasCalculator(TableAliasCalculator.empty()) - .build(); + RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy).build(); return SelectRenderer.withSelectModel(this) .withRenderingContext(renderingContext) .build() diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java index 892732ed6..37f84ead4 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java @@ -17,7 +17,6 @@ import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.PagingModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.InternalError; @@ -80,6 +79,6 @@ private FragmentAndParameters renderOffsetAndFetchFirstRows(Long offset, Long fe private String renderPlaceholder(String parameterName) { return renderingContext.renderingStrategy() - .getFormattedJdbcPlaceholder(RenderingStrategy.DEFAULT_PARAMETER_PREFIX, parameterName); + .getFormattedJdbcPlaceholder(renderingContext.parameterName(), parameterName); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java index 5f76bc1e4..1c08d93d5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java @@ -22,7 +22,6 @@ import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.join.ColumnBasedJoinCondition; import org.mybatis.dynamic.sql.select.join.JoinConditionVisitor; import org.mybatis.dynamic.sql.select.join.TypedJoinCondition; @@ -42,7 +41,7 @@ public FragmentAndParameters visit(TypedJoinCondition condition) { String mapKey = renderingContext.nextMapKey(); String placeHolder = leftColumn.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(leftColumn, RenderingStrategy.DEFAULT_PARAMETER_PREFIX, mapKey); + .getFormattedJdbcPlaceholder(leftColumn, renderingContext.parameterName(), mapKey); return FragmentAndParameters.withFragment(condition.operator() + spaceBefore(placeHolder)) .withParameter(mapKey, condition.value()) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java index 8c07a83c3..dfb5621a6 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java @@ -18,7 +18,6 @@ import java.util.Objects; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.PagingModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -56,8 +55,8 @@ private FragmentAndParameters renderLimitAndOffset(Long offset) { .build(); } - private String renderPlaceholder(String parameterName) { + private String renderPlaceholder(String mapKey) { return renderingContext.renderingStrategy() - .getFormattedJdbcPlaceholder(RenderingStrategy.DEFAULT_PARAMETER_PREFIX, parameterName); + .getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java index 90be1f79b..b0cece9d7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/MultiSelectRenderer.java @@ -17,14 +17,12 @@ import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.select.MultiSelectModel; import org.mybatis.dynamic.sql.select.PagingModel; import org.mybatis.dynamic.sql.select.SelectModel; @@ -37,9 +35,7 @@ public class MultiSelectRenderer { private final RenderingContext renderingContext; private MultiSelectRenderer(Builder builder) { - renderingContext = new RenderingContext.Builder() - .withTableAliasCalculator(TableAliasCalculator.empty()) - .withSequence(new AtomicInteger(1)) + renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy)) .build(); multiSelectModel = Objects.requireNonNull(builder.multiSelectModel); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java index d424d62b8..e5bac6b0e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java @@ -46,7 +46,7 @@ private QueryExpressionRenderer(Builder builder) { TableAliasCalculator tableAliasCalculator = calculateTableAliasCalculator(queryExpression, builder.renderingContext.tableAliasCalculator()); - renderingContext = new RenderingContext.Builder() + renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingContext.renderingStrategy())) .withSequence(builder.renderingContext.sequence()) .withTableAliasCalculator(tableAliasCalculator) diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java index 935515c92..9dc797478 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; @@ -137,8 +136,8 @@ private Optional buildFragment(AbstractColumnMapping .buildOptional(); } - private String calculateJdbcPlaceholder(SqlColumn column, String parameterName) { + private String calculateJdbcPlaceholder(SqlColumn column, String mapKey) { return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, RenderingStrategy.DEFAULT_PARAMETER_PREFIX, parameterName); + .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index d42f37d0e..5868828c8 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import org.mybatis.dynamic.sql.SqlTable; @@ -42,13 +41,13 @@ public class UpdateRenderer { private UpdateRenderer(Builder builder) { updateModel = Objects.requireNonNull(builder.updateModel); + // TODO - calculate this in the caller? TableAliasCalculator tableAliasCalculator = builder.updateModel.tableAlias() .map(a -> ExplicitTableAliasCalculator.of(updateModel.table(), a)) .orElseGet(TableAliasCalculator::empty); - renderingContext = new RenderingContext.Builder() + renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy)) .withTableAliasCalculator(tableAliasCalculator) - .withSequence(new AtomicInteger(1)) .build(); } @@ -124,7 +123,7 @@ private Optional calculateLimitClause() { private FragmentAndParameters renderLimitClause(Long limit) { String mapKey = renderingContext.nextMapKey(); String jdbcPlaceholder = renderingContext - .renderingStrategy().getFormattedJdbcPlaceholder(RenderingStrategy.DEFAULT_PARAMETER_PREFIX, mapKey); + .renderingStrategy().getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); return FragmentAndParameters.withFragment("limit " + jdbcPlaceholder) //$NON-NLS-1$ .withParameter(mapKey, limit) diff --git a/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java b/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java index 4b12c763e..15a620936 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import org.mybatis.dynamic.sql.AndOrCriteriaGroup; import org.mybatis.dynamic.sql.SqlCriterion; @@ -53,11 +52,7 @@ public boolean isNonRenderingClauseAllowed() { * @return rendered where clause */ public Optional render(RenderingStrategy renderingStrategy) { - RenderingContext renderingContext = new RenderingContext.Builder() - .withRenderingStrategy(renderingStrategy) - .withSequence(new AtomicInteger(1)) - .withTableAliasCalculator(TableAliasCalculator.empty()) - .build(); + RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy).build(); return WhereRenderer.withWhereModel(this) .withRenderingContext(renderingContext) @@ -68,9 +63,8 @@ public Optional render(RenderingStrategy renderingStrategy) public Optional render(RenderingStrategy renderingStrategy, TableAliasCalculator tableAliasCalculator) { - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(renderingStrategy) - .withSequence(new AtomicInteger(1)) .withTableAliasCalculator(tableAliasCalculator) .build(); @@ -82,15 +76,13 @@ public Optional render(RenderingStrategy renderingStrategy, } public Optional render(RenderingStrategy renderingStrategy, String parameterName) { - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(renderingStrategy) - .withSequence(new AtomicInteger(1)) - .withTableAliasCalculator(TableAliasCalculator.empty()) + .withParameterName(parameterName) .build(); return WhereRenderer.withWhereModel(this) .withRenderingContext(renderingContext) - .withParameterName(parameterName) .build() .render() .map(this::toWhereClauseProvider); @@ -98,15 +90,14 @@ public Optional render(RenderingStrategy renderingStrategy, public Optional render(RenderingStrategy renderingStrategy, TableAliasCalculator tableAliasCalculator, String parameterName) { - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(renderingStrategy) - .withSequence(new AtomicInteger(1)) .withTableAliasCalculator(tableAliasCalculator) + .withParameterName(parameterName) .build(); return WhereRenderer.withWhereModel(this) .withRenderingContext(renderingContext) - .withParameterName(parameterName) .build() .render() .map(this::toWhereClauseProvider); diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java index 0cbe3c6a6..86287594b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java @@ -54,11 +54,9 @@ * @author Jeff Butler */ public class CriterionRenderer implements SqlCriterionVisitor> { - private final String parameterName; private final RenderingContext renderingContext; private CriterionRenderer(Builder builder) { - parameterName = builder.parameterName; renderingContext = Objects.requireNonNull(builder.renderingContext); } @@ -179,7 +177,6 @@ private Optional calculateRenderedCriterion(List FragmentAndParameters renderCondition(ColumnAndConditionCriterion criterion) { DefaultConditionVisitor visitor = DefaultConditionVisitor.withColumn(criterion.column()) .withRenderingContext(renderingContext) - .withParameterName(parameterName) .build(); return criterion.condition().accept(visitor); } @@ -249,8 +246,8 @@ private String calculateNotFragment(FragmentCollector collector) { } } + // TODO - remove builder - only one parameter public static class Builder { - private String parameterName; private RenderingContext renderingContext; public Builder withRenderingContext(RenderingContext renderingContext) { @@ -258,11 +255,6 @@ public Builder withRenderingContext(RenderingContext renderingContext) { return this; } - public Builder withParameterName(String parameterName) { - this.parameterName = parameterName; - return this; - } - public CriterionRenderer build() { return new CriterionRenderer(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java index 9564c8c7f..ddad057ac 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java @@ -29,7 +29,6 @@ import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.ConditionVisitor; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -38,12 +37,10 @@ public class DefaultConditionVisitor implements ConditionVisitor { private final BindableColumn column; - private final String parameterPrefix; private final RenderingContext renderingContext; private DefaultConditionVisitor(Builder builder) { column = Objects.requireNonNull(builder.column); - parameterPrefix = Objects.requireNonNull(builder.parameterPrefix); renderingContext = Objects.requireNonNull(builder.renderingContext); } @@ -155,7 +152,7 @@ private FragmentAndParameters toFragmentAndParameters(T value) { private String getFormattedJdbcPlaceholder(String mapKey) { return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, parameterPrefix, mapKey); + .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); } public static Builder withColumn(BindableColumn column) { @@ -164,7 +161,6 @@ public static Builder withColumn(BindableColumn column) { public static class Builder { private BindableColumn column; - private String parameterPrefix = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; private RenderingContext renderingContext; public Builder withColumn(BindableColumn column) { @@ -177,13 +173,6 @@ public Builder withRenderingContext(RenderingContext renderingContext) { return this; } - public Builder withParameterName(String parameterName) { - if (parameterName != null) { - parameterPrefix = parameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ - } - return this; - } - public DefaultConditionVisitor build() { return new DefaultConditionVisitor<>(this); } diff --git a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java index 81ffb0ab8..1fbff30ba 100644 --- a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java @@ -241,10 +241,8 @@ void testMissingMessage() { void testInvalidPagingModel() { PagingModel pagingModel = new PagingModel.Builder().build(); - RenderingContext renderingContext = new RenderingContext.Builder() - .withTableAliasCalculator(TableAliasCalculator.empty()) + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) - .withSequence(new AtomicInteger(1)) .build(); PagingModelRenderer renderer = new PagingModelRenderer.Builder() diff --git a/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java b/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java index ca2ac4622..62f7ae66c 100644 --- a/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java @@ -21,7 +21,6 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.ColumnAndConditionCriterion; @@ -31,7 +30,6 @@ import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategies; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.where.condition.IsEqualTo; import org.mybatis.dynamic.sql.where.render.CriterionRenderer; @@ -47,11 +45,7 @@ void testAliasWithIgnore() { .withCondition(condition) .build(); - RenderingContext renderingContext = new RenderingContext.Builder() - .withSequence(new AtomicInteger(1)) - .withRenderingStrategy(RenderingStrategies.MYBATIS3) - .withTableAliasCalculator(TableAliasCalculator.empty()) - .build(); + RenderingContext renderingContext =RenderingContext.withRenderingStrategy(RenderingStrategies.MYBATIS3).build(); CriterionRenderer renderer = new CriterionRenderer.Builder() .withRenderingContext(renderingContext) @@ -75,8 +69,7 @@ void testAliasWithoutIgnore() { Map tableAliases = new HashMap<>(); tableAliases.put(table, "a"); - RenderingContext renderingContext = new RenderingContext.Builder() - .withSequence(new AtomicInteger(1)) + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); @@ -106,10 +99,8 @@ void testTypeHandler() { .withCondition(condition) .build(); - RenderingContext renderingContext = new RenderingContext.Builder() - .withSequence(new AtomicInteger(1)) + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) - .withTableAliasCalculator(TableAliasCalculator.empty()) .build(); CriterionRenderer renderer = new CriterionRenderer.Builder() @@ -134,8 +125,7 @@ void testTypeHandlerAndAlias() { Map tableAliases = new HashMap<>(); tableAliases.put(table, "a"); - RenderingContext renderingContext = new RenderingContext.Builder() - .withSequence(new AtomicInteger(1)) + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); diff --git a/src/test/java/org/mybatis/dynamic/sql/select/HavingModelTest.java b/src/test/java/org/mybatis/dynamic/sql/select/HavingModelTest.java index b5879b576..6d8c46de9 100644 --- a/src/test/java/org/mybatis/dynamic/sql/select/HavingModelTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/select/HavingModelTest.java @@ -20,14 +20,12 @@ import java.sql.JDBCType; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategies; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.select.render.HavingRenderer; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -65,10 +63,8 @@ void testComplexHaving() { } private Optional renderHavingModel(HavingModel havingModel) { - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.SPRING_NAMED_PARAMETER) - .withSequence(new AtomicInteger(1)) - .withTableAliasCalculator(TableAliasCalculator.empty()) .build(); return HavingRenderer.withHavingModel(havingModel) diff --git a/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java b/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java index b568ec27d..eb3de5ce3 100644 --- a/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java @@ -21,7 +21,6 @@ import java.sql.JDBCType; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.ColumnAndConditionCriterion; @@ -30,7 +29,6 @@ import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategies; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.where.condition.IsEqualTo; @@ -46,10 +44,8 @@ void testAliasWithIgnore() { .withCondition(condition) .build(); - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) - .withSequence(new AtomicInteger(1)) - .withTableAliasCalculator(TableAliasCalculator.empty()) .build(); CriterionRenderer renderer = new CriterionRenderer.Builder() @@ -75,9 +71,8 @@ void testAliasWithoutIgnore() { Map tableAliases = new HashMap<>(); tableAliases.put(table, "a"); - RenderingContext renderingContext = new RenderingContext.Builder() + RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) - .withSequence(new AtomicInteger(1)) .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); From d705d2398776337b62ac0cdbfb62773e5e45f5e2 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:07:16 -0400 Subject: [PATCH 02/20] Remove CriterionRenderer builder - only one parameter need for constructor --- .../AbstractBooleanExpressionRenderer.java | 5 +---- .../sql/where/render/CriterionRenderer.java | 18 ++---------------- .../sql/mybatis3/CriterionRendererTest.java | 16 ++++------------ .../where/render/CriterionRendererTest.java | 8 ++------ 4 files changed, 9 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java index d047729ea..9e78b763b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionRenderer.java @@ -36,10 +36,7 @@ public abstract class AbstractBooleanExpressionRenderer builder) { model = Objects.requireNonNull(builder.model); this.prefix = Objects.requireNonNull(prefix); - - criterionRenderer = new CriterionRenderer.Builder() - .withRenderingContext(Objects.requireNonNull(builder.renderingContext)) - .build(); + criterionRenderer = new CriterionRenderer(builder.renderingContext); } public Optional render() { diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java index 86287594b..491b10a92 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java @@ -56,8 +56,8 @@ public class CriterionRenderer implements SqlCriterionVisitor> { private final RenderingContext renderingContext; - private CriterionRenderer(Builder builder) { - renderingContext = Objects.requireNonNull(builder.renderingContext); + public CriterionRenderer(RenderingContext renderingContext) { + this.renderingContext = Objects.requireNonNull(renderingContext); } @Override @@ -245,18 +245,4 @@ private String calculateNotFragment(FragmentCollector collector) { return collector.firstFragment().map(s -> "not " + s).orElse(""); //$NON-NLS-1$ //$NON-NLS-2$ } } - - // TODO - remove builder - only one parameter - public static class Builder { - private RenderingContext renderingContext; - - public Builder withRenderingContext(RenderingContext renderingContext) { - this.renderingContext = renderingContext; - return this; - } - - public CriterionRenderer build() { - return new CriterionRenderer(this); - } - } } diff --git a/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java b/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java index 62f7ae66c..f9b3f7519 100644 --- a/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/mybatis3/CriterionRendererTest.java @@ -47,9 +47,7 @@ void testAliasWithIgnore() { RenderingContext renderingContext =RenderingContext.withRenderingStrategy(RenderingStrategies.MYBATIS3).build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParametersWithConnector(); @@ -74,9 +72,7 @@ void testAliasWithoutIgnore() { .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParametersWithConnector(); @@ -103,9 +99,7 @@ void testTypeHandler() { .withRenderingStrategy(RenderingStrategies.MYBATIS3) .build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParametersWithConnector(); @@ -130,9 +124,7 @@ void testTypeHandlerAndAlias() { .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParametersWithConnector(); diff --git a/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java b/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java index eb3de5ce3..d3a1baaac 100644 --- a/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/where/render/CriterionRendererTest.java @@ -48,9 +48,7 @@ void testAliasWithIgnore() { .withRenderingStrategy(RenderingStrategies.MYBATIS3) .build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParameters(); @@ -76,9 +74,7 @@ void testAliasWithoutIgnore() { .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases)) .build(); - CriterionRenderer renderer = new CriterionRenderer.Builder() - .withRenderingContext(renderingContext) - .build(); + CriterionRenderer renderer = new CriterionRenderer(renderingContext); assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> { FragmentAndParameters fp = rc.fragmentAndParameters(); From bd7684c308ccc663d7439a5fa3127049d61c16f0 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:10:08 -0400 Subject: [PATCH 03/20] Remove todos --- .../org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java | 2 -- .../org/mybatis/dynamic/sql/update/render/UpdateRenderer.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java index e54e7751f..d323c5233 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java @@ -17,7 +17,6 @@ import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import org.mybatis.dynamic.sql.SqlTable; @@ -39,7 +38,6 @@ public class DeleteRenderer { private DeleteRenderer(Builder builder) { deleteModel = Objects.requireNonNull(builder.deleteModel); - // TODO - calculate this in the caller? TableAliasCalculator tableAliasCalculator = builder.deleteModel.tableAlias() .map(a -> ExplicitTableAliasCalculator.of(deleteModel.table(), a)) .orElseGet(TableAliasCalculator::empty); diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index 5868828c8..31ea786f4 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -41,7 +41,6 @@ public class UpdateRenderer { private UpdateRenderer(Builder builder) { updateModel = Objects.requireNonNull(builder.updateModel); - // TODO - calculate this in the caller? TableAliasCalculator tableAliasCalculator = builder.updateModel.tableAlias() .map(a -> ExplicitTableAliasCalculator.of(updateModel.table(), a)) .orElseGet(TableAliasCalculator::empty); From 03c14160b91795a16c691634c7c06fba4a667867 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:11:40 -0400 Subject: [PATCH 04/20] Remove unused imports --- src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java | 2 -- src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java index 24f3839ee..c2ee62794 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Stream; @@ -28,7 +27,6 @@ import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.Messages; diff --git a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java index 1fbff30ba..933116b84 100644 --- a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.MissingResourceException; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.exception.DynamicSqlException; From c25b40b33473b0e3c4cad03f38228e47efa8bfec Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:17:56 -0400 Subject: [PATCH 05/20] Better parameter name --- .../sql/insert/render/GeneralInsertValuePhraseVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java index bc8f5fbea..33e628984 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java @@ -93,8 +93,8 @@ private Optional buildFragment(AbstractColumnMapping .buildOptional(); } - private String calculateJdbcPlaceholder(SqlColumn column, String parameterName) { + private String calculateJdbcPlaceholder(SqlColumn column, String mapKey) { return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), parameterName); + .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); } } From e3da5ebc5dea1c58a2085c4e7c46ec6af9aabe5f Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:33:17 -0400 Subject: [PATCH 06/20] Consistency --- .../dynamic/sql/delete/render/DeleteRenderer.java | 7 ++++--- .../sql/select/render/TableExpressionRenderer.java | 9 ++++----- .../dynamic/sql/update/render/UpdateRenderer.java | 7 ++++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java index d323c5233..ae4975e6b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java @@ -32,6 +32,8 @@ import org.mybatis.dynamic.sql.where.WhereModel; import org.mybatis.dynamic.sql.where.render.WhereRenderer; +import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; + public class DeleteRenderer { private final DeleteModel deleteModel; private final RenderingContext renderingContext; @@ -67,10 +69,9 @@ private DeleteStatementProvider toDeleteStatementProvider(FragmentCollector frag private FragmentAndParameters calculateDeleteStatementStart() { SqlTable table = deleteModel.table(); - String tableName = table.tableNameAtRuntime(); String aliasedTableName = renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> tableName + " " + a).orElse(tableName); //$NON-NLS-1$ - + .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) + .orElseGet(table::tableNameAtRuntime); return FragmentAndParameters.fromFragment("delete from " + aliasedTableName); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java index 85119a283..639c1d8ea 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java @@ -34,11 +34,10 @@ private TableExpressionRenderer(Builder builder) { @Override public FragmentAndParameters visit(SqlTable table) { - return FragmentAndParameters.withFragment( - renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) - .orElseGet(table::tableNameAtRuntime)) - .build(); + return FragmentAndParameters.fromFragment( + renderingContext.tableAliasCalculator().aliasForTable(table) + .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) + .orElseGet(table::tableNameAtRuntime)); } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index 31ea786f4..145467899 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -35,6 +35,8 @@ import org.mybatis.dynamic.sql.where.WhereModel; import org.mybatis.dynamic.sql.where.render.WhereRenderer; +import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; + public class UpdateRenderer { private final UpdateModel updateModel; private final RenderingContext renderingContext; @@ -71,10 +73,9 @@ private UpdateStatementProvider toUpdateStatementProvider(FragmentCollector frag private FragmentAndParameters calculateUpdateStatementStart() { SqlTable table = updateModel.table(); - String tableName = table.tableNameAtRuntime(); String aliasedTableName = renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> tableName + " " + a).orElse(tableName); //$NON-NLS-1$ - + .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) + .orElseGet(table::tableNameAtRuntime); return FragmentAndParameters.fromFragment("update " + aliasedTableName); //$NON-NLS-1$ } From 79167c6a41428e741fb3f1ca8a8af40743961d49 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 16:44:18 -0400 Subject: [PATCH 07/20] Add a utility method to override the table alias calculator --- .../dynamic/sql/render/RenderingContext.java | 33 ++++++++++++++----- .../render/QueryExpressionRenderer.java | 6 +--- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index 6f82f8d70..f283a1fe2 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -23,23 +23,21 @@ public class RenderingContext { private final AtomicInteger sequence; private final RenderingStrategy renderingStrategy; private final TableAliasCalculator tableAliasCalculator; - private final String parameterName; + private final String builderParameterName; + private final String calculatedParameterName; private RenderingContext(Builder builder) { sequence = Objects.requireNonNull(builder.sequence); renderingStrategy = Objects.requireNonNull(builder.renderingStrategy); tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator); - if (builder.parameterName == null) { - parameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; + builderParameterName = builder.parameterName; + if (builderParameterName == null) { + calculatedParameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; } else { - parameterName = builder.parameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ + calculatedParameterName = builderParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ } } - public AtomicInteger sequence() { - return sequence; - } - public RenderingStrategy renderingStrategy() { return renderingStrategy; } @@ -49,13 +47,30 @@ public TableAliasCalculator tableAliasCalculator() { } public String parameterName() { - return parameterName; + return calculatedParameterName; } public String nextMapKey() { return renderingStrategy.formatParameterMapKey(sequence); } + /** + * Crete a new rendering context based on this, with the specified table alias calculator. + * + * This is used by the query expression renderer when the alias calculator may change during rendering. + * + * @param tableAliasCalculator the new table alias calculator + * @return a new table alias calculator based on this with an overridden tableAliasCalculator + */ + public RenderingContext withTableAliasCalculator(TableAliasCalculator tableAliasCalculator) { + return new Builder() + .withRenderingStrategy(this.renderingStrategy) + .withParameterName(this.builderParameterName) + .withTableAliasCalculator(tableAliasCalculator) + .withSequence(this.sequence) + .build(); + } + public static Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { return new Builder().withRenderingStrategy(renderingStrategy); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java index e5bac6b0e..2167eb839 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java @@ -46,11 +46,7 @@ private QueryExpressionRenderer(Builder builder) { TableAliasCalculator tableAliasCalculator = calculateTableAliasCalculator(queryExpression, builder.renderingContext.tableAliasCalculator()); - renderingContext = RenderingContext - .withRenderingStrategy(Objects.requireNonNull(builder.renderingContext.renderingStrategy())) - .withSequence(builder.renderingContext.sequence()) - .withTableAliasCalculator(tableAliasCalculator) - .build(); + renderingContext = builder.renderingContext.withTableAliasCalculator(tableAliasCalculator); tableExpressionRenderer = new TableExpressionRenderer.Builder() .withRenderingContext(renderingContext) From 4d1df939d469d7bf82eeba09232fd28ee5a37a94 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 17:01:55 -0400 Subject: [PATCH 08/20] Add a utility method to calculate parameter info --- .../sql/delete/render/DeleteRenderer.java | 8 ++--- .../dynamic/sql/render/RenderingContext.java | 24 +++++++++++++++ .../render/FetchFirstPagingModelRenderer.java | 29 ++++++++----------- .../sql/update/render/UpdateRenderer.java | 8 ++--- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java index ae4975e6b..c0130ca0b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java @@ -91,12 +91,10 @@ private Optional calculateLimitClause() { } private FragmentAndParameters renderLimitClause(Long limit) { - String mapKey = renderingContext.nextMapKey(); - String jdbcPlaceholder = renderingContext - .renderingStrategy().getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(); - return FragmentAndParameters.withFragment("limit " + jdbcPlaceholder) //$NON-NLS-1$ - .withParameter(mapKey, limit) + return FragmentAndParameters.withFragment("limit " + parameterInfo.renderedPlaceHolder()) //$NON-NLS-1$ + .withParameter(parameterInfo.mapKey(), limit) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index f283a1fe2..ea9171720 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -54,6 +54,17 @@ public String nextMapKey() { return renderingStrategy.formatParameterMapKey(sequence); } + private String renderedPlaceHolder(String mapKey) { + return renderingStrategy.getFormattedJdbcPlaceholder(calculatedParameterName, mapKey); + } + + public ParameterInfo calculateParameterInfo() { + ParameterInfo p = new ParameterInfo(); + p.mapKey = nextMapKey(); + p.renderedPlaceHolder = renderedPlaceHolder(p.mapKey); + return p; + } + /** * Crete a new rendering context based on this, with the specified table alias calculator. * @@ -105,4 +116,17 @@ 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; + } + } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java index 37f84ead4..19a50eaa9 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/FetchFirstPagingModelRenderer.java @@ -50,35 +50,30 @@ private FragmentAndParameters renderFetchFirstRowsOnly() { } private FragmentAndParameters renderFetchFirstRowsOnly(Long fetchFirstRows) { - String mapKey = renderingContext.nextMapKey(); + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(); return FragmentAndParameters - .withFragment("fetch first " + renderPlaceholder(mapKey) //$NON-NLS-1$ + .withFragment("fetch first " + parameterInfo.renderedPlaceHolder() //$NON-NLS-1$ + " rows only") //$NON-NLS-1$ - .withParameter(mapKey, fetchFirstRows) + .withParameter(parameterInfo.mapKey(), fetchFirstRows) .build(); } private FragmentAndParameters renderOffsetOnly(Long offset) { - String mapKey = renderingContext.nextMapKey(); - return FragmentAndParameters.withFragment("offset " + renderPlaceholder(mapKey) //$NON-NLS-1$ + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(); + return FragmentAndParameters.withFragment("offset " + parameterInfo.renderedPlaceHolder() //$NON-NLS-1$ + " rows") //$NON-NLS-1$ - .withParameter(mapKey, offset) + .withParameter(parameterInfo.mapKey(), offset) .build(); } private FragmentAndParameters renderOffsetAndFetchFirstRows(Long offset, Long fetchFirstRows) { - String mapKey1 = renderingContext.nextMapKey(); - String mapKey2 = renderingContext.nextMapKey(); - return FragmentAndParameters.withFragment("offset " + renderPlaceholder(mapKey1) //$NON-NLS-1$ - + " rows fetch first " + renderPlaceholder(mapKey2) //$NON-NLS-1$ + RenderingContext.ParameterInfo parameterInfo1 = renderingContext.calculateParameterInfo(); + RenderingContext.ParameterInfo parameterInfo2 = renderingContext.calculateParameterInfo(); + return FragmentAndParameters.withFragment("offset " + parameterInfo1.renderedPlaceHolder() //$NON-NLS-1$ + + " rows fetch first " + parameterInfo2.renderedPlaceHolder() //$NON-NLS-1$ + " rows only") //$NON-NLS-1$ - .withParameter(mapKey1, offset) - .withParameter(mapKey2, fetchFirstRows) + .withParameter(parameterInfo1.mapKey(), offset) + .withParameter(parameterInfo2.mapKey(), fetchFirstRows) .build(); } - - private String renderPlaceholder(String parameterName) { - return renderingContext.renderingStrategy() - .getFormattedJdbcPlaceholder(renderingContext.parameterName(), parameterName); - } } diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index 145467899..f4f91116b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -121,12 +121,10 @@ private Optional calculateLimitClause() { } private FragmentAndParameters renderLimitClause(Long limit) { - String mapKey = renderingContext.nextMapKey(); - String jdbcPlaceholder = renderingContext - .renderingStrategy().getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(); - return FragmentAndParameters.withFragment("limit " + jdbcPlaceholder) //$NON-NLS-1$ - .withParameter(mapKey, limit) + return FragmentAndParameters.withFragment("limit " + parameterInfo.renderedPlaceHolder()) //$NON-NLS-1$ + .withParameter(parameterInfo.mapKey(), limit) .build(); } From f1ff0abe70a90f69a3735d623bc84c804c6d9a40 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 17:18:23 -0400 Subject: [PATCH 09/20] Add a utility method to calculate parameter info with a column --- .../GeneralInsertValuePhraseVisitor.java | 14 ++------- .../dynamic/sql/render/RenderingContext.java | 25 +++++++++------- .../select/render/JoinConditionRenderer.java | 10 +++---- .../LimitAndOffsetPagingModelRenderer.java | 23 ++++++-------- .../sql/update/render/SetPhraseVisitor.java | 13 ++------ .../where/render/DefaultConditionVisitor.java | 30 ++++++++----------- 6 files changed, 46 insertions(+), 69 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java index 33e628984..c18085d63 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java @@ -18,7 +18,6 @@ import java.util.Objects; import java.util.Optional; -import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.ConstantMapping; @@ -83,18 +82,11 @@ private Optional buildNullFragment(AbstractColumnMap } private Optional buildFragment(AbstractColumnMapping mapping, Object value) { - String mapKey = renderingContext.nextMapKey(); - - String jdbcPlaceholder = mapping.mapColumn(c -> calculateJdbcPlaceholder(c, mapKey)); + RenderingContext.ParameterInfo parameterInfo = mapping.mapColumn(renderingContext::calculateParameterInfo); return FieldAndValueAndParameters.withFieldName(mapping.columnName()) - .withValuePhrase(jdbcPlaceholder) - .withParameter(mapKey, value) + .withValuePhrase(parameterInfo.renderedPlaceHolder()) + .withParameter(parameterInfo.mapKey(), value) .buildOptional(); } - - private String calculateJdbcPlaceholder(SqlColumn column, String mapKey) { - return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); - } } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index ea9171720..b3c393966 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -15,6 +15,8 @@ */ package org.mybatis.dynamic.sql.render; +import org.mybatis.dynamic.sql.BindableColumn; + import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -38,19 +40,11 @@ private RenderingContext(Builder builder) { } } - public RenderingStrategy renderingStrategy() { - return renderingStrategy; - } - public TableAliasCalculator tableAliasCalculator() { return tableAliasCalculator; } - public String parameterName() { - return calculatedParameterName; - } - - public String nextMapKey() { + private String nextMapKey() { return renderingStrategy.formatParameterMapKey(sequence); } @@ -58,6 +52,11 @@ private String renderedPlaceHolder(String mapKey) { return renderingStrategy.getFormattedJdbcPlaceholder(calculatedParameterName, mapKey); } + private String renderedPlaceHolder(String mapKey, BindableColumn column) { + return column.renderingStrategy().orElse(renderingStrategy) + .getFormattedJdbcPlaceholder(column, calculatedParameterName, mapKey); + } + public ParameterInfo calculateParameterInfo() { ParameterInfo p = new ParameterInfo(); p.mapKey = nextMapKey(); @@ -65,9 +64,15 @@ public ParameterInfo calculateParameterInfo() { return p; } + public ParameterInfo calculateParameterInfo(BindableColumn column) { + ParameterInfo p = new ParameterInfo(); + p.mapKey = nextMapKey(); + p.renderedPlaceHolder = renderedPlaceHolder(p.mapKey, column); + return p; + } + /** * Crete a new rendering context based on this, with the specified table alias calculator. - * * This is used by the query expression renderer when the alias calculator may change during rendering. * * @param tableAliasCalculator the new table alias calculator diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java index 1c08d93d5..0c33a5496 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java @@ -38,13 +38,11 @@ private JoinConditionRenderer(Builder builder) { @Override public FragmentAndParameters visit(TypedJoinCondition condition) { - String mapKey = renderingContext.nextMapKey(); + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(leftColumn); - String placeHolder = leftColumn.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(leftColumn, renderingContext.parameterName(), mapKey); - - return FragmentAndParameters.withFragment(condition.operator() + spaceBefore(placeHolder)) - .withParameter(mapKey, condition.value()) + return FragmentAndParameters + .withFragment(condition.operator() + spaceBefore(parameterInfo.renderedPlaceHolder())) + .withParameter(parameterInfo.mapKey(), condition.value()) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java index dfb5621a6..25b32767e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/LimitAndOffsetPagingModelRenderer.java @@ -39,24 +39,19 @@ public FragmentAndParameters render() { } private FragmentAndParameters renderLimitOnly() { - String mapKey = renderingContext.nextMapKey(); - return FragmentAndParameters.withFragment("limit " + renderPlaceholder(mapKey)) //$NON-NLS-1$ - .withParameter(mapKey, limit) + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(); + return FragmentAndParameters.withFragment("limit " + parameterInfo.renderedPlaceHolder()) //$NON-NLS-1$ + .withParameter(parameterInfo.mapKey(), limit) .build(); } private FragmentAndParameters renderLimitAndOffset(Long offset) { - String mapKey1 = renderingContext.nextMapKey(); - String mapKey2 = renderingContext.nextMapKey(); - return FragmentAndParameters.withFragment("limit " + renderPlaceholder(mapKey1) //$NON-NLS-1$ - + " offset " + renderPlaceholder(mapKey2)) //$NON-NLS-1$ - .withParameter(mapKey1, limit) - .withParameter(mapKey2, offset) + RenderingContext.ParameterInfo parameterInfo1 = renderingContext.calculateParameterInfo(); + RenderingContext.ParameterInfo parameterInfo2 = renderingContext.calculateParameterInfo(); + return FragmentAndParameters.withFragment("limit " + parameterInfo1.renderedPlaceHolder() //$NON-NLS-1$ + + " offset " + parameterInfo2.renderedPlaceHolder()) //$NON-NLS-1$ + .withParameter(parameterInfo1.mapKey(), limit) + .withParameter(parameterInfo2.mapKey(), offset) .build(); } - - private String renderPlaceholder(String mapKey) { - return renderingContext.renderingStrategy() - .getFormattedJdbcPlaceholder(renderingContext.parameterName(), mapKey); - } } diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java index 9dc797478..a835a3e3b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java @@ -124,20 +124,13 @@ public Optional visit(ColumnToColumnMapping mapping) { } private Optional buildFragment(AbstractColumnMapping mapping, T value) { - String mapKey = renderingContext.nextMapKey(); - - String jdbcPlaceholder = mapping.mapColumn(c -> calculateJdbcPlaceholder(c, mapKey)); + RenderingContext.ParameterInfo parameterInfo = mapping.mapColumn(renderingContext::calculateParameterInfo); String setPhrase = mapping.mapColumn(aliasedColumnNameFunction) + " = " //$NON-NLS-1$ - + jdbcPlaceholder; + + parameterInfo.renderedPlaceHolder(); return FragmentAndParameters.withFragment(setPhrase) - .withParameter(mapKey, value) + .withParameter(parameterInfo.mapKey(), value) .buildOptional(); } - - private String calculateJdbcPlaceholder(SqlColumn column, String mapKey) { - return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); - } } diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java index ddad057ac..9c5b277d4 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java @@ -75,13 +75,13 @@ public FragmentAndParameters visit(AbstractNoValueCondition condition) { @Override public FragmentAndParameters visit(AbstractSingleValueCondition condition) { FragmentAndParameters renderedLeftColumn = column.render(renderingContext); - String mapKey = renderingContext.nextMapKey(); + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(column); String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment()) + spaceBefore(condition.operator()) - + spaceBefore(getFormattedJdbcPlaceholder(mapKey)); + + spaceBefore(parameterInfo.renderedPlaceHolder()); return FragmentAndParameters.withFragment(finalFragment) - .withParameter(mapKey, convertValue(condition.value())) + .withParameter(parameterInfo.mapKey(), convertValue(condition.value())) .withParameters(renderedLeftColumn.parameters()) .build(); } @@ -89,18 +89,18 @@ public FragmentAndParameters visit(AbstractSingleValueCondition condition) { @Override public FragmentAndParameters visit(AbstractTwoValueCondition condition) { FragmentAndParameters renderedLeftColumn = column.render(renderingContext); - String mapKey1 = renderingContext.nextMapKey(); - String mapKey2 = renderingContext.nextMapKey(); + RenderingContext.ParameterInfo parameterInfo1 = renderingContext.calculateParameterInfo(column); + RenderingContext.ParameterInfo parameterInfo2 = renderingContext.calculateParameterInfo(column); String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment()) + spaceBefore(condition.operator1()) - + spaceBefore(getFormattedJdbcPlaceholder(mapKey1)) + + spaceBefore(parameterInfo1.renderedPlaceHolder()) + spaceBefore(condition.operator2()) - + spaceBefore(getFormattedJdbcPlaceholder(mapKey2)); + + spaceBefore(parameterInfo2.renderedPlaceHolder()); return FragmentAndParameters.withFragment(finalFragment) - .withParameter(mapKey1, convertValue(condition.value1())) - .withParameter(mapKey2, convertValue(condition.value2())) + .withParameter(parameterInfo1.mapKey(), convertValue(condition.value1())) + .withParameter(parameterInfo2.mapKey(), convertValue(condition.value2())) .withParameters(renderedLeftColumn.parameters()) .build(); } @@ -143,18 +143,12 @@ private Object convertValue(T value) { } private FragmentAndParameters toFragmentAndParameters(T value) { - String mapKey = renderingContext.nextMapKey(); - - return FragmentAndParameters.withFragment(getFormattedJdbcPlaceholder(mapKey)) - .withParameter(mapKey, convertValue(value)) + RenderingContext.ParameterInfo parameterInfo = renderingContext.calculateParameterInfo(column); + return FragmentAndParameters.withFragment(parameterInfo.renderedPlaceHolder()) + .withParameter(parameterInfo.mapKey(), convertValue(value)) .build(); } - private String getFormattedJdbcPlaceholder(String mapKey) { - return column.renderingStrategy().orElse(renderingContext.renderingStrategy()) - .getFormattedJdbcPlaceholder(column, renderingContext.parameterName(), mapKey); - } - public static Builder withColumn(BindableColumn column) { return new Builder().withColumn(column); } From ffc7f14a286d3ef2ede3b7b30bec901a93ae104d Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 17:48:54 -0400 Subject: [PATCH 10/20] Add a utility method to calculate aliased column names --- .../org/mybatis/dynamic/sql/SqlColumn.java | 30 ++++++++----------- .../dynamic/sql/render/RenderingContext.java | 7 +++++ .../sql/update/render/SetPhraseVisitor.java | 21 +++++-------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java index 59e69b050..976667622 100644 --- a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java @@ -18,12 +18,10 @@ import java.sql.JDBCType; import java.util.Objects; import java.util.Optional; -import java.util.function.BiFunction; import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.render.TableAliasCalculator; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.StringUtilities; @@ -37,7 +35,7 @@ public class SqlColumn implements BindableColumn, SortSpecification { protected final String typeHandler; protected final RenderingStrategy renderingStrategy; protected final ParameterTypeConverter parameterTypeConverter; - protected final BiFunction> tableQualifierFunction; + protected final String tableQualifier; protected final Class javaType; private SqlColumn(Builder builder) { @@ -49,7 +47,7 @@ private SqlColumn(Builder builder) { typeHandler = builder.typeHandler; renderingStrategy = builder.renderingStrategy; parameterTypeConverter = builder.parameterTypeConverter; - tableQualifierFunction = Objects.requireNonNull(builder.tableQualifierFunction); + tableQualifier = builder.tableQualifier; javaType = builder.javaType; } @@ -107,7 +105,7 @@ public SqlColumn as(String alias) { */ public SqlColumn qualifiedWith(String tableQualifier) { Builder b = copy(); - b.withTableQualifierFunction((tac, t) -> Optional.of(tableQualifier)); + b.withTableQualifier(tableQualifier); return b.build(); } @@ -117,7 +115,7 @@ public SqlColumn qualifiedWith(String tableQualifier) { * a map based on the column name returned from the database. * *

A camel case string is mixed case, and most databases do not support unquoted mixed case strings - * as identifiers. Therefore the generated alias will be surrounded by double quotes thereby making it a + * as identifiers. Therefore, the generated alias will be surrounded by double quotes thereby making it a * quoted identifier. Most databases will respect quoted mixed case identifiers. * * @return a new column aliased with a camel case version of the column name @@ -139,11 +137,11 @@ public String orderByName() { @Override public FragmentAndParameters render(RenderingContext renderingContext) { - String fragment = tableQualifierFunction.apply(renderingContext.tableAliasCalculator(), table) - .map(this::applyTableAlias) - .orElseGet(this::name); - - return FragmentAndParameters.fromFragment(fragment); + if (tableQualifier == null) { + return FragmentAndParameters.fromFragment(renderingContext.aliasedColumnName(this)); + } else { + return FragmentAndParameters.fromFragment(applyTableAlias(tableQualifier)); + } } @Override @@ -195,7 +193,7 @@ private Builder copy() { .withTypeHandler(this.typeHandler) .withRenderingStrategy(this.renderingStrategy) .withParameterTypeConverter((ParameterTypeConverter) this.parameterTypeConverter) - .withTableQualifierFunction(this.tableQualifierFunction) + .withTableQualifier(this.tableQualifier) .withJavaType((Class) this.javaType); } @@ -225,8 +223,7 @@ public static class Builder { protected String typeHandler; protected RenderingStrategy renderingStrategy; protected ParameterTypeConverter parameterTypeConverter; - protected BiFunction> tableQualifierFunction = - TableAliasCalculator::aliasForColumn; + protected String tableQualifier; protected Class javaType; public Builder withName(String name) { @@ -269,9 +266,8 @@ public Builder withParameterTypeConverter(ParameterTypeConverter parame return this; } - private Builder withTableQualifierFunction( - BiFunction> tableQualifierFunction) { - this.tableQualifierFunction = tableQualifierFunction; + private Builder withTableQualifier(String tableQualifier) { + this.tableQualifier = tableQualifier; return this; } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index b3c393966..8d6517768 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -16,6 +16,7 @@ package org.mybatis.dynamic.sql.render; import org.mybatis.dynamic.sql.BindableColumn; +import org.mybatis.dynamic.sql.SqlColumn; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -71,6 +72,12 @@ public ParameterInfo calculateParameterInfo(BindableColumn column) { return p; } + public String aliasedColumnName(SqlColumn column) { + return tableAliasCalculator.aliasForColumn(column.table()) + .map(alias -> alias + "." + column.name()) //$NON-NLS-1$ + .orElseGet(column::name); + } + /** * Crete a new rendering context based on this, with the specified table alias calculator. * This is used by the query expression renderer when the alias calculator may change during rendering. diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java index a835a3e3b..1d855c5e3 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java @@ -17,9 +17,7 @@ import java.util.Objects; import java.util.Optional; -import java.util.function.Function; -import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; @@ -37,34 +35,29 @@ public class SetPhraseVisitor extends UpdateMappingVisitor> { - private final Function, String> aliasedColumnNameFunction; private final RenderingContext renderingContext; public SetPhraseVisitor(RenderingContext renderingContext) { - aliasedColumnNameFunction = c -> renderingContext.tableAliasCalculator().aliasForColumn(c.table()) - .map(alias -> alias + "." + c.name()) //$NON-NLS-1$ - .orElseGet(c::name); - this.renderingContext = Objects.requireNonNull(renderingContext); } @Override public Optional visit(NullMapping mapping) { return FragmentAndParameters - .withFragment(mapping.mapColumn(aliasedColumnNameFunction) + " = null") //$NON-NLS-1$ + .withFragment(mapping.mapColumn(renderingContext::aliasedColumnName) + " = null") //$NON-NLS-1$ .buildOptional(); } @Override public Optional visit(ConstantMapping mapping) { - String fragment = mapping.mapColumn(aliasedColumnNameFunction) + " = " + mapping.constant(); //$NON-NLS-1$ + String fragment = mapping.mapColumn(renderingContext::aliasedColumnName) + " = " + mapping.constant(); //$NON-NLS-1$ return FragmentAndParameters.withFragment(fragment) .buildOptional(); } @Override public Optional visit(StringConstantMapping mapping) { - String fragment = mapping.mapColumn(aliasedColumnNameFunction) + String fragment = mapping.mapColumn(renderingContext::aliasedColumnName) + " = '" //$NON-NLS-1$ + mapping.constant() + "'"; //$NON-NLS-1$ @@ -83,7 +76,7 @@ public Optional visit(ValueOrNullMapping mapping) return mapping.value() .map(v -> buildFragment(mapping, v)) .orElseGet(() -> FragmentAndParameters - .withFragment(mapping.mapColumn(aliasedColumnNameFunction) + " = null") //$NON-NLS-1$ + .withFragment(mapping.mapColumn(renderingContext::aliasedColumnName) + " = null") //$NON-NLS-1$ .buildOptional() ); } @@ -100,7 +93,7 @@ public Optional visit(SelectMapping mapping) { .build() .render(); - String fragment = mapping.mapColumn(aliasedColumnNameFunction) + String fragment = mapping.mapColumn(renderingContext::aliasedColumnName) + " = (" //$NON-NLS-1$ + selectStatement.getSelectStatement() + ")"; //$NON-NLS-1$ @@ -114,7 +107,7 @@ public Optional visit(SelectMapping mapping) { public Optional visit(ColumnToColumnMapping mapping) { FragmentAndParameters renderedColumn = mapping.rightColumn().render(renderingContext); - String setPhrase = mapping.mapColumn(aliasedColumnNameFunction) + String setPhrase = mapping.mapColumn(renderingContext::aliasedColumnName) + " = " //$NON-NLS-1$ + renderedColumn.fragment(); @@ -125,7 +118,7 @@ public Optional visit(ColumnToColumnMapping mapping) { private Optional buildFragment(AbstractColumnMapping mapping, T value) { RenderingContext.ParameterInfo parameterInfo = mapping.mapColumn(renderingContext::calculateParameterInfo); - String setPhrase = mapping.mapColumn(aliasedColumnNameFunction) + String setPhrase = mapping.mapColumn(renderingContext::aliasedColumnName) + " = " //$NON-NLS-1$ + parameterInfo.renderedPlaceHolder(); From 2c33ef486119a56241e5415427f02db69c90ab14 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 17:55:07 -0400 Subject: [PATCH 11/20] Add a utility method to calculate aliased table names --- .../dynamic/sql/delete/render/DeleteRenderer.java | 8 +------- .../dynamic/sql/render/RenderingContext.java | 13 +++++++++++-- .../sql/select/render/TableExpressionRenderer.java | 5 +---- .../dynamic/sql/update/render/UpdateRenderer.java | 8 +------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java index c0130ca0b..7191b39cf 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java @@ -19,7 +19,6 @@ import java.util.Optional; import java.util.stream.Collectors; -import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; import org.mybatis.dynamic.sql.delete.DeleteModel; @@ -32,8 +31,6 @@ import org.mybatis.dynamic.sql.where.WhereModel; import org.mybatis.dynamic.sql.where.render.WhereRenderer; -import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; - public class DeleteRenderer { private final DeleteModel deleteModel; private final RenderingContext renderingContext; @@ -68,10 +65,7 @@ private DeleteStatementProvider toDeleteStatementProvider(FragmentCollector frag } private FragmentAndParameters calculateDeleteStatementStart() { - SqlTable table = deleteModel.table(); - String aliasedTableName = renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) - .orElseGet(table::tableNameAtRuntime); + String aliasedTableName = renderingContext.aliasedTableName(deleteModel.table()); return FragmentAndParameters.fromFragment("delete from " + aliasedTableName); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index 8d6517768..db0bc329b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -15,12 +15,15 @@ */ package org.mybatis.dynamic.sql.render; -import org.mybatis.dynamic.sql.BindableColumn; -import org.mybatis.dynamic.sql.SqlColumn; +import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; +import org.mybatis.dynamic.sql.BindableColumn; +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + public class RenderingContext { private final AtomicInteger sequence; @@ -78,6 +81,12 @@ public String aliasedColumnName(SqlColumn column) { .orElseGet(column::name); } + public String aliasedTableName(SqlTable table) { + return tableAliasCalculator.aliasForTable(table) + .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) + .orElseGet(table::tableNameAtRuntime); + } + /** * Crete a new rendering context based on this, with the specified table alias calculator. * This is used by the query expression renderer when the alias calculator may change during rendering. diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java index 639c1d8ea..2007e6387 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/TableExpressionRenderer.java @@ -34,10 +34,7 @@ private TableExpressionRenderer(Builder builder) { @Override public FragmentAndParameters visit(SqlTable table) { - return FragmentAndParameters.fromFragment( - renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) - .orElseGet(table::tableNameAtRuntime)); + return FragmentAndParameters.fromFragment(renderingContext.aliasedTableName(table)); } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index f4f91116b..d759a20f8 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -20,7 +20,6 @@ import java.util.Optional; import java.util.stream.Collectors; -import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; import org.mybatis.dynamic.sql.exception.InvalidSqlException; @@ -35,8 +34,6 @@ import org.mybatis.dynamic.sql.where.WhereModel; import org.mybatis.dynamic.sql.where.render.WhereRenderer; -import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; - public class UpdateRenderer { private final UpdateModel updateModel; private final RenderingContext renderingContext; @@ -72,10 +69,7 @@ private UpdateStatementProvider toUpdateStatementProvider(FragmentCollector frag } private FragmentAndParameters calculateUpdateStatementStart() { - SqlTable table = updateModel.table(); - String aliasedTableName = renderingContext.tableAliasCalculator().aliasForTable(table) - .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) - .orElseGet(table::tableNameAtRuntime); + String aliasedTableName = renderingContext.aliasedTableName(updateModel.table()); return FragmentAndParameters.fromFragment("update " + aliasedTableName); //$NON-NLS-1$ } From 0d1889a32ad2f484d0b0ab4f9a5cddc0331fc988 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 18:06:11 -0400 Subject: [PATCH 12/20] Add a utility method to calculate a parent/child table alias calculator --- .../dynamic/sql/render/RenderingContext.java | 19 +++++++++++++------ .../render/QueryExpressionRenderer.java | 17 ++++------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index db0bc329b..51504cdf7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -88,17 +88,24 @@ public String aliasedTableName(SqlTable table) { } /** - * Crete a new rendering context based on this, with the specified table alias calculator. - * This is used by the query expression renderer when the alias calculator may change during rendering. + * Crete a new rendering context based on this, with the table alias calculator modified to include the + * specified child table alias calculator. This is used by the query expression renderer when the alias calculator + * may change during rendering. * - * @param tableAliasCalculator the new table alias calculator - * @return a new table alias calculator based on this with an overridden tableAliasCalculator + * @param childTableAliasCalculator the child table alias calculator + * @return a new rendering context whose table alias calculator is composed of the former calculator as parent, and + * the new child calculator */ - public RenderingContext withTableAliasCalculator(TableAliasCalculator tableAliasCalculator) { + public RenderingContext withChildTableAliasCalculator(TableAliasCalculator childTableAliasCalculator) { + TableAliasCalculator tac = new TableAliasCalculatorWithParent.Builder() + .withParent(tableAliasCalculator) + .withChild(childTableAliasCalculator) + .build(); + return new Builder() .withRenderingStrategy(this.renderingStrategy) .withParameterName(this.builderParameterName) - .withTableAliasCalculator(tableAliasCalculator) + .withTableAliasCalculator(tac) .withSequence(this.sequence) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java index 2167eb839..015b6f096 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java @@ -25,7 +25,6 @@ import org.mybatis.dynamic.sql.render.GuaranteedTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.TableAliasCalculator; -import org.mybatis.dynamic.sql.render.TableAliasCalculatorWithParent; import org.mybatis.dynamic.sql.select.GroupByModel; import org.mybatis.dynamic.sql.select.HavingModel; import org.mybatis.dynamic.sql.select.QueryExpressionModel; @@ -43,10 +42,9 @@ public class QueryExpressionRenderer { private QueryExpressionRenderer(Builder builder) { queryExpression = Objects.requireNonNull(builder.queryExpression); - TableAliasCalculator tableAliasCalculator = - calculateTableAliasCalculator(queryExpression, builder.renderingContext.tableAliasCalculator()); + TableAliasCalculator childTableAliasCalculator = calculateChildTableAliasCalculator(queryExpression); - renderingContext = builder.renderingContext.withTableAliasCalculator(tableAliasCalculator); + renderingContext = builder.renderingContext.withChildTableAliasCalculator(childTableAliasCalculator); tableExpressionRenderer = new TableExpressionRenderer.Builder() .withRenderingContext(renderingContext) @@ -74,20 +72,13 @@ private QueryExpressionRenderer(Builder builder) { * * * @param queryExpression the model to render - * @param parentTableAliasCalculator table alias calculator from the parent query * @return a table alias calculator appropriate for this context */ - private TableAliasCalculator calculateTableAliasCalculator(QueryExpressionModel queryExpression, - TableAliasCalculator parentTableAliasCalculator) { - TableAliasCalculator baseTableAliasCalculator = queryExpression.joinModel() + private TableAliasCalculator calculateChildTableAliasCalculator(QueryExpressionModel queryExpression) { + return queryExpression.joinModel() .map(JoinModel::containsSubQueries) .map(this::calculateTableAliasCalculatorWithJoins) .orElseGet(this::explicitTableAliasCalculator); - - return new TableAliasCalculatorWithParent.Builder() - .withParent(parentTableAliasCalculator) - .withChild(baseTableAliasCalculator) - .build(); } private TableAliasCalculator calculateTableAliasCalculatorWithJoins(boolean hasSubQueries) { From 5f06d6b4e3346e9c43dc7c9a987da7cafbff91f5 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 28 Aug 2023 18:08:21 -0400 Subject: [PATCH 13/20] Documentation --- src/main/java/org/mybatis/dynamic/sql/BasicColumn.java | 1 + .../java/org/mybatis/dynamic/sql/render/RenderingContext.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java b/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java index 1c848ff88..4f194be79 100644 --- a/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java @@ -62,6 +62,7 @@ public interface BasicColumn { default FragmentAndParameters render(RenderingContext renderingContext) { // the default implementation ensures compatibility with prior releases. When the // deprecated renderWithTableAlias method is removed, this function can become purely abstract. + // Also remove the method tableAliasCalculator() from RenderingContext. return FragmentAndParameters.fromFragment(renderWithTableAlias(renderingContext.tableAliasCalculator())); } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index 51504cdf7..e43cd5451 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -45,6 +45,7 @@ private RenderingContext(Builder builder) { } public TableAliasCalculator tableAliasCalculator() { + // this method can be removed when the renderWithTableAlias method is removed from BasicColumn return tableAliasCalculator; } From e44695fabb66ba92ed39792e52432a0b6e767198 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 10:27:53 -0400 Subject: [PATCH 14/20] Add utility method for rendering column with explicit alias --- .../org/mybatis/dynamic/sql/SqlColumn.java | 6 +--- .../dynamic/sql/render/RenderingContext.java | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java index 976667622..1095f1144 100644 --- a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java @@ -140,7 +140,7 @@ public FragmentAndParameters render(RenderingContext renderingContext) { if (tableQualifier == null) { return FragmentAndParameters.fromFragment(renderingContext.aliasedColumnName(this)); } else { - return FragmentAndParameters.fromFragment(applyTableAlias(tableQualifier)); + return FragmentAndParameters.fromFragment(renderingContext.aliasedColumnName(this, tableQualifier)); } } @@ -197,10 +197,6 @@ private Builder copy() { .withJavaType((Class) this.javaType); } - private String applyTableAlias(String tableAlias) { - return tableAlias + "." + name(); //$NON-NLS-1$ - } - public static SqlColumn of(String name, SqlTable table) { return new Builder().withName(name) .withTable(table) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index e43cd5451..d15ae581d 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -24,26 +24,32 @@ import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.SqlTable; +/** + * This class encapsulates all the supporting items related to rendering, and contains many utility methods + * used during the rendering process. + * + * @since 1.5.1 + * @author Jeff Butler + */ public class RenderingContext { private final AtomicInteger sequence; private final RenderingStrategy renderingStrategy; private final TableAliasCalculator tableAliasCalculator; - private final String builderParameterName; + private final String configuredParameterName; private final String calculatedParameterName; private RenderingContext(Builder builder) { - sequence = Objects.requireNonNull(builder.sequence); + this.sequence = builder.sequence == null ? new AtomicInteger(1) : builder.sequence; renderingStrategy = Objects.requireNonNull(builder.renderingStrategy); tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator); - builderParameterName = builder.parameterName; - if (builderParameterName == null) { + configuredParameterName = builder.parameterName; + if (configuredParameterName == null) { calculatedParameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; } else { - calculatedParameterName = builderParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ + calculatedParameterName = configuredParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ } } - public TableAliasCalculator tableAliasCalculator() { // this method can be removed when the renderWithTableAlias method is removed from BasicColumn return tableAliasCalculator; @@ -78,10 +84,14 @@ public ParameterInfo calculateParameterInfo(BindableColumn column) { public String aliasedColumnName(SqlColumn column) { return tableAliasCalculator.aliasForColumn(column.table()) - .map(alias -> alias + "." + column.name()) //$NON-NLS-1$ + .map(alias -> aliasedColumnName(column, alias)) .orElseGet(column::name); } + public String aliasedColumnName(SqlColumn column, String explicitAlias) { + return explicitAlias + "." + column.name(); //$NON-NLS-1$ + } + public String aliasedTableName(SqlTable table) { return tableAliasCalculator.aliasForTable(table) .map(a -> table.tableNameAtRuntime() + spaceBefore(a)) @@ -105,9 +115,9 @@ public RenderingContext withChildTableAliasCalculator(TableAliasCalculator child return new Builder() .withRenderingStrategy(this.renderingStrategy) - .withParameterName(this.builderParameterName) - .withTableAliasCalculator(tac) .withSequence(this.sequence) + .withParameterName(this.configuredParameterName) + .withTableAliasCalculator(tac) .build(); } @@ -116,7 +126,7 @@ public static Builder withRenderingStrategy(RenderingStrategy renderingStrategy) } public static class Builder { - private AtomicInteger sequence = new AtomicInteger(1); + private AtomicInteger sequence; private RenderingStrategy renderingStrategy; private TableAliasCalculator tableAliasCalculator = TableAliasCalculator.empty(); private String parameterName; From 23e94f8224b97c7505956d664cbbc237020a5d15 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 10:49:50 -0400 Subject: [PATCH 15/20] Small optimizations --- .../sql/select/render/JoinConditionRenderer.java | 6 +----- .../dynamic/sql/select/render/JoinRenderer.java | 6 +----- .../sql/select/render/QueryExpressionRenderer.java | 14 +++++++------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java index 0c33a5496..f0bc03640 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java @@ -48,17 +48,13 @@ public FragmentAndParameters visit(TypedJoinCondition condition) { @Override public FragmentAndParameters visit(ColumnBasedJoinCondition condition) { - FragmentAndParameters renderedColumn = applyTableAlias(condition.rightColumn()); + FragmentAndParameters renderedColumn = condition.rightColumn().render(renderingContext); return FragmentAndParameters .withFragment(condition.operator() + spaceBefore(renderedColumn.fragment())) .withParameters(renderedColumn.parameters()) .build(); } - private FragmentAndParameters applyTableAlias(BasicColumn column) { - return column.render(renderingContext); - } - public static class Builder { private BindableColumn leftColumn; private RenderingContext renderingContext; diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java index 90a20d3a7..ded390080 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java @@ -73,7 +73,7 @@ private FragmentAndParameters renderConditions(JoinSpecification joinSpecificati } private FragmentAndParameters renderCriterion(JoinCriterion joinCriterion) { - FragmentAndParameters renderedColumn = applyTableAlias(joinCriterion.leftColumn()); + FragmentAndParameters renderedColumn = joinCriterion.leftColumn().render(renderingContext); String prefix = joinCriterion.connector() + spaceBefore(renderedColumn.fragment()); @@ -91,10 +91,6 @@ private FragmentAndParameters renderCriterion(JoinCriterion joinCriterion .build(); } - private FragmentAndParameters applyTableAlias(BasicColumn column) { - return column.render(renderingContext); - } - public static Builder withJoinModel(JoinModel joinModel) { return new Builder().withJoinModel(joinModel); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java index 015b6f096..8a54794e7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java @@ -138,7 +138,7 @@ private FragmentAndParameters calculateQueryExpressionStart() { } private FragmentAndParameters calculateColumnList() { - FragmentCollector fc = queryExpression.mapColumns(this::applyTableAndColumnAlias) + FragmentCollector fc = queryExpression.mapColumns(this::renderColumnAndAlias) .collect(FragmentCollector.collect()); String s = fc.collectFragments(Collectors.joining(", ")); //$NON-NLS-1$ @@ -148,7 +148,7 @@ private FragmentAndParameters calculateColumnList() { .build(); } - private FragmentAndParameters applyTableAndColumnAlias(BasicColumn selectListItem) { + private FragmentAndParameters renderColumnAndAlias(BasicColumn selectListItem) { FragmentAndParameters renderedColumn = selectListItem.render(renderingContext); String nameAndTableAlias = selectListItem.alias().map(a -> renderedColumn.fragment() + " as " + a) //$NON-NLS-1$ @@ -191,7 +191,7 @@ private Optional calculateGroupByClause() { } private FragmentAndParameters renderGroupBy(GroupByModel groupByModel) { - FragmentCollector fc = groupByModel.mapColumns(this::applyTableAlias) + FragmentCollector fc = groupByModel.mapColumns(this::renderColumn) .collect(FragmentCollector.collect()); String groupBy = fc.collectFragments( Collectors.joining(", ", "group by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$) @@ -201,6 +201,10 @@ private FragmentAndParameters renderGroupBy(GroupByModel groupByModel) { .build(); } + private FragmentAndParameters renderColumn(BasicColumn column) { + return column.render(renderingContext); + } + private Optional calculateHavingClause() { return queryExpression.havingModel().flatMap(this::renderHavingClause); } @@ -212,10 +216,6 @@ private Optional renderHavingClause(HavingModel havingMod .render(); } - private FragmentAndParameters applyTableAlias(BasicColumn column) { - return column.render(renderingContext); - } - public static Builder withQueryExpression(QueryExpressionModel model) { return new Builder().withQueryExpression(model); } From 86da34175de78e87a4e5e662389ce1ec6757895f Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 10:52:02 -0400 Subject: [PATCH 16/20] Small optimizations --- .../mybatis/dynamic/sql/select/render/JoinConditionRenderer.java | 1 - .../java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java index f0bc03640..2b95cd669 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinConditionRenderer.java @@ -19,7 +19,6 @@ import java.util.Objects; -import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.join.ColumnBasedJoinCondition; diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java index ded390080..5904c2a74 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java @@ -20,7 +20,6 @@ import java.util.Objects; import java.util.stream.Collectors; -import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.join.JoinCriterion; import org.mybatis.dynamic.sql.select.join.JoinModel; From 3aa0517092ee32ae25c5b955f088adb376d96fb7 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 14:07:12 -0400 Subject: [PATCH 17/20] Functions cannot support optional conditions that fail to render --- .../mybatis/dynamic/sql/select/aggregate/Sum.java | 6 ++++++ .../mybatis/dynamic/sql/util/messages.properties | 1 + src/test/java/issues/gh655/Gh655Test.java | 15 +++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java index 628b166f2..96f100015 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java @@ -17,9 +17,11 @@ import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.VisitableCondition; +import org.mybatis.dynamic.sql.exception.DynamicSqlException; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; import org.mybatis.dynamic.sql.util.FragmentAndParameters; +import org.mybatis.dynamic.sql.util.Messages; import org.mybatis.dynamic.sql.where.render.DefaultConditionVisitor; public class Sum extends AbstractUniTypeFunction> { @@ -52,6 +54,10 @@ private FragmentAndParameters renderWithoutCondition(RenderingContext renderingC } private FragmentAndParameters renderWithCondition(RenderingContext renderingContext) { + if (!condition.shouldRender()) { + throw new DynamicSqlException(Messages.getString("ERROR.37", "sum")); //$NON-NLS-1$ //$NON-NLS-2$ + } + DefaultConditionVisitor visitor = new DefaultConditionVisitor.Builder() .withColumn(column) .withRenderingContext(renderingContext) diff --git a/src/main/resources/org/mybatis/dynamic/sql/util/messages.properties b/src/main/resources/org/mybatis/dynamic/sql/util/messages.properties index 5077820de..ee7cb72fa 100644 --- a/src/main/resources/org/mybatis/dynamic/sql/util/messages.properties +++ b/src/main/resources/org/mybatis/dynamic/sql/util/messages.properties @@ -53,4 +53,5 @@ ERROR.33=Calling "select" or "selectDistinct" more than once is not allowed. Add ERROR.34=You must specify "select" or "selectDistinct" before any other clauses in a multi-select statement ERROR.35=Multi-select statements must have at least one "union" or "union all" expression ERROR.36=You must either implement the "render" or "renderWithTableAlias" method in a column or function +ERROR.37=The "{0}" function does not support conditions that fail to render INTERNAL.ERROR=Internal Error {0} diff --git a/src/test/java/issues/gh655/Gh655Test.java b/src/test/java/issues/gh655/Gh655Test.java index ec6539354..74385d97f 100644 --- a/src/test/java/issues/gh655/Gh655Test.java +++ b/src/test/java/issues/gh655/Gh655Test.java @@ -17,9 +17,11 @@ import static examples.mariadb.ItemsDynamicSQLSupport.id; import static examples.mariadb.ItemsDynamicSQLSupport.items; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mybatis.dynamic.sql.SqlBuilder.add; import static org.mybatis.dynamic.sql.SqlBuilder.constant; import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent; import static org.mybatis.dynamic.sql.SqlBuilder.isGreaterThan; import static org.mybatis.dynamic.sql.SqlBuilder.select; import static org.mybatis.dynamic.sql.SqlBuilder.sum; @@ -34,7 +36,9 @@ import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.exception.DynamicSqlException; import org.mybatis.dynamic.sql.render.RenderingStrategies; +import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper; import org.testcontainers.containers.MariaDBContainer; @@ -81,6 +85,17 @@ void sumTest() { } } + @Test + void sumWithOptionalTest() { + SelectModel selectModel = select(sum(id, isEqualToWhenPresent((Integer) null)).as("numrows")) + .from(items) + .build(); + + assertThatExceptionOfType(DynamicSqlException.class) + .isThrownBy(() -> selectModel.render(RenderingStrategies.MYBATIS3)) + .withMessage("The \"sum\" function does not support conditions that fail to render"); + } + @Test void sumAndAddTest() { try (SqlSession session = sqlSessionFactory.openSession()) { From f760259f8fe510586bbb1cd8de58ef82900e4bbc Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 14:18:58 -0400 Subject: [PATCH 18/20] Checkstyle --- .../java/org/mybatis/dynamic/sql/render/RenderingContext.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index d15ae581d..42866b4af 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -47,7 +47,8 @@ private RenderingContext(Builder builder) { if (configuredParameterName == null) { calculatedParameterName = RenderingStrategy.DEFAULT_PARAMETER_PREFIX; } else { - calculatedParameterName = configuredParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ + calculatedParameterName = + configuredParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ } } public TableAliasCalculator tableAliasCalculator() { From c1f0333b964e4f75a497dafc07ff7e95f8096967 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 14:19:09 -0400 Subject: [PATCH 19/20] Small optimization --- .../mybatis/dynamic/sql/where/WhereModel.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java b/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java index 15a620936..d744cbbdf 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java @@ -54,11 +54,7 @@ public boolean isNonRenderingClauseAllowed() { public Optional render(RenderingStrategy renderingStrategy) { RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy).build(); - return WhereRenderer.withWhereModel(this) - .withRenderingContext(renderingContext) - .build() - .render() - .map(this::toWhereClauseProvider); + return render(renderingContext); } public Optional render(RenderingStrategy renderingStrategy, @@ -68,11 +64,7 @@ public Optional render(RenderingStrategy renderingStrategy, .withTableAliasCalculator(tableAliasCalculator) .build(); - return WhereRenderer.withWhereModel(this) - .withRenderingContext(renderingContext) - .build() - .render() - .map(this::toWhereClauseProvider); + return render(renderingContext); } public Optional render(RenderingStrategy renderingStrategy, String parameterName) { @@ -81,11 +73,7 @@ public Optional render(RenderingStrategy renderingStrategy, .withParameterName(parameterName) .build(); - return WhereRenderer.withWhereModel(this) - .withRenderingContext(renderingContext) - .build() - .render() - .map(this::toWhereClauseProvider); + return render(renderingContext); } public Optional render(RenderingStrategy renderingStrategy, @@ -96,6 +84,10 @@ public Optional render(RenderingStrategy renderingStrategy, .withParameterName(parameterName) .build(); + return render(renderingContext); + } + + private Optional render(RenderingContext renderingContext) { return WhereRenderer.withWhereModel(this) .withRenderingContext(renderingContext) .build() From 645e4d8d9e5996d4791c0bb598c88c56871575f5 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 29 Aug 2023 17:22:15 -0400 Subject: [PATCH 20/20] Checkstyle --- .../sql/insert/render/GeneralInsertValuePhraseVisitor.java | 1 + .../java/org/mybatis/dynamic/sql/render/RenderingContext.java | 1 + .../mybatis/dynamic/sql/update/render/SetPhraseVisitor.java | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java index c18085d63..86092cb8c 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java @@ -31,6 +31,7 @@ public class GeneralInsertValuePhraseVisitor extends GeneralInsertMappingVisitor> { private final RenderingContext renderingContext; + public GeneralInsertValuePhraseVisitor(RenderingContext renderingContext) { this.renderingContext = Objects.requireNonNull(renderingContext); } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index 42866b4af..96f8db794 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -51,6 +51,7 @@ private RenderingContext(Builder builder) { configuredParameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ } } + public TableAliasCalculator tableAliasCalculator() { // this method can be removed when the renderWithTableAlias method is removed from BasicColumn return tableAliasCalculator; diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java index 1d855c5e3..486b95f3f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java @@ -50,7 +50,8 @@ public Optional visit(NullMapping mapping) { @Override public Optional visit(ConstantMapping mapping) { - String fragment = mapping.mapColumn(renderingContext::aliasedColumnName) + " = " + mapping.constant(); //$NON-NLS-1$ + String fragment = mapping.mapColumn(renderingContext::aliasedColumnName) + + " = " + mapping.constant(); //$NON-NLS-1$ return FragmentAndParameters.withFragment(fragment) .buildOptional(); }