From 506d30e1c3fb169512f63e9c622503f277be8d89 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 18 Nov 2024 17:52:45 -0500 Subject: [PATCH 01/13] Use Fragment Mapping where it makes sense --- .../sql/select/render/QueryExpressionRenderer.java | 8 ++------ .../dynamic/sql/where/render/DefaultConditionVisitor.java | 8 ++------ src/test/java/examples/animal/data/Length.java | 7 ++----- src/test/java/examples/type_conversion/ToBase64.java | 7 ++----- 4 files changed, 8 insertions(+), 22 deletions(-) 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 0f3ddcb01..618ea2f9c 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 @@ -139,12 +139,8 @@ private FragmentAndParameters calculateColumnList() { private FragmentAndParameters renderColumnAndAlias(BasicColumn selectListItem) { FragmentAndParameters renderedColumn = selectListItem.render(renderingContext); - String nameAndTableAlias = selectListItem.alias().map(a -> renderedColumn.fragment() + " as " + a) //$NON-NLS-1$ - .orElse(renderedColumn.fragment()); - - return FragmentAndParameters.withFragment(nameAndTableAlias) - .withParameters(renderedColumn.parameters()) - .build(); + return selectListItem.alias().map(a -> renderedColumn.mapFragment(f -> f + " as " + a)) //$NON-NLS-1$ + .orElse(renderedColumn); } private FragmentAndParameters renderTableExpression(TableExpression table) { 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 9adda9f64..309a10f3b 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 @@ -109,12 +109,8 @@ public FragmentAndParameters visit(AbstractSubselectCondition condition) { @Override public FragmentAndParameters visit(AbstractColumnComparisonCondition condition) { - FragmentAndParameters renderedRightColumn = condition.rightColumn().render(renderingContext); - String finalFragment = condition.operator() - + spaceBefore(renderedRightColumn.fragment()); - return FragmentAndParameters.withFragment(finalFragment) - .withParameters(renderedRightColumn.parameters()) - .build(); + return condition.rightColumn().render(renderingContext) + .mapFragment(f -> condition.operator() + spaceBefore(f)); } private Object convertValue(T value) { diff --git a/src/test/java/examples/animal/data/Length.java b/src/test/java/examples/animal/data/Length.java index 6fb90e40d..34bb7f3c9 100644 --- a/src/test/java/examples/animal/data/Length.java +++ b/src/test/java/examples/animal/data/Length.java @@ -36,11 +36,8 @@ public Optional jdbcType() { @Override public FragmentAndParameters render(RenderingContext renderingContext) { - FragmentAndParameters renderedColumn = column.render(renderingContext); - - return FragmentAndParameters.withFragment("length(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$ - .withParameters(renderedColumn.parameters()) - .build(); + return column.render(renderingContext) + .mapFragment(f -> "length(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } @Override diff --git a/src/test/java/examples/type_conversion/ToBase64.java b/src/test/java/examples/type_conversion/ToBase64.java index ce5ab5891..42bfe40d1 100644 --- a/src/test/java/examples/type_conversion/ToBase64.java +++ b/src/test/java/examples/type_conversion/ToBase64.java @@ -37,11 +37,8 @@ public Optional jdbcType() { @Override public FragmentAndParameters render(RenderingContext renderingContext) { - FragmentAndParameters renderedColumn = column.render(renderingContext); - - return FragmentAndParameters.withFragment("TO_BASE64(" + renderedColumn.fragment() + ")") //$NON-NLS-1$ //$NON-NLS-2$ - .withParameters(renderedColumn.parameters()) - .build(); + return column.render(renderingContext) + .mapFragment(f -> "TO_BASE64(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } @Override From 283f0a5f281cdb604e4f637b84111cb800089cee Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 19 Nov 2024 10:27:56 -0500 Subject: [PATCH 02/13] SelectRenderer should return FragmentAndParameters Many usages of the select renderer are for sub queries - no need to build an intermediate statement provider in those cases. --- .../insert/render/InsertSelectRenderer.java | 8 +++---- .../dynamic/sql/render/RendererFactory.java | 3 ++- .../dynamic/sql/select/SelectModel.java | 9 +++++-- .../select/render/MultiSelectRenderer.java | 16 ++++--------- .../sql/select/render/SelectRenderer.java | 11 ++------- .../render/TableExpressionRenderer.java | 11 ++------- .../sql/update/render/SetPhraseVisitor.java | 24 ++++--------------- .../sql/where/render/CriterionRenderer.java | 14 ++--------- .../where/render/DefaultConditionVisitor.java | 13 ++-------- 9 files changed, 30 insertions(+), 79 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java index 16afe6767..3825d4e3d 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java @@ -27,7 +27,7 @@ import org.mybatis.dynamic.sql.insert.InsertSelectModel; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.StringUtilities; public class InsertSelectRenderer { @@ -43,18 +43,18 @@ private InsertSelectRenderer(Builder builder) { } public InsertSelectStatementProvider render() { - SelectStatementProvider selectStatement = model.selectModel().render(renderingContext); + FragmentAndParameters selectStatement = model.selectModel().render(renderingContext); String statementStart = InsertRenderingUtilities.calculateInsertStatementStart(model.table()); Optional columnsPhrase = calculateColumnsPhrase(); - String renderedSelectStatement = selectStatement.getSelectStatement(); + String renderedSelectStatement = selectStatement.fragment(); String insertStatement = statementStart + columnsPhrase.map(StringUtilities::spaceBefore).orElse("") //$NON-NLS-1$ + spaceBefore(renderedSelectStatement); return DefaultGeneralInsertStatementProvider.withInsertStatement(insertStatement) - .withParameters(selectStatement.getParameters()) + .withParameters(selectStatement.parameters()) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index c47ca1f78..0ac97d702 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -42,6 +42,7 @@ import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; +import org.mybatis.dynamic.sql.util.FragmentAndParameters; public interface RendererFactory { static Renderer createDeleteRenderer(DeleteModel deleteModel, @@ -105,7 +106,7 @@ static Renderer createMultiSelectRen .render(); } - static Renderer createSelectRenderer( + static Renderer createSelectRenderer( SelectModel selectModel) { return renderingContext -> SelectRenderer.withSelectModel(selectModel) .withRenderingContext(renderingContext) 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 85196be7b..3dff3162e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -24,7 +24,9 @@ import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.Validator; public class SelectModel extends AbstractSelectModel { @@ -45,7 +47,10 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) { RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy) .withStatementConfiguration(statementConfiguration) .build(); - return render(renderingContext); + FragmentAndParameters fragmentAndParameters = render(renderingContext); + return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) + .withParameters(fragmentAndParameters.parameters()) + .build(); } /** @@ -55,7 +60,7 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) { * @return a rendered select statement and parameters */ @NotNull - public SelectStatementProvider render(RenderingContext renderingContext) { + public FragmentAndParameters render(RenderingContext renderingContext) { return RendererFactory.createSelectRenderer(this).render(renderingContext); } 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 c063e7866..78d6ae8ff 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 @@ -65,21 +65,13 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag } private FragmentAndParameters renderSelect(SelectModel selectModel) { - SelectStatementProvider selectStatement = selectModel.render(renderingContext); - - return FragmentAndParameters - .withFragment("(" + selectStatement.getSelectStatement() + ")") //$NON-NLS-1$ //$NON-NLS-2$ - .withParameters(selectStatement.getParameters()) - .build(); + return selectModel.render(renderingContext) + .mapFragment(f -> "(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } private FragmentAndParameters renderSelect(UnionQuery unionQuery) { - SelectStatementProvider selectStatement = unionQuery.selectModel().render(renderingContext); - - return FragmentAndParameters.withFragment( - unionQuery.connector() + " (" + selectStatement.getSelectStatement() + ")") //$NON-NLS-1$ //$NON-NLS-2$ - .withParameters(selectStatement.getParameters()) - .build(); + return unionQuery.selectModel().render(renderingContext) + .mapFragment(f -> unionQuery.connector() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } private Optional renderOrderBy() { diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index 128ab3e8e..25e2e408b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -37,7 +37,7 @@ private SelectRenderer(Builder builder) { renderingContext = Objects.requireNonNull(builder.renderingContext); } - public SelectStatementProvider render() { + public FragmentAndParameters render() { FragmentCollector fragmentCollector = selectModel .queryExpressions() .map(this::renderQueryExpression) @@ -46,14 +46,7 @@ public SelectStatementProvider render() { renderOrderBy().ifPresent(fragmentCollector::add); renderPagingModel().ifPresent(fragmentCollector::add); - return toSelectStatementProvider(fragmentCollector); - } - - private SelectStatementProvider toSelectStatementProvider(FragmentCollector fragmentCollector) { - return DefaultSelectStatementProvider - .withSelectStatement(fragmentCollector.collectFragments(Collectors.joining(" "))) //$NON-NLS-1$ - .withParameters(fragmentCollector.parameters()) - .build(); + return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$ } private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { 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 ccb9b1d84..3ba013825 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 @@ -39,15 +39,8 @@ public FragmentAndParameters visit(SqlTable table) { @Override public FragmentAndParameters visit(SubQuery subQuery) { - SelectStatementProvider selectStatement = subQuery.selectModel().render(renderingContext); - - String fragment = "(" + selectStatement.getSelectStatement() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ - - fragment = applyAlias(fragment, subQuery); - - return FragmentAndParameters.withFragment(fragment) - .withParameters(selectStatement.getParameters()) - .build(); + return subQuery.selectModel().render(renderingContext) + .mapFragment(f -> applyAlias("(" + f + ")", subQuery)); //$NON-NLS-1$ //$NON-NLS-2$ } private String applyAlias(String fragment, SubQuery subQuery) { 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 07d955c80..77a898ea2 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 @@ -20,7 +20,6 @@ import org.mybatis.dynamic.sql.render.RenderedParameterInfo; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.ColumnToColumnMapping; import org.mybatis.dynamic.sql.util.ConstantMapping; @@ -84,28 +83,15 @@ public Optional visit(ValueWhenPresentMapping mapp @Override public Optional visit(SelectMapping mapping) { - SelectStatementProvider selectStatement = mapping.selectModel().render(renderingContext); - String fragment = renderingContext.aliasedColumnName(mapping.column()) - + " = (" //$NON-NLS-1$ - + selectStatement.getSelectStatement() - + ")"; //$NON-NLS-1$ - - return FragmentAndParameters.withFragment(fragment) - .withParameters(selectStatement.getParameters()) - .buildOptional(); + return Optional.of(mapping.selectModel().render(renderingContext) + .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) + + " = (" + f + ")")); //$NON-NLS-1$ //$NON-NLS-2$ } @Override public Optional visit(ColumnToColumnMapping mapping) { - FragmentAndParameters renderedColumn = mapping.rightColumn().render(renderingContext); - - String setPhrase = renderingContext.aliasedColumnName(mapping.column()) - + " = " //$NON-NLS-1$ - + renderedColumn.fragment(); - - return FragmentAndParameters.withFragment(setPhrase) - .withParameters(renderedColumn.parameters()) - .buildOptional(); + return Optional.of(mapping.rightColumn().render(renderingContext) + .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) + " = " + f)); //$NON-NLS-1$ } private Optional buildValueFragment(AbstractColumnMapping mapping, T value) { 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 0e4325179..f56fc3e79 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 @@ -30,7 +30,6 @@ import org.mybatis.dynamic.sql.SqlCriterion; import org.mybatis.dynamic.sql.SqlCriterionVisitor; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -120,17 +119,8 @@ private Optional renderColumnAndCondition(ColumnAndCo private FragmentAndParameters renderExists(ExistsCriterion criterion) { ExistsPredicate existsPredicate = criterion.existsPredicate(); - SelectStatementProvider selectStatement = existsPredicate.selectModelBuilder().build().render(renderingContext); - - String fragment = existsPredicate.operator() - + " (" //$NON-NLS-1$ - + selectStatement.getSelectStatement() - + ")"; //$NON-NLS-1$ - - return FragmentAndParameters - .withFragment(fragment) - .withParameters(selectStatement.getParameters()) - .build(); + return existsPredicate.selectModelBuilder().build().render(renderingContext) + .mapFragment(f -> existsPredicate.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } private List renderSubCriteria(List subCriteria) { 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 309a10f3b..6bd518663 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 @@ -30,7 +30,6 @@ import org.mybatis.dynamic.sql.ConditionVisitor; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -95,16 +94,8 @@ public FragmentAndParameters visit(AbstractTwoValueCondition condition) { @Override public FragmentAndParameters visit(AbstractSubselectCondition condition) { - SelectStatementProvider selectStatement = condition.selectModel().render(renderingContext); - - String finalFragment = condition.operator() - + " (" //$NON-NLS-1$ - + selectStatement.getSelectStatement() - + ")"; //$NON-NLS-1$ - - return FragmentAndParameters.withFragment(finalFragment) - .withParameters(selectStatement.getParameters()) - .build(); + return condition.selectModel().render(renderingContext) + .mapFragment(f -> condition.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } @Override From d8f631b1aa9bf04bf6d9e97caa08248c528199f4 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 10:53:47 -0500 Subject: [PATCH 03/13] Simplify renderer factory --- .../dynamic/sql/delete/DeleteModel.java | 6 +++++- .../sql/delete/render/DeleteRenderer.java | 9 +------- .../sql/insert/GeneralInsertModel.java | 6 +++++- .../dynamic/sql/insert/InsertSelectModel.java | 6 +++++- .../insert/render/GeneralInsertRenderer.java | 9 +------- .../insert/render/InsertSelectRenderer.java | 9 +------- .../dynamic/sql/render/RendererFactory.java | 21 ++++++------------- .../sql/select/AbstractSelectModel.java | 4 ++++ .../dynamic/sql/select/MultiSelectModel.java | 2 +- .../select/render/MultiSelectRenderer.java | 11 ++-------- .../dynamic/sql/update/UpdateModel.java | 6 +++++- .../sql/update/render/UpdateRenderer.java | 9 +------- 12 files changed, 37 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java index 015f9823c..581d2250a 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java @@ -65,9 +65,13 @@ public Optional orderByModel() { return Optional.ofNullable(orderByModel); } + public StatementConfiguration statementConfiguration() { + return statementConfiguration; + } + @NotNull public DeleteStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createDeleteRenderer(this, statementConfiguration) + return RendererFactory.createDeleteRenderer(this) .render(renderingStrategy); } 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 fa4cd0d28..7b3dbfc97 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 @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.delete.DeleteModel; import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; @@ -44,7 +43,7 @@ private DeleteRenderer(Builder builder) { renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy)) .withTableAliasCalculator(tableAliasCalculator) - .withStatementConfiguration(builder.statementConfiguration) + .withStatementConfiguration(deleteModel.statementConfiguration()) .build(); } @@ -106,7 +105,6 @@ public static Builder withDeleteModel(DeleteModel deleteModel) { public static class Builder { private DeleteModel deleteModel; private RenderingStrategy renderingStrategy; - private StatementConfiguration statementConfiguration; public Builder withDeleteModel(DeleteModel deleteModel) { this.deleteModel = deleteModel; @@ -118,11 +116,6 @@ public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { return this; } - public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) { - this.statementConfiguration = statementConfiguration; - return this; - } - public DeleteRenderer build() { return new DeleteRenderer(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java index f3fb146ee..955d5fe7c 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java @@ -50,9 +50,13 @@ public SqlTable table() { return table; } + public StatementConfiguration statementConfiguration() { + return statementConfiguration; + } + @NotNull public GeneralInsertStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createGeneralInsertRenderer(this, statementConfiguration) + return RendererFactory.createGeneralInsertRenderer(this) .render(renderingStrategy); } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java index 5b22eaeb7..37df5e10e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java @@ -51,9 +51,13 @@ public Optional columnList() { return Optional.ofNullable(columnList); } + public StatementConfiguration statementConfiguration() { + return statementConfiguration; + } + @NotNull public InsertSelectStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createInsertSelectRenderer(this, statementConfiguration) + return RendererFactory.createInsertSelectRenderer(this) .render(renderingStrategy); } 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 c5378b493..de91037a6 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 @@ -18,7 +18,6 @@ import java.util.Objects; import java.util.Optional; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.insert.GeneralInsertModel; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; @@ -32,7 +31,7 @@ public class GeneralInsertRenderer { private GeneralInsertRenderer(Builder builder) { model = Objects.requireNonNull(builder.model); RenderingContext renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) - .withStatementConfiguration(builder.statementConfiguration) + .withStatementConfiguration(model.statementConfiguration()) .build(); visitor = new GeneralInsertValuePhraseVisitor(renderingContext); } @@ -59,7 +58,6 @@ public static Builder withInsertModel(GeneralInsertModel model) { public static class Builder { private GeneralInsertModel model; private RenderingStrategy renderingStrategy; - private StatementConfiguration statementConfiguration; public Builder withInsertModel(GeneralInsertModel model) { this.model = model; @@ -71,11 +69,6 @@ public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { return this; } - public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) { - this.statementConfiguration = statementConfiguration; - return this; - } - public GeneralInsertRenderer build() { return new GeneralInsertRenderer(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java index 3825d4e3d..77adaa0df 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.mybatis.dynamic.sql.SqlColumn; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.insert.InsertColumnListModel; import org.mybatis.dynamic.sql.insert.InsertSelectModel; import org.mybatis.dynamic.sql.render.RenderingContext; @@ -38,7 +37,7 @@ public class InsertSelectRenderer { private InsertSelectRenderer(Builder builder) { model = Objects.requireNonNull(builder.model); renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) - .withStatementConfiguration(builder.statementConfiguration) + .withStatementConfiguration(model.statementConfiguration()) .build(); } @@ -75,7 +74,6 @@ public static Builder withInsertSelectModel(InsertSelectModel model) { public static class Builder { private InsertSelectModel model; private RenderingStrategy renderingStrategy; - private StatementConfiguration statementConfiguration; public Builder withInsertSelectModel(InsertSelectModel model) { this.model = model; @@ -87,11 +85,6 @@ public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { return this; } - public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) { - this.statementConfiguration = statementConfiguration; - return this; - } - public InsertSelectRenderer build() { return new InsertSelectRenderer(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index 0ac97d702..edf6e71a2 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -15,7 +15,6 @@ */ package org.mybatis.dynamic.sql.render; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.delete.DeleteModel; import org.mybatis.dynamic.sql.delete.render.DeleteRenderer; import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; @@ -45,10 +44,8 @@ import org.mybatis.dynamic.sql.util.FragmentAndParameters; public interface RendererFactory { - static Renderer createDeleteRenderer(DeleteModel deleteModel, - StatementConfiguration statementConfiguration) { + static Renderer createDeleteRenderer(DeleteModel deleteModel) { return renderingStrategy -> DeleteRenderer.withDeleteModel(deleteModel) - .withStatementConfiguration(statementConfiguration) .withRenderingStrategy(renderingStrategy) .build() .render(); @@ -63,9 +60,8 @@ static Renderer> createBatchInsertRenderer } static Renderer createGeneralInsertRenderer( - GeneralInsertModel generalInsertModel, StatementConfiguration statementConfiguration) { + GeneralInsertModel generalInsertModel) { return renderingStrategy -> GeneralInsertRenderer.withInsertModel(generalInsertModel) - .withStatementConfiguration(statementConfiguration) .withRenderingStrategy(renderingStrategy) .build() .render(); @@ -80,9 +76,8 @@ static Renderer> createInsertR } static Renderer createInsertSelectRenderer( - InsertSelectModel insertSelectModel, StatementConfiguration statementConfiguration) { + InsertSelectModel insertSelectModel) { return renderingStrategy -> InsertSelectRenderer.withInsertSelectModel(insertSelectModel) - .withStatementConfiguration(statementConfiguration) .withRenderingStrategy(renderingStrategy) .build() .render(); @@ -97,27 +92,23 @@ static Renderer> creat } static Renderer createMultiSelectRenderer( - MultiSelectModel multiSelectModel, StatementConfiguration statementConfiguration) { + MultiSelectModel multiSelectModel) { return renderingStrategy -> new MultiSelectRenderer.Builder() .withMultiSelectModel(multiSelectModel) - .withStatementConfiguration(statementConfiguration) .withRenderingStrategy(renderingStrategy) .build() .render(); } - static Renderer createSelectRenderer( - SelectModel selectModel) { + static Renderer createSelectRenderer(SelectModel selectModel) { return renderingContext -> SelectRenderer.withSelectModel(selectModel) .withRenderingContext(renderingContext) .build() .render(); } - static Renderer createUpdateRenderer( - UpdateModel updateModel, StatementConfiguration statementConfiguration) { + static Renderer createUpdateRenderer(UpdateModel updateModel) { return renderingStrategy -> UpdateRenderer.withUpdateModel(updateModel) - .withStatementConfiguration(statementConfiguration) .withRenderingStrategy(renderingStrategy) .build() .render(); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/AbstractSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/AbstractSelectModel.java index 49c20789f..8fc3fb898 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/AbstractSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/AbstractSelectModel.java @@ -40,6 +40,10 @@ public Optional pagingModel() { return Optional.ofNullable(pagingModel); } + public StatementConfiguration statementConfiguration() { + return statementConfiguration; + } + public abstract static class AbstractBuilder> { private OrderByModel orderByModel; private PagingModel pagingModel; diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java index 607378c20..443a42c56 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java @@ -47,7 +47,7 @@ public Stream unionQueries() { @NotNull public SelectStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createMultiSelectRenderer(this, statementConfiguration) + return RendererFactory.createMultiSelectRenderer(this) .render(renderingStrategy); } 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 78d6ae8ff..9eb11e84a 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 @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.MultiSelectModel; @@ -36,11 +35,11 @@ public class MultiSelectRenderer { private final RenderingContext renderingContext; private MultiSelectRenderer(Builder builder) { + multiSelectModel = Objects.requireNonNull(builder.multiSelectModel); renderingContext = RenderingContext .withRenderingStrategy(builder.renderingStrategy) - .withStatementConfiguration(builder.statementConfiguration) + .withStatementConfiguration(multiSelectModel.statementConfiguration()) .build(); - multiSelectModel = Objects.requireNonNull(builder.multiSelectModel); } public SelectStatementProvider render() { @@ -97,7 +96,6 @@ private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { public static class Builder { private RenderingStrategy renderingStrategy; private MultiSelectModel multiSelectModel; - private StatementConfiguration statementConfiguration; public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { this.renderingStrategy = renderingStrategy; @@ -109,11 +107,6 @@ public Builder withMultiSelectModel(MultiSelectModel multiSelectModel) { return this; } - public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) { - this.statementConfiguration = statementConfiguration; - return this; - } - public MultiSelectRenderer build() { return new MultiSelectRenderer(this); } diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java index 672b08c44..f4ad201e5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java @@ -77,9 +77,13 @@ public Optional orderByModel() { return Optional.ofNullable(orderByModel); } + public StatementConfiguration statementConfiguration() { + return statementConfiguration; + } + @NotNull public UpdateStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createUpdateRenderer(this, statementConfiguration) + return RendererFactory.createUpdateRenderer(this) .render(renderingStrategy); } 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 352c1de7a..3af6aa6d2 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 @@ -22,7 +22,6 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; -import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; import org.mybatis.dynamic.sql.render.RenderingContext; @@ -47,7 +46,7 @@ private UpdateRenderer(Builder builder) { renderingContext = RenderingContext .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy)) .withTableAliasCalculator(tableAliasCalculator) - .withStatementConfiguration(builder.statementConfiguration) + .withStatementConfiguration(updateModel.statementConfiguration()) .build(); visitor = new SetPhraseVisitor(renderingContext); } @@ -131,7 +130,6 @@ public static Builder withUpdateModel(UpdateModel updateModel) { public static class Builder { private UpdateModel updateModel; private RenderingStrategy renderingStrategy; - private StatementConfiguration statementConfiguration; public Builder withUpdateModel(UpdateModel updateModel) { this.updateModel = updateModel; @@ -143,11 +141,6 @@ public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { return this; } - public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) { - this.statementConfiguration = statementConfiguration; - return this; - } - public UpdateRenderer build() { return new UpdateRenderer(this); } From 1321973a0e3ce80bc689d251582786471bdcd8cf Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 13:12:01 -0500 Subject: [PATCH 04/13] Make an explicit subquery renderer --- .../insert/render/InsertSelectRenderer.java | 2 +- .../dynamic/sql/render/RendererFactory.java | 12 ++- .../dynamic/sql/select/SelectModel.java | 13 +-- .../select/render/MultiSelectRenderer.java | 4 +- .../sql/select/render/SelectRenderer.java | 62 +++-------- .../sql/select/render/SubQueryRenderer.java | 101 ++++++++++++++++++ .../render/TableExpressionRenderer.java | 2 +- .../sql/update/render/SetPhraseVisitor.java | 2 +- .../sql/where/render/CriterionRenderer.java | 2 +- .../where/render/DefaultConditionVisitor.java | 2 +- 10 files changed, 135 insertions(+), 67 deletions(-) create mode 100644 src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java index 77adaa0df..eb53e333b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java @@ -42,7 +42,7 @@ private InsertSelectRenderer(Builder builder) { } public InsertSelectStatementProvider render() { - FragmentAndParameters selectStatement = model.selectModel().render(renderingContext); + FragmentAndParameters selectStatement = model.selectModel().renderSubQuery(renderingContext); String statementStart = InsertRenderingUtilities.calculateInsertStatementStart(model.table()); Optional columnsPhrase = calculateColumnsPhrase(); diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index edf6e71a2..380585358 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -38,6 +38,7 @@ import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; @@ -100,8 +101,15 @@ static Renderer createMultiSelectRen .render(); } - static Renderer createSelectRenderer(SelectModel selectModel) { - return renderingContext -> SelectRenderer.withSelectModel(selectModel) + static Renderer createSelectRenderer(SelectModel selectModel) { + return renderingStrategy -> SelectRenderer.withSelectModel(selectModel) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); + } + + static Renderer createSubQueryRenderer(SelectModel selectModel) { + return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) .withRenderingContext(renderingContext) .build() .render(); 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 3dff3162e..ae9e9027f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -24,7 +24,6 @@ import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.Validator; @@ -44,13 +43,7 @@ public Stream queryExpressions() { @NotNull public SelectStatementProvider render(RenderingStrategy renderingStrategy) { - RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy) - .withStatementConfiguration(statementConfiguration) - .build(); - FragmentAndParameters fragmentAndParameters = render(renderingContext); - return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) - .withParameters(fragmentAndParameters.parameters()) - .build(); + return RendererFactory.createSelectRenderer(this).render(renderingStrategy); } /** @@ -60,8 +53,8 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) { * @return a rendered select statement and parameters */ @NotNull - public FragmentAndParameters render(RenderingContext renderingContext) { - return RendererFactory.createSelectRenderer(this).render(renderingContext); + public FragmentAndParameters renderSubQuery(RenderingContext renderingContext) { + return RendererFactory.createSubQueryRenderer(this).render(renderingContext); } public static Builder withQueryExpressions(List queryExpressions) { 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 9eb11e84a..b90c8d6cb 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 @@ -64,12 +64,12 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag } private FragmentAndParameters renderSelect(SelectModel selectModel) { - return selectModel.render(renderingContext) + return selectModel.renderSubQuery(renderingContext) .mapFragment(f -> "(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } private FragmentAndParameters renderSelect(UnionQuery unionQuery) { - return unionQuery.selectModel().render(renderingContext) + return unionQuery.selectModel().renderSubQuery(renderingContext) .mapFragment(f -> unionQuery.connector() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index 25e2e408b..76617f038 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -16,17 +16,12 @@ package org.mybatis.dynamic.sql.select.render; import java.util.Objects; -import java.util.Optional; -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.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.select.PagingModel; -import org.mybatis.dynamic.sql.select.QueryExpressionModel; +import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -import org.mybatis.dynamic.sql.util.FragmentCollector; public class SelectRenderer { private final SelectModel selectModel; @@ -34,46 +29,17 @@ public class SelectRenderer { private SelectRenderer(Builder builder) { selectModel = Objects.requireNonNull(builder.selectModel); - renderingContext = Objects.requireNonNull(builder.renderingContext); + renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) + .withStatementConfiguration(selectModel.statementConfiguration()) + .build(); } - public FragmentAndParameters render() { - FragmentCollector fragmentCollector = selectModel - .queryExpressions() - .map(this::renderQueryExpression) - .collect(FragmentCollector.collect()); - - renderOrderBy().ifPresent(fragmentCollector::add); - renderPagingModel().ifPresent(fragmentCollector::add); - - return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$ - } - - private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { - return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) - .withRenderingContext(renderingContext) - .build() - .render(); - } - - private Optional renderOrderBy() { - return selectModel.orderByModel().map(this::renderOrderBy); - } - - private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { - return new OrderByRenderer(renderingContext).render(orderByModel); - } - - private Optional renderPagingModel() { - return selectModel.pagingModel().map(this::renderPagingModel); - } - - private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { - return new PagingModelRenderer.Builder() - .withPagingModel(pagingModel) - .withRenderingContext(renderingContext) - .build() - .render(); + public SelectStatementProvider render() { + FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel) + .render(renderingContext); + return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) + .withParameters(fragmentAndParameters.parameters()) + .build(); } public static Builder withSelectModel(SelectModel selectModel) { @@ -82,10 +48,10 @@ public static Builder withSelectModel(SelectModel selectModel) { public static class Builder { private SelectModel selectModel; - private RenderingContext renderingContext; + private RenderingStrategy renderingStrategy; - public Builder withRenderingContext(RenderingContext renderingContext) { - this.renderingContext = renderingContext; + public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { + this.renderingStrategy = renderingStrategy; return this; } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java new file mode 100644 index 000000000..013cae505 --- /dev/null +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java @@ -0,0 +1,101 @@ +/* + * Copyright 2016-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.select.render; + +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.select.PagingModel; +import org.mybatis.dynamic.sql.select.QueryExpressionModel; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.util.FragmentAndParameters; +import org.mybatis.dynamic.sql.util.FragmentCollector; + +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +public class SubQueryRenderer { + private final SelectModel selectModel; + private final RenderingContext renderingContext; + + private SubQueryRenderer(Builder builder) { + selectModel = Objects.requireNonNull(builder.selectModel); + renderingContext = Objects.requireNonNull(builder.renderingContext); + } + + public FragmentAndParameters render() { + FragmentCollector fragmentCollector = selectModel + .queryExpressions() + .map(this::renderQueryExpression) + .collect(FragmentCollector.collect()); + + renderOrderBy().ifPresent(fragmentCollector::add); + renderPagingModel().ifPresent(fragmentCollector::add); + + return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$ + } + + private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { + return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) + .withRenderingContext(renderingContext) + .build() + .render(); + } + + private Optional renderOrderBy() { + return selectModel.orderByModel().map(this::renderOrderBy); + } + + private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { + return new OrderByRenderer(renderingContext).render(orderByModel); + } + + private Optional renderPagingModel() { + return selectModel.pagingModel().map(this::renderPagingModel); + } + + private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { + return new PagingModelRenderer.Builder() + .withPagingModel(pagingModel) + .withRenderingContext(renderingContext) + .build() + .render(); + } + + public static Builder withSelectModel(SelectModel selectModel) { + return new Builder().withSelectModel(selectModel); + } + + public static class Builder { + private SelectModel selectModel; + private RenderingContext renderingContext; + + public Builder withRenderingContext(RenderingContext renderingContext) { + this.renderingContext = renderingContext; + return this; + } + + public Builder withSelectModel(SelectModel selectModel) { + this.selectModel = selectModel; + return this; + } + + public SubQueryRenderer build() { + return new SubQueryRenderer(this); + } + } +} 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 3ba013825..0448a2396 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 @@ -39,7 +39,7 @@ public FragmentAndParameters visit(SqlTable table) { @Override public FragmentAndParameters visit(SubQuery subQuery) { - return subQuery.selectModel().render(renderingContext) + return subQuery.selectModel().renderSubQuery(renderingContext) .mapFragment(f -> applyAlias("(" + f + ")", subQuery)); //$NON-NLS-1$ //$NON-NLS-2$ } 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 77a898ea2..dd3d6ed78 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 @@ -83,7 +83,7 @@ public Optional visit(ValueWhenPresentMapping mapp @Override public Optional visit(SelectMapping mapping) { - return Optional.of(mapping.selectModel().render(renderingContext) + return Optional.of(mapping.selectModel().renderSubQuery(renderingContext) .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) + " = (" + f + ")")); //$NON-NLS-1$ //$NON-NLS-2$ } 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 f56fc3e79..f19a6b340 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 @@ -119,7 +119,7 @@ private Optional renderColumnAndCondition(ColumnAndCo private FragmentAndParameters renderExists(ExistsCriterion criterion) { ExistsPredicate existsPredicate = criterion.existsPredicate(); - return existsPredicate.selectModelBuilder().build().render(renderingContext) + return existsPredicate.selectModelBuilder().build().renderSubQuery(renderingContext) .mapFragment(f -> existsPredicate.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } 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 6bd518663..debb4d9c8 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 @@ -94,7 +94,7 @@ public FragmentAndParameters visit(AbstractTwoValueCondition condition) { @Override public FragmentAndParameters visit(AbstractSubselectCondition condition) { - return condition.selectModel().render(renderingContext) + return condition.selectModel().renderSubQuery(renderingContext) .mapFragment(f -> condition.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } From de7d595b62e0a576043512013ff7e982092637ea Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 14:17:40 -0500 Subject: [PATCH 05/13] Use the subquery renderer directly - less garbage --- .../insert/render/InsertSelectRenderer.java | 27 +++++++++---------- .../dynamic/sql/render/RendererFactory.java | 8 ++++++ .../dynamic/sql/select/SelectModel.java | 13 --------- .../select/render/MultiSelectRenderer.java | 13 ++++++--- .../sql/select/render/SubQueryRenderer.java | 13 ++++++++- .../render/TableExpressionRenderer.java | 14 ++++------ .../sql/update/render/SetPhraseVisitor.java | 10 ++++--- .../sql/where/render/CriterionRenderer.java | 8 +++--- .../where/render/DefaultConditionVisitor.java | 7 +++-- 9 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java index eb53e333b..fb3b37503 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java @@ -15,19 +15,18 @@ */ package org.mybatis.dynamic.sql.insert.render; -import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; +import static org.mybatis.dynamic.sql.util.StringUtilities.spaceAfter; import java.util.Objects; -import java.util.Optional; import java.util.stream.Collectors; import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.insert.InsertColumnListModel; import org.mybatis.dynamic.sql.insert.InsertSelectModel; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -import org.mybatis.dynamic.sql.util.StringUtilities; public class InsertSelectRenderer { @@ -42,29 +41,27 @@ private InsertSelectRenderer(Builder builder) { } public InsertSelectStatementProvider render() { - FragmentAndParameters selectStatement = model.selectModel().renderSubQuery(renderingContext); - String statementStart = InsertRenderingUtilities.calculateInsertStatementStart(model.table()); - Optional columnsPhrase = calculateColumnsPhrase(); - String renderedSelectStatement = selectStatement.fragment(); + String columnsPhrase = calculateColumnsPhrase(); + String prefix = statementStart + spaceAfter(columnsPhrase); - String insertStatement = statementStart - + columnsPhrase.map(StringUtilities::spaceBefore).orElse("") //$NON-NLS-1$ - + spaceBefore(renderedSelectStatement); + FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(model.selectModel(), + prefix, "") //$NON-NLS-1$ + .render(renderingContext); - return DefaultGeneralInsertStatementProvider.withInsertStatement(insertStatement) - .withParameters(selectStatement.parameters()) + return DefaultGeneralInsertStatementProvider.withInsertStatement(fragmentAndParameters.fragment()) + .withParameters(fragmentAndParameters.parameters()) .build(); } - private Optional calculateColumnsPhrase() { - return model.columnList().map(this::calculateColumnsPhrase); + private String calculateColumnsPhrase() { + return model.columnList().map(this::calculateColumnsPhrase).orElse(""); //$NON-NLS-1$ } private String calculateColumnsPhrase(InsertColumnListModel columnList) { return columnList.columns() .map(SqlColumn::name) - .collect(Collectors.joining(", ", "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + .collect(Collectors.joining(", ", " (", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } public static Builder withInsertSelectModel(InsertSelectModel model) { diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index 380585358..2b7b2e945 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -115,6 +115,14 @@ static Renderer createSubQueryRenderer( .render(); } + static Renderer createSubQueryRenderer(SelectModel selectModel, + String prefix, String suffix) { + return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) + .withRenderingContext(renderingContext) + .build() + .render(prefix, suffix); + } + static Renderer createUpdateRenderer(UpdateModel updateModel) { return renderingStrategy -> UpdateRenderer.withUpdateModel(updateModel) .withRenderingStrategy(renderingStrategy) 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 ae9e9027f..14225147f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -22,10 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.render.RendererFactory; -import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.Validator; public class SelectModel extends AbstractSelectModel { @@ -46,17 +44,6 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) { return RendererFactory.createSelectRenderer(this).render(renderingStrategy); } - /** - * This version is for rendering sub-queries, union queries, etc. - * - * @param renderingContext the rendering context - * @return a rendered select statement and parameters - */ - @NotNull - public FragmentAndParameters renderSubQuery(RenderingContext renderingContext) { - return RendererFactory.createSubQueryRenderer(this).render(renderingContext); - } - public static Builder withQueryExpressions(List queryExpressions) { return new Builder().withQueryExpressions(queryExpressions); } 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 b90c8d6cb..4fe0b7e92 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 @@ -21,6 +21,7 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.MultiSelectModel; @@ -64,13 +65,17 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag } private FragmentAndParameters renderSelect(SelectModel selectModel) { - return selectModel.renderSubQuery(renderingContext) - .mapFragment(f -> "(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + return RendererFactory.createSubQueryRenderer(selectModel, + "(", //$NON-NLS-1$ + ")") //$NON-NLS-1$ + .render(renderingContext); } private FragmentAndParameters renderSelect(UnionQuery unionQuery) { - return unionQuery.selectModel().renderSubQuery(renderingContext) - .mapFragment(f -> unionQuery.connector() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + return RendererFactory.createSubQueryRenderer(unionQuery.selectModel(), + unionQuery.connector() + " (", //$NON-NLS-1$ + ")") //$NON-NLS-1$ + .render(renderingContext); } private Optional renderOrderBy() { diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java index 013cae505..5e95886c5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java @@ -26,6 +26,7 @@ import java.util.Objects; import java.util.Optional; +import java.util.stream.Collector; import java.util.stream.Collectors; public class SubQueryRenderer { @@ -38,6 +39,16 @@ private SubQueryRenderer(Builder builder) { } public FragmentAndParameters render() { + var collector = Collectors.joining(" "); //$NON-NLS-1$ + return render(collector); + } + + public FragmentAndParameters render(String prefix, String suffix) { + var collector = Collectors.joining(" ", prefix, suffix); //$NON-NLS-1$ + return render(collector); + } + + private FragmentAndParameters render(Collector collector) { FragmentCollector fragmentCollector = selectModel .queryExpressions() .map(this::renderQueryExpression) @@ -46,7 +57,7 @@ public FragmentAndParameters render() { renderOrderBy().ifPresent(fragmentCollector::add); renderPagingModel().ifPresent(fragmentCollector::add); - return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$ + return fragmentCollector.toFragmentAndParameters(collector); } private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { 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 0448a2396..ede734ece 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 @@ -15,12 +15,11 @@ */ package org.mybatis.dynamic.sql.select.render; -import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore; - import java.util.Objects; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.TableExpressionVisitor; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.SubQuery; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -39,14 +38,11 @@ public FragmentAndParameters visit(SqlTable table) { @Override public FragmentAndParameters visit(SubQuery subQuery) { - return subQuery.selectModel().renderSubQuery(renderingContext) - .mapFragment(f -> applyAlias("(" + f + ")", subQuery)); //$NON-NLS-1$ //$NON-NLS-2$ - } + String suffix = subQuery.alias().map(a -> ") " + a) //$NON-NLS-1$ + .orElse(")"); //$NON-NLS-1$ - private String applyAlias(String fragment, SubQuery subQuery) { - return subQuery.alias() - .map(a -> fragment + spaceBefore(a)) - .orElse(fragment); + return RendererFactory.createSubQueryRenderer(subQuery.selectModel(), "(", suffix) //$NON-NLS-1$ + .render(renderingContext); } public static class Builder { 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 dd3d6ed78..f44c036dc 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 @@ -19,6 +19,7 @@ import java.util.Optional; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.ColumnToColumnMapping; @@ -83,9 +84,12 @@ public Optional visit(ValueWhenPresentMapping mapp @Override public Optional visit(SelectMapping mapping) { - return Optional.of(mapping.selectModel().renderSubQuery(renderingContext) - .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) - + " = (" + f + ")")); //$NON-NLS-1$ //$NON-NLS-2$ + FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(mapping.selectModel(), + renderingContext.aliasedColumnName(mapping.column()) + " = (", //$NON-NLS-1$ + ")") //$NON-NLS-1$ + .render(renderingContext); + + return Optional.of(fragmentAndParameters); } @Override 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 f19a6b340..6935b8b54 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 @@ -29,6 +29,7 @@ import org.mybatis.dynamic.sql.NotCriterion; import org.mybatis.dynamic.sql.SqlCriterion; import org.mybatis.dynamic.sql.SqlCriterionVisitor; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -118,9 +119,10 @@ private Optional renderColumnAndCondition(ColumnAndCo private FragmentAndParameters renderExists(ExistsCriterion criterion) { ExistsPredicate existsPredicate = criterion.existsPredicate(); - - return existsPredicate.selectModelBuilder().build().renderSubQuery(renderingContext) - .mapFragment(f -> existsPredicate.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + return RendererFactory.createSubQueryRenderer(existsPredicate.selectModelBuilder().build(), + existsPredicate.operator() + " (", //$NON-NLS-1$ + ")") //$NON-NLS-1$ + .render(renderingContext); } private List renderSubCriteria(List subCriteria) { 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 debb4d9c8..c13633b1d 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,6 +29,7 @@ import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.ConditionVisitor; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; +import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -94,8 +95,10 @@ public FragmentAndParameters visit(AbstractTwoValueCondition condition) { @Override public FragmentAndParameters visit(AbstractSubselectCondition condition) { - return condition.selectModel().renderSubQuery(renderingContext) - .mapFragment(f -> condition.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + return RendererFactory.createSubQueryRenderer(condition.selectModel(), + condition.operator() + " (", //$NON-NLS-1$ + ")") //$NON-NLS-1$ + .render(renderingContext); } @Override From 7dd88a3c3930691f91f621dffc161f2ed4b7ca11 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 14:41:46 -0500 Subject: [PATCH 06/13] Make the SelectRenderer work for sub-queries --- .../dynamic/sql/render/RendererFactory.java | 26 ++-- .../sql/select/render/SelectRenderer.java | 66 ++++++++--- .../sql/select/render/SubQueryRenderer.java | 112 ------------------ 3 files changed, 64 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index 2b7b2e945..d43ddd6f8 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -35,10 +35,10 @@ import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; import org.mybatis.dynamic.sql.select.MultiSelectModel; import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider; import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; @@ -102,22 +102,24 @@ static Renderer createMultiSelectRen } static Renderer createSelectRenderer(SelectModel selectModel) { - return renderingStrategy -> SelectRenderer.withSelectModel(selectModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } + return renderingStrategy -> { + RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy) + .withStatementConfiguration(selectModel.statementConfiguration()) + .build(); - static Renderer createSubQueryRenderer(SelectModel selectModel) { - return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) - .withRenderingContext(renderingContext) - .build() - .render(); + FragmentAndParameters fragmentAndParameters = createSubQueryRenderer(selectModel, + "", "") //$NON-NLS-1$ //$NON-NLS-2$ + .render(renderingContext); + + return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) + .withParameters(fragmentAndParameters.parameters()) + .build(); + }; } static Renderer createSubQueryRenderer(SelectModel selectModel, String prefix, String suffix) { - return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) + return renderingContext -> SelectRenderer.withSelectModel(selectModel) .withRenderingContext(renderingContext) .build() .render(prefix, suffix); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index 76617f038..64725710b 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -15,13 +15,18 @@ */ package org.mybatis.dynamic.sql.select.render; -import java.util.Objects; - -import org.mybatis.dynamic.sql.render.RendererFactory; +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.select.PagingModel; +import org.mybatis.dynamic.sql.select.QueryExpressionModel; import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; +import org.mybatis.dynamic.sql.util.FragmentCollector; + +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; public class SelectRenderer { private final SelectModel selectModel; @@ -29,17 +34,46 @@ public class SelectRenderer { private SelectRenderer(Builder builder) { selectModel = Objects.requireNonNull(builder.selectModel); - renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) - .withStatementConfiguration(selectModel.statementConfiguration()) - .build(); + renderingContext = Objects.requireNonNull(builder.renderingContext); + } + + public FragmentAndParameters render(String prefix, String suffix) { + FragmentCollector fragmentCollector = selectModel + .queryExpressions() + .map(this::renderQueryExpression) + .collect(FragmentCollector.collect()); + + renderOrderBy().ifPresent(fragmentCollector::add); + renderPagingModel().ifPresent(fragmentCollector::add); + + return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ", prefix, suffix)); //$NON-NLS-1$ + } + + private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { + return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) + .withRenderingContext(renderingContext) + .build() + .render(); + } + + private Optional renderOrderBy() { + return selectModel.orderByModel().map(this::renderOrderBy); + } + + private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { + return new OrderByRenderer(renderingContext).render(orderByModel); + } + + private Optional renderPagingModel() { + return selectModel.pagingModel().map(this::renderPagingModel); } - public SelectStatementProvider render() { - FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel) - .render(renderingContext); - return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) - .withParameters(fragmentAndParameters.parameters()) - .build(); + private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { + return new PagingModelRenderer.Builder() + .withPagingModel(pagingModel) + .withRenderingContext(renderingContext) + .build() + .render(); } public static Builder withSelectModel(SelectModel selectModel) { @@ -48,10 +82,10 @@ public static Builder withSelectModel(SelectModel selectModel) { public static class Builder { private SelectModel selectModel; - private RenderingStrategy renderingStrategy; + private RenderingContext renderingContext; - public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { - this.renderingStrategy = renderingStrategy; + public Builder withRenderingContext(RenderingContext renderingContext) { + this.renderingContext = renderingContext; return this; } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java deleted file mode 100644 index 5e95886c5..000000000 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2016-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mybatis.dynamic.sql.select.render; - -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.select.PagingModel; -import org.mybatis.dynamic.sql.select.QueryExpressionModel; -import org.mybatis.dynamic.sql.select.SelectModel; -import org.mybatis.dynamic.sql.util.FragmentAndParameters; -import org.mybatis.dynamic.sql.util.FragmentCollector; - -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collector; -import java.util.stream.Collectors; - -public class SubQueryRenderer { - private final SelectModel selectModel; - private final RenderingContext renderingContext; - - private SubQueryRenderer(Builder builder) { - selectModel = Objects.requireNonNull(builder.selectModel); - renderingContext = Objects.requireNonNull(builder.renderingContext); - } - - public FragmentAndParameters render() { - var collector = Collectors.joining(" "); //$NON-NLS-1$ - return render(collector); - } - - public FragmentAndParameters render(String prefix, String suffix) { - var collector = Collectors.joining(" ", prefix, suffix); //$NON-NLS-1$ - return render(collector); - } - - private FragmentAndParameters render(Collector collector) { - FragmentCollector fragmentCollector = selectModel - .queryExpressions() - .map(this::renderQueryExpression) - .collect(FragmentCollector.collect()); - - renderOrderBy().ifPresent(fragmentCollector::add); - renderPagingModel().ifPresent(fragmentCollector::add); - - return fragmentCollector.toFragmentAndParameters(collector); - } - - private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { - return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) - .withRenderingContext(renderingContext) - .build() - .render(); - } - - private Optional renderOrderBy() { - return selectModel.orderByModel().map(this::renderOrderBy); - } - - private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { - return new OrderByRenderer(renderingContext).render(orderByModel); - } - - private Optional renderPagingModel() { - return selectModel.pagingModel().map(this::renderPagingModel); - } - - private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { - return new PagingModelRenderer.Builder() - .withPagingModel(pagingModel) - .withRenderingContext(renderingContext) - .build() - .render(); - } - - public static Builder withSelectModel(SelectModel selectModel) { - return new Builder().withSelectModel(selectModel); - } - - public static class Builder { - private SelectModel selectModel; - private RenderingContext renderingContext; - - public Builder withRenderingContext(RenderingContext renderingContext) { - this.renderingContext = renderingContext; - return this; - } - - public Builder withSelectModel(SelectModel selectModel) { - this.selectModel = selectModel; - return this; - } - - public SubQueryRenderer build() { - return new SubQueryRenderer(this); - } - } -} From 4da1e6dbcce1320121b2a532389c765f5fee40f5 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 14:42:52 -0500 Subject: [PATCH 07/13] Checkstyle --- .../mybatis/dynamic/sql/select/render/SelectRenderer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index 64725710b..cd390d088 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -15,6 +15,10 @@ */ package org.mybatis.dynamic.sql.select.render; +import java.util.Objects; +import java.util.Optional; +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; @@ -24,10 +28,6 @@ import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - public class SelectRenderer { private final SelectModel selectModel; private final RenderingContext renderingContext; From 63223f35772f6ba8727f7102e46757c5a457b13c Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 14:49:45 -0500 Subject: [PATCH 08/13] Checkstyle --- .../mybatis/dynamic/sql/update/render/SetPhraseVisitor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f44c036dc..5464a253f 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 @@ -88,14 +88,14 @@ public Optional visit(SelectMapping mapping) { renderingContext.aliasedColumnName(mapping.column()) + " = (", //$NON-NLS-1$ ")") //$NON-NLS-1$ .render(renderingContext); - return Optional.of(fragmentAndParameters); } @Override public Optional visit(ColumnToColumnMapping mapping) { - return Optional.of(mapping.rightColumn().render(renderingContext) - .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) + " = " + f)); //$NON-NLS-1$ + FragmentAndParameters fragmentAndParameters = mapping.rightColumn().render(renderingContext) + .mapFragment(f -> renderingContext.aliasedColumnName(mapping.column()) + " = " + f); //$NON-NLS-1$ + return Optional.of(fragmentAndParameters); } private Optional buildValueFragment(AbstractColumnMapping mapping, T value) { From 99669aba99d734c4d368e9709f9a55811a7e113c Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Nov 2024 15:02:06 -0500 Subject: [PATCH 09/13] Back to explicit subquery renderer --- .../dynamic/sql/render/RendererFactory.java | 21 ++-- .../sql/select/render/SelectRenderer.java | 62 +++-------- .../sql/select/render/SubQueryRenderer.java | 101 ++++++++++++++++++ 3 files changed, 122 insertions(+), 62 deletions(-) create mode 100644 src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java index d43ddd6f8..48d495bd3 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java @@ -35,10 +35,10 @@ import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; import org.mybatis.dynamic.sql.select.MultiSelectModel; import org.mybatis.dynamic.sql.select.SelectModel; -import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider; import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; @@ -102,24 +102,15 @@ static Renderer createMultiSelectRen } static Renderer createSelectRenderer(SelectModel selectModel) { - return renderingStrategy -> { - RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy) - .withStatementConfiguration(selectModel.statementConfiguration()) - .build(); - - FragmentAndParameters fragmentAndParameters = createSubQueryRenderer(selectModel, - "", "") //$NON-NLS-1$ //$NON-NLS-2$ - .render(renderingContext); - - return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) - .withParameters(fragmentAndParameters.parameters()) - .build(); - }; + return renderingStrategy -> SelectRenderer.withSelectModel(selectModel) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } static Renderer createSubQueryRenderer(SelectModel selectModel, String prefix, String suffix) { - return renderingContext -> SelectRenderer.withSelectModel(selectModel) + return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) .withRenderingContext(renderingContext) .build() .render(prefix, suffix); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index cd390d088..5789b0298 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -16,17 +16,12 @@ package org.mybatis.dynamic.sql.select.render; import java.util.Objects; -import java.util.Optional; -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.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; -import org.mybatis.dynamic.sql.select.PagingModel; -import org.mybatis.dynamic.sql.select.QueryExpressionModel; +import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -import org.mybatis.dynamic.sql.util.FragmentCollector; public class SelectRenderer { private final SelectModel selectModel; @@ -34,46 +29,19 @@ public class SelectRenderer { private SelectRenderer(Builder builder) { selectModel = Objects.requireNonNull(builder.selectModel); - renderingContext = Objects.requireNonNull(builder.renderingContext); + renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) + .withStatementConfiguration(selectModel.statementConfiguration()) + .build(); } - public FragmentAndParameters render(String prefix, String suffix) { - FragmentCollector fragmentCollector = selectModel - .queryExpressions() - .map(this::renderQueryExpression) - .collect(FragmentCollector.collect()); + public SelectStatementProvider render() { + FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel, + "", "") //$NON-NLS-1$ //$NON-NLS-2$ + .render(renderingContext); - renderOrderBy().ifPresent(fragmentCollector::add); - renderPagingModel().ifPresent(fragmentCollector::add); - - return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ", prefix, suffix)); //$NON-NLS-1$ - } - - private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { - return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) - .withRenderingContext(renderingContext) - .build() - .render(); - } - - private Optional renderOrderBy() { - return selectModel.orderByModel().map(this::renderOrderBy); - } - - private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { - return new OrderByRenderer(renderingContext).render(orderByModel); - } - - private Optional renderPagingModel() { - return selectModel.pagingModel().map(this::renderPagingModel); - } - - private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { - return new PagingModelRenderer.Builder() - .withPagingModel(pagingModel) - .withRenderingContext(renderingContext) - .build() - .render(); + return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) + .withParameters(fragmentAndParameters.parameters()) + .build(); } public static Builder withSelectModel(SelectModel selectModel) { @@ -82,10 +50,10 @@ public static Builder withSelectModel(SelectModel selectModel) { public static class Builder { private SelectModel selectModel; - private RenderingContext renderingContext; + private RenderingStrategy renderingStrategy; - public Builder withRenderingContext(RenderingContext renderingContext) { - this.renderingContext = renderingContext; + public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { + this.renderingStrategy = renderingStrategy; return this; } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java new file mode 100644 index 000000000..1f97f5e7d --- /dev/null +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java @@ -0,0 +1,101 @@ +/* + * Copyright 2016-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.select.render; + +import java.util.Objects; +import java.util.Optional; +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.select.PagingModel; +import org.mybatis.dynamic.sql.select.QueryExpressionModel; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.util.FragmentAndParameters; +import org.mybatis.dynamic.sql.util.FragmentCollector; + +public class SubQueryRenderer { + private final SelectModel selectModel; + private final RenderingContext renderingContext; + + private SubQueryRenderer(Builder builder) { + selectModel = Objects.requireNonNull(builder.selectModel); + renderingContext = Objects.requireNonNull(builder.renderingContext); + } + + public FragmentAndParameters render(String prefix, String suffix) { + FragmentCollector fragmentCollector = selectModel + .queryExpressions() + .map(this::renderQueryExpression) + .collect(FragmentCollector.collect()); + + renderOrderBy().ifPresent(fragmentCollector::add); + renderPagingModel().ifPresent(fragmentCollector::add); + + return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ", prefix, suffix)); //$NON-NLS-1$ + } + + private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) { + return QueryExpressionRenderer.withQueryExpression(queryExpressionModel) + .withRenderingContext(renderingContext) + .build() + .render(); + } + + private Optional renderOrderBy() { + return selectModel.orderByModel().map(this::renderOrderBy); + } + + private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) { + return new OrderByRenderer(renderingContext).render(orderByModel); + } + + private Optional renderPagingModel() { + return selectModel.pagingModel().map(this::renderPagingModel); + } + + private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { + return new PagingModelRenderer.Builder() + .withPagingModel(pagingModel) + .withRenderingContext(renderingContext) + .build() + .render(); + } + + public static Builder withSelectModel(SelectModel selectModel) { + return new Builder().withSelectModel(selectModel); + } + + public static class Builder { + private SelectModel selectModel; + private RenderingContext renderingContext; + + public Builder withRenderingContext(RenderingContext renderingContext) { + this.renderingContext = renderingContext; + return this; + } + + public Builder withSelectModel(SelectModel selectModel) { + this.selectModel = selectModel; + return this; + } + + public SubQueryRenderer build() { + return new SubQueryRenderer(this); + } + } +} From 8db58a8f861200b0fec01e1b50cb2dd1b35cc761 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sat, 23 Nov 2024 15:32:23 -0500 Subject: [PATCH 10/13] Remove renderer factory It didn't reduce the Sonar cycles, and added unnecessary complexity --- .../dynamic/sql/delete/DeleteModel.java | 8 +- .../dynamic/sql/insert/BatchInsertModel.java | 8 +- .../sql/insert/GeneralInsertModel.java | 8 +- .../dynamic/sql/insert/InsertModel.java | 8 +- .../dynamic/sql/insert/InsertSelectModel.java | 8 +- .../sql/insert/MultiRowInsertModel.java | 8 +- .../insert/render/InsertSelectRenderer.java | 10 +- .../mybatis/dynamic/sql/render/Renderer.java | 21 --- .../dynamic/sql/render/RendererFactory.java | 125 ------------------ .../dynamic/sql/select/MultiSelectModel.java | 8 +- .../dynamic/sql/select/SelectModel.java | 7 +- .../select/render/MultiSelectRenderer.java | 25 ++-- .../sql/select/render/SelectRenderer.java | 18 +-- .../sql/select/render/SubQueryRenderer.java | 18 ++- .../render/TableExpressionRenderer.java | 9 +- .../dynamic/sql/update/UpdateModel.java | 8 +- .../sql/update/render/SetPhraseVisitor.java | 15 ++- .../sql/where/render/CriterionRenderer.java | 12 +- .../where/render/DefaultConditionVisitor.java | 12 +- 19 files changed, 124 insertions(+), 212 deletions(-) delete mode 100644 src/main/java/org/mybatis/dynamic/sql/render/Renderer.java delete mode 100644 src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java index 581d2250a..4519b1002 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteModel.java @@ -23,8 +23,8 @@ import org.mybatis.dynamic.sql.common.CommonBuilder; import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.configuration.StatementConfiguration; +import org.mybatis.dynamic.sql.delete.render.DeleteRenderer; import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.where.EmbeddedWhereModel; @@ -71,8 +71,10 @@ public StatementConfiguration statementConfiguration() { @NotNull public DeleteStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createDeleteRenderer(this) - .render(renderingStrategy); + return DeleteRenderer.withDeleteModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withTable(SqlTable table) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java index 5e48e9035..b591753a2 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java @@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.insert.render.BatchInsert; -import org.mybatis.dynamic.sql.render.RendererFactory; +import org.mybatis.dynamic.sql.insert.render.BatchInsertRenderer; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.Validator; @@ -33,8 +33,10 @@ private BatchInsertModel(Builder builder) { @NotNull public BatchInsert render(RenderingStrategy renderingStrategy) { - return RendererFactory.createBatchInsertRenderer(this) - .render(renderingStrategy); + return BatchInsertRenderer.withBatchInsertModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withRecords(Collection records) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java index 955d5fe7c..1fe845090 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java @@ -23,8 +23,8 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.configuration.StatementConfiguration; +import org.mybatis.dynamic.sql.insert.render.GeneralInsertRenderer; import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.Validator; @@ -56,8 +56,10 @@ public StatementConfiguration statementConfiguration() { @NotNull public GeneralInsertStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createGeneralInsertRenderer(this) - .render(renderingStrategy); + return GeneralInsertRenderer.withInsertModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static class Builder { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java index 07fac79ed..7f740051e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java @@ -22,8 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SqlTable; +import org.mybatis.dynamic.sql.insert.render.InsertRenderer; import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.Validator; @@ -54,8 +54,10 @@ public SqlTable table() { @NotNull public InsertStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createInsertRenderer(this) - .render(renderingStrategy); + return InsertRenderer.withInsertModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withRow(T row) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java index 37df5e10e..3d9580942 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/InsertSelectModel.java @@ -21,8 +21,8 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.configuration.StatementConfiguration; +import org.mybatis.dynamic.sql.insert.render.InsertSelectRenderer; import org.mybatis.dynamic.sql.insert.render.InsertSelectStatementProvider; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.SelectModel; @@ -57,8 +57,10 @@ public StatementConfiguration statementConfiguration() { @NotNull public InsertSelectStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createInsertSelectRenderer(this) - .render(renderingStrategy); + return InsertSelectRenderer.withInsertSelectModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withTable(SqlTable table) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java index d5d7f478d..406c02b7a 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java @@ -18,8 +18,8 @@ import java.util.Collection; import org.jetbrains.annotations.NotNull; +import org.mybatis.dynamic.sql.insert.render.MultiRowInsertRenderer; import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.Validator; @@ -33,8 +33,10 @@ private MultiRowInsertModel(Builder builder) { @NotNull public MultiRowInsertStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createMultiRowInsertRenderer(this) - .render(renderingStrategy); + return MultiRowInsertRenderer.withMultiRowInsertModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withRecords(Collection records) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java index fb3b37503..cd052f45d 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java @@ -23,9 +23,9 @@ import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.insert.InsertColumnListModel; import org.mybatis.dynamic.sql.insert.InsertSelectModel; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class InsertSelectRenderer { @@ -45,9 +45,11 @@ public InsertSelectStatementProvider render() { String columnsPhrase = calculateColumnsPhrase(); String prefix = statementStart + spaceAfter(columnsPhrase); - FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(model.selectModel(), - prefix, "") //$NON-NLS-1$ - .render(renderingContext); + FragmentAndParameters fragmentAndParameters = SubQueryRenderer.withSelectModel(model.selectModel()) + .withRenderingContext(renderingContext) + .withPrefix(prefix) + .build() + .render(); return DefaultGeneralInsertStatementProvider.withInsertStatement(fragmentAndParameters.fragment()) .withParameters(fragmentAndParameters.parameters()) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/Renderer.java b/src/main/java/org/mybatis/dynamic/sql/render/Renderer.java deleted file mode 100644 index acb84a98f..000000000 --- a/src/main/java/org/mybatis/dynamic/sql/render/Renderer.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2016-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mybatis.dynamic.sql.render; - -@FunctionalInterface -public interface Renderer { - R render(T t); -} diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java b/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java deleted file mode 100644 index 48d495bd3..000000000 --- a/src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2016-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mybatis.dynamic.sql.render; - -import org.mybatis.dynamic.sql.delete.DeleteModel; -import org.mybatis.dynamic.sql.delete.render.DeleteRenderer; -import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; -import org.mybatis.dynamic.sql.insert.BatchInsertModel; -import org.mybatis.dynamic.sql.insert.GeneralInsertModel; -import org.mybatis.dynamic.sql.insert.InsertModel; -import org.mybatis.dynamic.sql.insert.InsertSelectModel; -import org.mybatis.dynamic.sql.insert.MultiRowInsertModel; -import org.mybatis.dynamic.sql.insert.render.BatchInsert; -import org.mybatis.dynamic.sql.insert.render.BatchInsertRenderer; -import org.mybatis.dynamic.sql.insert.render.GeneralInsertRenderer; -import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; -import org.mybatis.dynamic.sql.insert.render.InsertRenderer; -import org.mybatis.dynamic.sql.insert.render.InsertSelectRenderer; -import org.mybatis.dynamic.sql.insert.render.InsertSelectStatementProvider; -import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider; -import org.mybatis.dynamic.sql.insert.render.MultiRowInsertRenderer; -import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; -import org.mybatis.dynamic.sql.select.MultiSelectModel; -import org.mybatis.dynamic.sql.select.SelectModel; -import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; -import org.mybatis.dynamic.sql.select.render.SelectRenderer; -import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; -import org.mybatis.dynamic.sql.update.UpdateModel; -import org.mybatis.dynamic.sql.update.render.UpdateRenderer; -import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; -import org.mybatis.dynamic.sql.util.FragmentAndParameters; - -public interface RendererFactory { - static Renderer createDeleteRenderer(DeleteModel deleteModel) { - return renderingStrategy -> DeleteRenderer.withDeleteModel(deleteModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer> createBatchInsertRenderer( - BatchInsertModel batchInsertModel) { - return renderingStrategy -> BatchInsertRenderer.withBatchInsertModel(batchInsertModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer createGeneralInsertRenderer( - GeneralInsertModel generalInsertModel) { - return renderingStrategy -> GeneralInsertRenderer.withInsertModel(generalInsertModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer> createInsertRenderer( - InsertModel insertModel) { - return renderingStrategy -> InsertRenderer.withInsertModel(insertModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer createInsertSelectRenderer( - InsertSelectModel insertSelectModel) { - return renderingStrategy -> InsertSelectRenderer.withInsertSelectModel(insertSelectModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer> createMultiRowInsertRenderer( - MultiRowInsertModel multiRowInsertModel) { - return renderingStrategy -> MultiRowInsertRenderer.withMultiRowInsertModel(multiRowInsertModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer createMultiSelectRenderer( - MultiSelectModel multiSelectModel) { - return renderingStrategy -> new MultiSelectRenderer.Builder() - .withMultiSelectModel(multiSelectModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer createSelectRenderer(SelectModel selectModel) { - return renderingStrategy -> SelectRenderer.withSelectModel(selectModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } - - static Renderer createSubQueryRenderer(SelectModel selectModel, - String prefix, String suffix) { - return renderingContext -> SubQueryRenderer.withSelectModel(selectModel) - .withRenderingContext(renderingContext) - .build() - .render(prefix, suffix); - } - - static Renderer createUpdateRenderer(UpdateModel updateModel) { - return renderingStrategy -> UpdateRenderer.withUpdateModel(updateModel) - .withRenderingStrategy(renderingStrategy) - .build() - .render(); - } -} diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java index 443a42c56..60539c660 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java @@ -21,8 +21,8 @@ import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.Validator; @@ -47,8 +47,10 @@ public Stream unionQueries() { @NotNull public SelectStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createMultiSelectRenderer(this) - .render(renderingStrategy); + return MultiSelectRenderer.withMultiSelectModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static class Builder extends AbstractBuilder { 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 14225147f..da01d09b5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -21,8 +21,8 @@ import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; -import org.mybatis.dynamic.sql.render.RendererFactory; 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.Validator; @@ -41,7 +41,10 @@ public Stream queryExpressions() { @NotNull public SelectStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createSelectRenderer(this).render(renderingStrategy); + return SelectRenderer.withSelectModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withQueryExpressions(List queryExpressions) { 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 4fe0b7e92..634896ad2 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 @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.MultiSelectModel; @@ -65,17 +64,21 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag } private FragmentAndParameters renderSelect(SelectModel selectModel) { - return RendererFactory.createSubQueryRenderer(selectModel, - "(", //$NON-NLS-1$ - ")") //$NON-NLS-1$ - .render(renderingContext); + return SubQueryRenderer.withSelectModel(selectModel) + .withRenderingContext(renderingContext) + .withPrefix("(") //$NON-NLS-1$ + .withSuffix(")") //$NON-NLS-1$ + .build() + .render(); } private FragmentAndParameters renderSelect(UnionQuery unionQuery) { - return RendererFactory.createSubQueryRenderer(unionQuery.selectModel(), - unionQuery.connector() + " (", //$NON-NLS-1$ - ")") //$NON-NLS-1$ - .render(renderingContext); + return SubQueryRenderer.withSelectModel(unionQuery.selectModel()) + .withRenderingContext(renderingContext) + .withPrefix(unionQuery.connector() + " (") //$NON-NLS-1$ + .withSuffix(")") //$NON-NLS-1$ + .build() + .render(); } private Optional renderOrderBy() { @@ -98,6 +101,10 @@ private FragmentAndParameters renderPagingModel(PagingModel pagingModel) { .render(); } + public static Builder withMultiSelectModel(MultiSelectModel multiSelectModel) { + return new Builder().withMultiSelectModel(multiSelectModel); + } + public static class Builder { private RenderingStrategy renderingStrategy; private MultiSelectModel multiSelectModel; diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java index 5789b0298..6284b0b49 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java @@ -17,7 +17,6 @@ import java.util.Objects; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.SelectModel; @@ -25,19 +24,22 @@ public class SelectRenderer { private final SelectModel selectModel; - private final RenderingContext renderingContext; + private final RenderingStrategy renderingStrategy; private SelectRenderer(Builder builder) { selectModel = Objects.requireNonNull(builder.selectModel); - renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy) - .withStatementConfiguration(selectModel.statementConfiguration()) - .build(); + renderingStrategy = Objects.requireNonNull(builder.renderingStrategy); } public SelectStatementProvider render() { - FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel, - "", "") //$NON-NLS-1$ //$NON-NLS-2$ - .render(renderingContext); + RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy) + .withStatementConfiguration(selectModel.statementConfiguration()) + .build(); + + FragmentAndParameters fragmentAndParameters = SubQueryRenderer.withSelectModel(selectModel) + .withRenderingContext(renderingContext) + .build() + .render(); return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment()) .withParameters(fragmentAndParameters.parameters()) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java index 1f97f5e7d..b1d6c28ce 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/render/SubQueryRenderer.java @@ -31,13 +31,17 @@ public class SubQueryRenderer { private final SelectModel selectModel; private final RenderingContext renderingContext; + private final String prefix; + private final String suffix; private SubQueryRenderer(Builder builder) { selectModel = Objects.requireNonNull(builder.selectModel); renderingContext = Objects.requireNonNull(builder.renderingContext); + prefix = builder.prefix == null ? "" : builder.prefix; //$NON-NLS-1$ + suffix = builder.suffix == null ? "" : builder.suffix; //$NON-NLS-1$ } - public FragmentAndParameters render(String prefix, String suffix) { + public FragmentAndParameters render() { FragmentCollector fragmentCollector = selectModel .queryExpressions() .map(this::renderQueryExpression) @@ -83,6 +87,8 @@ public static Builder withSelectModel(SelectModel selectModel) { public static class Builder { private SelectModel selectModel; private RenderingContext renderingContext; + private String prefix; + private String suffix; public Builder withRenderingContext(RenderingContext renderingContext) { this.renderingContext = renderingContext; @@ -94,6 +100,16 @@ public Builder withSelectModel(SelectModel selectModel) { return this; } + public Builder withPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + public Builder withSuffix(String suffix) { + this.suffix = suffix; + return this; + } + public SubQueryRenderer build() { return new SubQueryRenderer(this); } 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 ede734ece..24dfb190f 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 @@ -19,7 +19,6 @@ import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.TableExpressionVisitor; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.SubQuery; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -41,8 +40,12 @@ public FragmentAndParameters visit(SubQuery subQuery) { String suffix = subQuery.alias().map(a -> ") " + a) //$NON-NLS-1$ .orElse(")"); //$NON-NLS-1$ - return RendererFactory.createSubQueryRenderer(subQuery.selectModel(), "(", suffix) //$NON-NLS-1$ - .render(renderingContext); + return SubQueryRenderer.withSelectModel(subQuery.selectModel()) + .withRenderingContext(renderingContext) + .withPrefix("(")//$NON-NLS-1$ + .withSuffix(suffix) + .build() + .render(); } public static class Builder { diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java index f4ad201e5..2c828da91 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java @@ -26,8 +26,8 @@ import org.mybatis.dynamic.sql.common.CommonBuilder; import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.configuration.StatementConfiguration; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.Validator; @@ -83,8 +83,10 @@ public StatementConfiguration statementConfiguration() { @NotNull public UpdateStatementProvider render(RenderingStrategy renderingStrategy) { - return RendererFactory.createUpdateRenderer(this) - .render(renderingStrategy); + return UpdateRenderer.withUpdateModel(this) + .withRenderingStrategy(renderingStrategy) + .build() + .render(); } public static Builder withTable(SqlTable table) { 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 5464a253f..7bbe575fc 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 @@ -19,8 +19,8 @@ import java.util.Optional; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; import org.mybatis.dynamic.sql.util.ColumnToColumnMapping; import org.mybatis.dynamic.sql.util.ConstantMapping; @@ -84,10 +84,15 @@ public Optional visit(ValueWhenPresentMapping mapp @Override public Optional visit(SelectMapping mapping) { - FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(mapping.selectModel(), - renderingContext.aliasedColumnName(mapping.column()) + " = (", //$NON-NLS-1$ - ")") //$NON-NLS-1$ - .render(renderingContext); + String prefix = renderingContext.aliasedColumnName(mapping.column()) + " = ("; //$NON-NLS-1$ + + FragmentAndParameters fragmentAndParameters = SubQueryRenderer.withSelectModel(mapping.selectModel()) + .withRenderingContext(renderingContext) + .withPrefix(prefix) + .withSuffix(")") //$NON-NLS-1$ + .build() + .render(); + return Optional.of(fragmentAndParameters); } 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 6935b8b54..7e29a10d3 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 @@ -29,8 +29,8 @@ import org.mybatis.dynamic.sql.NotCriterion; import org.mybatis.dynamic.sql.SqlCriterion; import org.mybatis.dynamic.sql.SqlCriterionVisitor; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -119,10 +119,12 @@ private Optional renderColumnAndCondition(ColumnAndCo private FragmentAndParameters renderExists(ExistsCriterion criterion) { ExistsPredicate existsPredicate = criterion.existsPredicate(); - return RendererFactory.createSubQueryRenderer(existsPredicate.selectModelBuilder().build(), - existsPredicate.operator() + " (", //$NON-NLS-1$ - ")") //$NON-NLS-1$ - .render(renderingContext); + return SubQueryRenderer.withSelectModel(existsPredicate.selectModelBuilder().build()) + .withRenderingContext(renderingContext) + .withPrefix(existsPredicate.operator() + " (") //$NON-NLS-1$ + .withSuffix(")") //$NON-NLS-1$ + .build() + .render(); } private List renderSubCriteria(List subCriteria) { 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 c13633b1d..d5cdc0dd2 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,8 +29,8 @@ import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.ConditionVisitor; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; -import org.mybatis.dynamic.sql.render.RendererFactory; import org.mybatis.dynamic.sql.render.RenderingContext; +import org.mybatis.dynamic.sql.select.render.SubQueryRenderer; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; @@ -95,10 +95,12 @@ public FragmentAndParameters visit(AbstractTwoValueCondition condition) { @Override public FragmentAndParameters visit(AbstractSubselectCondition condition) { - return RendererFactory.createSubQueryRenderer(condition.selectModel(), - condition.operator() + " (", //$NON-NLS-1$ - ")") //$NON-NLS-1$ - .render(renderingContext); + return SubQueryRenderer.withSelectModel(condition.selectModel()) + .withRenderingContext(renderingContext) + .withPrefix(condition.operator() + " (") //$NON-NLS-1$ + .withSuffix(")") //$NON-NLS-1$ + .build() + .render(); } @Override From 1a374f81b4f139d2e5b3894e271918f1d299a60b Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 25 Nov 2024 13:31:36 -0500 Subject: [PATCH 11/13] Save some garbage in the providers --- .../DefaultDeleteStatementProvider.java | 2 +- ...DefaultGeneralInsertStatementProvider.java | 4 +- .../DefaultUpdateStatementProvider.java | 4 +- .../sql/util/FragmentAndParameters.java | 3 +- .../mybatis/dynamic/sql/where/WhereModel.java | 3 +- .../render/DefaultWhereClauseProvider.java | 63 +++++++++++++++++++ .../sql/where/render/WhereClauseProvider.java | 44 +------------ 7 files changed, 75 insertions(+), 48 deletions(-) create mode 100644 src/main/java/org/mybatis/dynamic/sql/where/render/DefaultWhereClauseProvider.java diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/render/DefaultDeleteStatementProvider.java b/src/main/java/org/mybatis/dynamic/sql/delete/render/DefaultDeleteStatementProvider.java index 89b72333b..ef2ade7f0 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/render/DefaultDeleteStatementProvider.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/render/DefaultDeleteStatementProvider.java @@ -25,7 +25,7 @@ public class DefaultDeleteStatementProvider implements DeleteStatementProvider { private DefaultDeleteStatementProvider(Builder builder) { deleteStatement = Objects.requireNonNull(builder.deleteStatement); - parameters = Objects.requireNonNull(builder.parameters); + parameters = builder.parameters; } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/DefaultGeneralInsertStatementProvider.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/DefaultGeneralInsertStatementProvider.java index de1c41266..5cd4144d6 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/DefaultGeneralInsertStatementProvider.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/DefaultGeneralInsertStatementProvider.java @@ -22,11 +22,11 @@ public class DefaultGeneralInsertStatementProvider implements GeneralInsertStatementProvider, InsertSelectStatementProvider { private final String insertStatement; - private final Map parameters = new HashMap<>(); + private final Map parameters; private DefaultGeneralInsertStatementProvider(Builder builder) { insertStatement = Objects.requireNonNull(builder.insertStatement); - parameters.putAll(builder.parameters); + parameters = builder.parameters; } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/DefaultUpdateStatementProvider.java b/src/main/java/org/mybatis/dynamic/sql/update/render/DefaultUpdateStatementProvider.java index a103bd604..c2f14fbd6 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/DefaultUpdateStatementProvider.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/DefaultUpdateStatementProvider.java @@ -21,11 +21,11 @@ public class DefaultUpdateStatementProvider implements UpdateStatementProvider { private final String updateStatement; - private final Map parameters = new HashMap<>(); + private final Map parameters; private DefaultUpdateStatementProvider(Builder builder) { updateStatement = Objects.requireNonNull(builder.updateStatement); - parameters.putAll(builder.parameters); + parameters = builder.parameters; } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java b/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java index 4c240120c..8f2b58aae 100644 --- a/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java +++ b/src/main/java/org/mybatis/dynamic/sql/util/FragmentAndParameters.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.util; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -28,7 +29,7 @@ public class FragmentAndParameters { private FragmentAndParameters(Builder builder) { fragment = Objects.requireNonNull(builder.fragment); - parameters = Objects.requireNonNull(builder.parameters); + parameters = Collections.unmodifiableMap(builder.parameters); } public String fragment() { 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 8db761223..5c99d68ff 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/WhereModel.java @@ -24,6 +24,7 @@ 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.where.render.DefaultWhereClauseProvider; import org.mybatis.dynamic.sql.where.render.WhereClauseProvider; import org.mybatis.dynamic.sql.where.render.WhereRenderer; @@ -92,7 +93,7 @@ private Optional render(RenderingContext renderingContext) } private WhereClauseProvider toWhereClauseProvider(FragmentAndParameters fragmentAndParameters) { - return WhereClauseProvider.withWhereClause(fragmentAndParameters.fragment()) + return DefaultWhereClauseProvider.withWhereClause(fragmentAndParameters.fragment()) .withParameters(fragmentAndParameters.parameters()) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultWhereClauseProvider.java b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultWhereClauseProvider.java new file mode 100644 index 000000000..bf68eb7cf --- /dev/null +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/DefaultWhereClauseProvider.java @@ -0,0 +1,63 @@ +/* + * Copyright 2016-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.where.render; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class DefaultWhereClauseProvider implements WhereClauseProvider { + private final String whereClause; + private final Map parameters; + + private DefaultWhereClauseProvider(Builder builder) { + whereClause = Objects.requireNonNull(builder.whereClause); + parameters = builder.parameters; + } + + @Override + public Map getParameters() { + return parameters; + } + + @Override + public String getWhereClause() { + return whereClause; + } + + public static Builder withWhereClause(String whereClause) { + return new Builder().withWhereClause(whereClause); + } + + public static class Builder { + private String whereClause; + private final Map parameters = new HashMap<>(); + + public Builder withWhereClause(String whereClause) { + this.whereClause = whereClause; + return this; + } + + public Builder withParameters(Map parameters) { + this.parameters.putAll(parameters); + return this; + } + + public DefaultWhereClauseProvider build() { + return new DefaultWhereClauseProvider(this); + } + } +} diff --git a/src/main/java/org/mybatis/dynamic/sql/where/render/WhereClauseProvider.java b/src/main/java/org/mybatis/dynamic/sql/where/render/WhereClauseProvider.java index 37d051e81..1e8d16be5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/render/WhereClauseProvider.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/render/WhereClauseProvider.java @@ -15,48 +15,10 @@ */ package org.mybatis.dynamic.sql.where.render; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; -import java.util.Objects; -public class WhereClauseProvider { - private final String whereClause; - private final Map parameters; +public interface WhereClauseProvider { + Map getParameters(); - private WhereClauseProvider(Builder builder) { - whereClause = Objects.requireNonNull(builder.whereClause); - parameters = Objects.requireNonNull(builder.parameters); - } - - public Map getParameters() { - return Collections.unmodifiableMap(parameters); - } - - public String getWhereClause() { - return whereClause; - } - - public static Builder withWhereClause(String whereClause) { - return new Builder().withWhereClause(whereClause); - } - - public static class Builder { - private String whereClause; - private final Map parameters = new HashMap<>(); - - public Builder withWhereClause(String whereClause) { - this.whereClause = whereClause; - return this; - } - - public Builder withParameters(Map parameters) { - this.parameters.putAll(parameters); - return this; - } - - public WhereClauseProvider build() { - return new WhereClauseProvider(this); - } - } + String getWhereClause(); } From 961e37b0aa1b67ba259a4ae8a6c421213b5bf41b Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sat, 28 Dec 2024 09:20:47 -0500 Subject: [PATCH 12/13] Update Java Matrix --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5a6947c02..7f41206e9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,7 +9,7 @@ jobs: matrix: cache: [maven] distribution: [temurin] - java: [17, 21, 22, 23-ea] + java: [17, 21, 23, 24-ea, 25-ea] os: [ubuntu-latest] fail-fast: false max-parallel: 4 From 17ac0c06d3885967ebb039417566c6d2aa850c60 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sat, 28 Dec 2024 09:29:26 -0500 Subject: [PATCH 13/13] Update Java Matrix and test containers versions --- .github/workflows/ci.yaml | 2 +- src/test/java/config/TestContainersConfiguration.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7f41206e9..e89bd81b6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,7 +9,7 @@ jobs: matrix: cache: [maven] distribution: [temurin] - java: [17, 21, 23, 24-ea, 25-ea] + java: [17, 21, 23, 24-ea] os: [ubuntu-latest] fail-fast: false max-parallel: 4 diff --git a/src/test/java/config/TestContainersConfiguration.java b/src/test/java/config/TestContainersConfiguration.java index fc6607dbb..1919fc0f9 100644 --- a/src/test/java/config/TestContainersConfiguration.java +++ b/src/test/java/config/TestContainersConfiguration.java @@ -21,6 +21,6 @@ * Utility interface to hold Docker image tags for the test containers we use */ public interface TestContainersConfiguration { - DockerImageName POSTGRES_LATEST = DockerImageName.parse("postgres:17.0"); - DockerImageName MARIADB_LATEST = DockerImageName.parse("mariadb:11.5.2"); + DockerImageName POSTGRES_LATEST = DockerImageName.parse("postgres:17.2"); + DockerImageName MARIADB_LATEST = DockerImageName.parse("mariadb:11.6.2"); }