Skip to content

Commit 4a4ff06

Browse files
authoredFeb 12, 2025··
Merge pull request #908 from jeffgbutler/general-optimizations
General optimizations
2 parents c39ef30 + 716ed06 commit 4a4ff06

11 files changed

+49
-76
lines changed
 

‎src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.mybatis.dynamic.sql.common.OrderByModel;
2828
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
2929
import org.mybatis.dynamic.sql.util.Buildable;
30-
import org.mybatis.dynamic.sql.util.Utilities;
3130
import org.mybatis.dynamic.sql.where.AbstractWhereFinisher;
3231
import org.mybatis.dynamic.sql.where.AbstractWhereStarter;
3332
import org.mybatis.dynamic.sql.where.EmbeddedWhereModel;
@@ -51,7 +50,7 @@ private DeleteDSL(SqlTable table, @Nullable String tableAlias, Function<DeleteMo
5150

5251
@Override
5352
public DeleteWhereBuilder where() {
54-
whereBuilder = Utilities.buildIfNecessary(whereBuilder, DeleteWhereBuilder::new);
53+
whereBuilder = Objects.requireNonNullElseGet(whereBuilder, DeleteWhereBuilder::new);
5554
return whereBuilder;
5655
}
5756

‎src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.mybatis.dynamic.sql.SqlTable;
2626
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
2727
import org.mybatis.dynamic.sql.util.Buildable;
28-
import org.mybatis.dynamic.sql.util.Utilities;
2928
import org.mybatis.dynamic.sql.where.AbstractWhereFinisher;
3029
import org.mybatis.dynamic.sql.where.EmbeddedWhereModel;
3130

@@ -54,7 +53,7 @@ private CountDSL(BasicColumn countColumn, SqlTable table, Function<SelectModel,
5453

5554
@Override
5655
public CountWhereBuilder where() {
57-
whereBuilder = Utilities.buildIfNecessary(whereBuilder, CountWhereBuilder::new);
56+
whereBuilder = Objects.requireNonNullElseGet(whereBuilder, CountWhereBuilder::new);
5857
return whereBuilder;
5958
}
6059

‎src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -61,29 +61,29 @@ public MultiSelectDSL orderBy(Collection<? extends SortSpecification> columns) {
6161
return this;
6262
}
6363

64-
public LimitFinisher limit(long limit) {
64+
public MultiSelectDSL.LimitFinisher limit(long limit) {
6565
return limitWhenPresent(limit);
6666
}
6767

68-
public LimitFinisher limitWhenPresent(@Nullable Long limit) {
68+
public MultiSelectDSL.LimitFinisher limitWhenPresent(@Nullable Long limit) {
6969
this.limit = limit;
7070
return new LimitFinisher();
7171
}
7272

73-
public OffsetFirstFinisher offset(long offset) {
73+
public MultiSelectDSL.OffsetFirstFinisher offset(long offset) {
7474
return offsetWhenPresent(offset);
7575
}
7676

77-
public OffsetFirstFinisher offsetWhenPresent(@Nullable Long offset) {
77+
public MultiSelectDSL.OffsetFirstFinisher offsetWhenPresent(@Nullable Long offset) {
7878
this.offset = offset;
7979
return new OffsetFirstFinisher();
8080
}
8181

82-
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
82+
public MultiSelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
8383
return fetchFirstWhenPresent(fetchFirstRows);
8484
}
8585

86-
public FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
86+
public MultiSelectDSL.FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
8787
this.fetchFirstRows = fetchFirstRows;
8888
return new FetchFirstFinisher();
8989
}

‎src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
3838
import org.mybatis.dynamic.sql.select.join.JoinType;
3939
import org.mybatis.dynamic.sql.util.Buildable;
40-
import org.mybatis.dynamic.sql.util.Utilities;
4140
import org.mybatis.dynamic.sql.where.AbstractWhereFinisher;
4241
import org.mybatis.dynamic.sql.where.AbstractWhereStarter;
4342
import org.mybatis.dynamic.sql.where.EmbeddedWhereModel;
@@ -70,7 +69,7 @@ protected QueryExpressionDSL(FromGatherer<R> fromGatherer, SqlTable table, Strin
7069

7170
@Override
7271
public QueryExpressionWhereBuilder where() {
73-
whereBuilder = Utilities.buildIfNecessary(whereBuilder, QueryExpressionWhereBuilder::new);
72+
whereBuilder = Objects.requireNonNullElseGet(whereBuilder, QueryExpressionWhereBuilder::new);
7473
return whereBuilder;
7574
}
7675

@@ -86,7 +85,7 @@ public QueryExpressionDSL<R> configureStatement(Consumer<StatementConfiguration>
8685
* @return The having builder
8786
*/
8887
protected QueryExpressionHavingBuilder having() {
89-
havingBuilder = Utilities.buildIfNecessary(havingBuilder, QueryExpressionHavingBuilder::new);
88+
havingBuilder = Objects.requireNonNullElseGet(havingBuilder, QueryExpressionHavingBuilder::new);
9089
return havingBuilder;
9190
}
9291

‎src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -110,29 +110,29 @@ void orderBy(Collection<? extends SortSpecification> columns) {
110110
orderByModel = OrderByModel.of(columns);
111111
}
112112

113-
public LimitFinisher limit(long limit) {
113+
public SelectDSL<R>.LimitFinisher limit(long limit) {
114114
return limitWhenPresent(limit);
115115
}
116116

117-
public LimitFinisher limitWhenPresent(@Nullable Long limit) {
117+
public SelectDSL<R>.LimitFinisher limitWhenPresent(@Nullable Long limit) {
118118
this.limit = limit;
119119
return new LimitFinisher();
120120
}
121121

122-
public OffsetFirstFinisher offset(long offset) {
122+
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
123123
return offsetWhenPresent(offset);
124124
}
125125

126-
public OffsetFirstFinisher offsetWhenPresent(@Nullable Long offset) {
126+
public SelectDSL<R>.OffsetFirstFinisher offsetWhenPresent(@Nullable Long offset) {
127127
this.offset = offset;
128128
return new OffsetFirstFinisher();
129129
}
130130

131-
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
131+
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
132132
return fetchFirstWhenPresent(fetchFirstRows);
133133
}
134134

135-
public FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
135+
public SelectDSL<R>.FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
136136
this.fetchFirstRows = fetchFirstRows;
137137
return new FetchFirstFinisher();
138138
}

‎src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.mybatis.dynamic.sql.util.NullMapping;
4040
import org.mybatis.dynamic.sql.util.SelectMapping;
4141
import org.mybatis.dynamic.sql.util.StringConstantMapping;
42-
import org.mybatis.dynamic.sql.util.Utilities;
4342
import org.mybatis.dynamic.sql.util.ValueMapping;
4443
import org.mybatis.dynamic.sql.util.ValueOrNullMapping;
4544
import org.mybatis.dynamic.sql.util.ValueWhenPresentMapping;
@@ -71,7 +70,7 @@ public <T> SetClauseFinisher<T> set(SqlColumn<T> column) {
7170

7271
@Override
7372
public UpdateWhereBuilder where() {
74-
whereBuilder = Utilities.buildIfNecessary(whereBuilder, UpdateWhereBuilder::new);
73+
whereBuilder = Objects.requireNonNullElseGet(whereBuilder, UpdateWhereBuilder::new);
7574
return whereBuilder;
7675
}
7776

‎src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java

+3-12
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.mybatis.dynamic.sql.update.render;
1717

18-
import java.util.List;
1918
import java.util.Objects;
2019
import java.util.Optional;
2120
import java.util.stream.Collectors;
@@ -77,23 +76,15 @@ private FragmentAndParameters calculateUpdateStatementStart() {
7776
}
7877

7978
private FragmentAndParameters calculateSetPhrase() {
80-
List<Optional<FragmentAndParameters>> fragmentsAndParameters = updateModel.columnMappings()
79+
FragmentCollector fragmentCollector = updateModel.columnMappings()
8180
.map(m -> m.accept(visitor))
82-
.toList();
83-
84-
Validator.assertFalse(fragmentsAndParameters.stream().noneMatch(Optional::isPresent),
85-
"ERROR.18"); //$NON-NLS-1$
86-
87-
FragmentCollector fragmentCollector = fragmentsAndParameters.stream()
8881
.flatMap(Optional::stream)
8982
.collect(FragmentCollector.collect());
9083

91-
return toSetPhrase(fragmentCollector);
92-
}
84+
Validator.assertFalse(fragmentCollector.isEmpty(), "ERROR.18"); //$NON-NLS-1$
9385

94-
private FragmentAndParameters toSetPhrase(FragmentCollector fragmentCollector) {
9586
return fragmentCollector.toFragmentAndParameters(
96-
Collectors.joining(", ", "set ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
87+
Collectors.joining(", ", "set ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
9788
}
9889

9990
private Optional<FragmentAndParameters> calculateWhereClause() {

‎src/main/java/org/mybatis/dynamic/sql/util/FragmentCollector.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
package org.mybatis.dynamic.sql.util;
1717

1818
import java.util.ArrayList;
19+
import java.util.Collections;
1920
import java.util.HashMap;
2021
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Optional;
2324
import java.util.stream.Collector;
2425

2526
public class FragmentCollector {
26-
final List<FragmentAndParameters> fragments = new ArrayList<>();
27+
final List<String> fragments = new ArrayList<>();
28+
final Map<String, Object> parameters = new HashMap<>();
2729

2830
public FragmentCollector() {
2931
super();
@@ -34,20 +36,22 @@ private FragmentCollector(FragmentAndParameters initialFragment) {
3436
}
3537

3638
public void add(FragmentAndParameters fragmentAndParameters) {
37-
fragments.add(fragmentAndParameters);
39+
fragments.add(fragmentAndParameters.fragment());
40+
parameters.putAll(fragmentAndParameters.parameters());
3841
}
3942

4043
public FragmentCollector merge(FragmentCollector other) {
4144
fragments.addAll(other.fragments);
45+
parameters.putAll(other.parameters);
4246
return this;
4347
}
4448

4549
public Optional<String> firstFragment() {
46-
return fragments.stream().findFirst().map(FragmentAndParameters::fragment);
50+
return fragments.stream().findFirst();
4751
}
4852

4953
public String collectFragments(Collector<CharSequence, ?, String> fragmentCollector) {
50-
return fragments.stream().map(FragmentAndParameters::fragment).collect(fragmentCollector);
54+
return fragments.stream().collect(fragmentCollector);
5155
}
5256

5357
public FragmentAndParameters toFragmentAndParameters(Collector<CharSequence, ?, String> fragmentCollector) {
@@ -57,9 +61,7 @@ public FragmentAndParameters toFragmentAndParameters(Collector<CharSequence, ?,
5761
}
5862

5963
public Map<String, Object> parameters() {
60-
return fragments.stream()
61-
.map(FragmentAndParameters::parameters)
62-
.collect(HashMap::new, HashMap::putAll, HashMap::putAll);
64+
return Collections.unmodifiableMap(parameters);
6365
}
6466

6567
public boolean hasMultipleFragments() {

‎src/main/java/org/mybatis/dynamic/sql/util/Utilities.java

-5
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,12 @@
1717

1818
import java.util.Collection;
1919
import java.util.Objects;
20-
import java.util.function.Supplier;
2120
import java.util.stream.Stream;
2221

2322
import org.jspecify.annotations.NonNull;
2423
import org.jspecify.annotations.Nullable;
2524

2625
public interface Utilities {
27-
static <T> T buildIfNecessary(@Nullable T current, @NonNull Supplier<T> builder) {
28-
return current == null ? builder.get() : current;
29-
}
30-
3126
static long safelyUnbox(@Nullable Long l) {
3227
return l == null ? 0 : l;
3328
}

‎src/main/java/org/mybatis/dynamic/sql/where/render/ColumnAndConditionRenderer.java

+16-18
Original file line numberDiff line numberDiff line change
@@ -15,45 +15,43 @@
1515
*/
1616
package org.mybatis.dynamic.sql.where.render;
1717

18-
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
19-
2018
import java.util.Objects;
19+
import java.util.stream.Collectors;
2120

2221
import org.jspecify.annotations.Nullable;
2322
import org.mybatis.dynamic.sql.BindableColumn;
2423
import org.mybatis.dynamic.sql.VisitableCondition;
2524
import org.mybatis.dynamic.sql.render.RenderingContext;
2625
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
26+
import org.mybatis.dynamic.sql.util.FragmentCollector;
2727

2828
public class ColumnAndConditionRenderer<T> {
2929
private final BindableColumn<T> column;
3030
private final VisitableCondition<T> condition;
3131
private final RenderingContext renderingContext;
32+
private final DefaultConditionVisitor<T> visitor;
3233

3334
private ColumnAndConditionRenderer(Builder<T> builder) {
3435
column = Objects.requireNonNull(builder.column);
3536
condition = Objects.requireNonNull(builder.condition);
3637
renderingContext = Objects.requireNonNull(builder.renderingContext);
37-
}
38-
39-
public FragmentAndParameters render() {
40-
FragmentAndParameters renderedLeftColumn = column.alias()
41-
.map(FragmentAndParameters::fromFragment)
42-
.orElseGet(() -> column.render(renderingContext));
43-
44-
DefaultConditionVisitor<T> visitor = DefaultConditionVisitor.withColumn(column)
38+
visitor = DefaultConditionVisitor.withColumn(column)
4539
.withRenderingContext(renderingContext)
4640
.build();
41+
}
4742

48-
FragmentAndParameters renderedCondition = condition.accept(visitor);
49-
50-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
51-
+ spaceBefore(renderedCondition.fragment());
43+
public FragmentAndParameters render() {
44+
FragmentCollector fc = new FragmentCollector();
45+
fc.add(renderLeftColumn());
46+
fc.add(condition.accept(visitor));
47+
return fc.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
48+
}
5249

53-
return FragmentAndParameters.withFragment(finalFragment)
54-
.withParameters(renderedLeftColumn.parameters())
55-
.withParameters(renderedCondition.parameters())
56-
.build();
50+
private FragmentAndParameters renderLeftColumn() {
51+
return column.alias()
52+
.map(FragmentAndParameters::fromFragment)
53+
.orElseGet(() -> column.render(renderingContext))
54+
.mapFragment(condition::overrideRenderedLeftColumn);
5755
}
5856

5957
public static class Builder<T> {

‎src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java

+4-13
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,10 @@ private DefaultConditionVisitor(Builder<T> builder) {
4747

4848
@Override
4949
public FragmentAndParameters visit(AbstractListValueCondition<T> condition) {
50-
FragmentCollector fc = condition.values()
51-
.map(this::toFragmentAndParameters)
52-
.collect(FragmentCollector.collect());
53-
54-
String joinedFragments =
55-
fc.collectFragments(Collectors.joining(",", "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
56-
String finalFragment = condition.operator()
57-
+ spaceBefore(joinedFragments);
58-
59-
return FragmentAndParameters
60-
.withFragment(finalFragment)
61-
.withParameters(fc.parameters())
62-
.build();
50+
return condition.values().map(this::toFragmentAndParameters)
51+
.collect(FragmentCollector.collect())
52+
.toFragmentAndParameters(Collectors.joining(",", //$NON-NLS-1$
53+
condition.operator() + " (", ")")); //$NON-NLS-1$ //$NON-NLS-2$
6354
}
6455

6556
@Override

0 commit comments

Comments
 (0)
Please sign in to comment.