Skip to content

Commit 8263897

Browse files
authored
Merge pull request #831 from jeffgbutler/column-hierarchy-refactoring
Allow Case Expressions in the Sum Function
2 parents e2d75aa + 406220c commit 8263897

File tree

26 files changed

+150
-56
lines changed

26 files changed

+150
-56
lines changed

CHANGELOG.md

+16-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,25 @@ This log will detail notable changes to MyBatis Dynamic SQL. Full details are av
44

55
## Release 2.0.0 - Unreleased
66

7-
Significant changes:
7+
Release 2.0.0 is a significant milestone for the library. We have moved to Java 17 as the minimum version supported. If
8+
you are unable to move to this version of Java then the releases in the 1.x line can be used with Java 8.
9+
10+
In addition, we have taken the opportunity to make changes to the library that may break existing code. We have
11+
worked to make these changes as minimal as possible.
12+
13+
**Potentially Breaking Changes:**
14+
15+
- If you have implemented any custom functions, you will likely need to make changes. The supplied base classes now
16+
hold an instance of `BasicColumn` rather than `BindableColumn`. This change was made to make the functions more
17+
useful in variety of circumstances. If you follow the patterns shown on the
18+
[Extending the Library](https://mybatis.org/mybatis-dynamic-sql/docs/extending.html) page, the change should be
19+
limited to changing the private constructor to accept `BasicColumn` rather than `BindableColumn`.
20+
21+
Other important changes:
822

923
- The library now requires Java 17
1024
- Deprecated code from prior releases is removed
11-
- Allow CASE expressions in ORDER BY Clauses
25+
- We now allow CASE expressions in ORDER BY Clauses
1226

1327
## Release 1.5.2 - June 3, 2024
1428

pom.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@
6868
<module.name>org.mybatis.dynamic.sql</module.name>
6969

7070
<kotlin.version>2.0.10</kotlin.version>
71-
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
71+
<kotlin.compiler.jvmTarget>17</kotlin.compiler.jvmTarget>
72+
<kotlin.compiler.languageVersion>2.0</kotlin.compiler.languageVersion>
73+
<kotlin.compiler.apiVersion>2.0</kotlin.compiler.apiVersion>
7274

7375
<sonar.sources>pom.xml,src/main/java,src/main/kotlin</sonar.sources>
7476
<sonar.tests>src/test/java,src/test/kotlin</sonar.tests>

src/main/java/org/mybatis/dynamic/sql/BasicColumn.java

+14
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
*/
1616
package org.mybatis.dynamic.sql;
1717

18+
import java.sql.JDBCType;
1819
import java.util.Optional;
1920

2021
import org.mybatis.dynamic.sql.render.RenderingContext;
22+
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2123
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2224

2325
/**
@@ -58,6 +60,18 @@ public interface BasicColumn {
5860
*/
5961
FragmentAndParameters render(RenderingContext renderingContext);
6062

63+
default Optional<JDBCType> jdbcType() {
64+
return Optional.empty();
65+
}
66+
67+
default Optional<String> typeHandler() {
68+
return Optional.empty();
69+
}
70+
71+
default Optional<RenderingStrategy> renderingStrategy() {
72+
return Optional.empty();
73+
}
74+
6175
/**
6276
* Utility method to make it easier to build column lists for methods that require an
6377
* array rather than the varargs method.

src/main/java/org/mybatis/dynamic/sql/BindableColumn.java

+2-17
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@
1515
*/
1616
package org.mybatis.dynamic.sql;
1717

18-
import java.sql.JDBCType;
1918
import java.util.Optional;
2019

21-
import org.mybatis.dynamic.sql.render.RenderingStrategy;
22-
2320
/**
24-
* Describes additional attributes of columns that are necessary for binding the column as a JDBC parameter.
25-
* Columns in where clauses are typically bound.
21+
* Describes a column with a known data type. The type is only used by the compiler to assure type safety
22+
* when building clauses with conditions.
2623
*
2724
* @author Jeff Butler
2825
*
@@ -37,18 +34,6 @@ public interface BindableColumn<T> extends BasicColumn {
3734
@Override
3835
BindableColumn<T> as(String alias);
3936

40-
default Optional<JDBCType> jdbcType() {
41-
return Optional.empty();
42-
}
43-
44-
default Optional<String> typeHandler() {
45-
return Optional.empty();
46-
}
47-
48-
default Optional<RenderingStrategy> renderingStrategy() {
49-
return Optional.empty();
50-
}
51-
5237
default Object convertParameterType(T value) {
5338
return value;
5439
}

src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java

+4
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,10 @@ static <T> Sum<T> sum(BindableColumn<T> column) {
497497
return Sum.of(column);
498498
}
499499

500+
static Sum<Object> sum(BasicColumn column) {
501+
return Sum.of(column);
502+
}
503+
500504
static <T> Sum<T> sum(BindableColumn<T> column, VisitableCondition<T> condition) {
501505
return Sum.of(column, condition);
502506
}

src/main/java/org/mybatis/dynamic/sql/select/aggregate/Avg.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.aggregate;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
2122
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2223

2324
public class Avg<T> extends AbstractUniTypeFunction<T, Avg<T>> {
2425

25-
private Avg(BindableColumn<T> column) {
26+
private Avg(BasicColumn column) {
2627
super(column);
2728
}
2829

src/main/java/org/mybatis/dynamic/sql/select/aggregate/Max.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.aggregate;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
2122
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2223

2324
public class Max<T> extends AbstractUniTypeFunction<T, Max<T>> {
2425

25-
private Max(BindableColumn<T> column) {
26+
private Max(BasicColumn column) {
2627
super(column);
2728
}
2829

src/main/java/org/mybatis/dynamic/sql/select/aggregate/Min.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.aggregate;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
2122
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2223

2324
public class Min<T> extends AbstractUniTypeFunction<T, Min<T>> {
2425

25-
private Min(BindableColumn<T> column) {
26+
private Min(BasicColumn column) {
2627
super(column);
2728
}
2829

src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.function.Function;
1919

20+
import org.mybatis.dynamic.sql.BasicColumn;
2021
import org.mybatis.dynamic.sql.BindableColumn;
2122
import org.mybatis.dynamic.sql.VisitableCondition;
2223
import org.mybatis.dynamic.sql.render.RenderingContext;
@@ -28,7 +29,7 @@
2829
public class Sum<T> extends AbstractUniTypeFunction<T, Sum<T>> {
2930
private final Function<RenderingContext, FragmentAndParameters> renderer;
3031

31-
private Sum(BindableColumn<T> column) {
32+
private Sum(BasicColumn column) {
3233
super(column);
3334
renderer = rc -> column.render(rc).mapFragment(this::applyAggregate);
3435
}
@@ -48,7 +49,7 @@ private Sum(BindableColumn<T> column, VisitableCondition<T> condition) {
4849
};
4950
}
5051

51-
private Sum(BindableColumn<T> column, Function<RenderingContext, FragmentAndParameters> renderer) {
52+
private Sum(BasicColumn column, Function<RenderingContext, FragmentAndParameters> renderer) {
5253
super(column);
5354
this.renderer = renderer;
5455
}
@@ -71,6 +72,10 @@ public static <T> Sum<T> of(BindableColumn<T> column) {
7172
return new Sum<>(column);
7273
}
7374

75+
public static Sum<Object> of(BasicColumn column) {
76+
return new Sum<>(column);
77+
}
78+
7479
public static <T> Sum<T> of(BindableColumn<T> column, VisitableCondition<T> condition) {
7580
return new Sum<>(column, condition);
7681
}

src/main/java/org/mybatis/dynamic/sql/select/function/AbstractTypeConvertingFunction.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Objects;
1919
import java.util.Optional;
2020

21+
import org.mybatis.dynamic.sql.BasicColumn;
2122
import org.mybatis.dynamic.sql.BindableColumn;
2223

2324
/**
@@ -36,10 +37,10 @@
3637
*/
3738
public abstract class AbstractTypeConvertingFunction<T, R, U extends AbstractTypeConvertingFunction<T, R, U>>
3839
implements BindableColumn<R> {
39-
protected final BindableColumn<T> column;
40+
protected final BasicColumn column;
4041
protected String alias;
4142

42-
protected AbstractTypeConvertingFunction(BindableColumn<T> column) {
43+
protected AbstractTypeConvertingFunction(BasicColumn column) {
4344
this.column = Objects.requireNonNull(column);
4445
}
4546

src/main/java/org/mybatis/dynamic/sql/select/function/AbstractUniTypeFunction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import java.sql.JDBCType;
1919
import java.util.Optional;
2020

21-
import org.mybatis.dynamic.sql.BindableColumn;
21+
import org.mybatis.dynamic.sql.BasicColumn;
2222

2323
/**
2424
* Represents a function that does not change the underlying data type.
@@ -33,7 +33,7 @@
3333
public abstract class AbstractUniTypeFunction<T, U extends AbstractUniTypeFunction<T, U>>
3434
extends AbstractTypeConvertingFunction<T, T, U> {
3535

36-
protected AbstractUniTypeFunction(BindableColumn<T> column) {
36+
protected AbstractUniTypeFunction(BasicColumn column) {
3737
super(column);
3838
}
3939

src/main/java/org/mybatis/dynamic/sql/select/function/Add.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class Add<T> extends OperatorFunction<T> {
2525

26-
private Add(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
private Add(BasicColumn firstColumn, BasicColumn secondColumn,
2727
List<BasicColumn> subsequentColumns) {
2828
super("+", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$
2929
}

src/main/java/org/mybatis/dynamic/sql/select/function/Concat.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
public class Concat<T> extends AbstractUniTypeFunction<T, Concat<T>> {
3030
private final List<BasicColumn> allColumns = new ArrayList<>();
3131

32-
protected Concat(BindableColumn<T> firstColumn, List<BasicColumn> subsequentColumns) {
32+
protected Concat(BasicColumn firstColumn, List<BasicColumn> subsequentColumns) {
3333
super(firstColumn);
3434
allColumns.add(firstColumn);
3535
this.allColumns.addAll(subsequentColumns);

src/main/java/org/mybatis/dynamic/sql/select/function/Concatenate.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class Concatenate<T> extends OperatorFunction<T> {
2525

26-
protected Concatenate(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
protected Concatenate(BasicColumn firstColumn, BasicColumn secondColumn,
2727
List<BasicColumn> subsequentColumns) {
2828
super("||", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$
2929
}

src/main/java/org/mybatis/dynamic/sql/select/function/Divide.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class Divide<T> extends OperatorFunction<T> {
2525

26-
private Divide(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
private Divide(BasicColumn firstColumn, BasicColumn secondColumn,
2727
List<BasicColumn> subsequentColumns) {
2828
super("/", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$
2929
}

src/main/java/org/mybatis/dynamic/sql/select/function/Lower.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.function;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2122

2223
public class Lower<T> extends AbstractUniTypeFunction<T, Lower<T>> {
2324

24-
private Lower(BindableColumn<T> column) {
25+
private Lower(BasicColumn column) {
2526
super(column);
2627
}
2728

src/main/java/org/mybatis/dynamic/sql/select/function/Multiply.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class Multiply<T> extends OperatorFunction<T> {
2525

26-
private Multiply(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
private Multiply(BasicColumn firstColumn, BasicColumn secondColumn,
2727
List<BasicColumn> subsequentColumns) {
2828
super("*", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$
2929
}

src/main/java/org/mybatis/dynamic/sql/select/function/OperatorFunction.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class OperatorFunction<T> extends AbstractUniTypeFunction<T, OperatorFunc
3535
protected final List<BasicColumn> subsequentColumns = new ArrayList<>();
3636
private final String operator;
3737

38-
protected OperatorFunction(String operator, BindableColumn<T> firstColumn, BasicColumn secondColumn,
38+
protected OperatorFunction(String operator, BasicColumn firstColumn, BasicColumn secondColumn,
3939
List<BasicColumn> subsequentColumns) {
4040
super(firstColumn);
4141
this.secondColumn = Objects.requireNonNull(secondColumn);
@@ -52,9 +52,7 @@ protected OperatorFunction<T> copy() {
5252
public FragmentAndParameters render(RenderingContext renderingContext) {
5353
String paddedOperator = " " + operator + " "; //$NON-NLS-1$ //$NON-NLS-2$
5454

55-
// note - the cast below is added for type inference issues in some compilers
56-
return Stream.of(Stream.of((BasicColumn) column),
57-
Stream.of(secondColumn), subsequentColumns.stream())
55+
return Stream.of(Stream.of(column, secondColumn), subsequentColumns.stream())
5856
.flatMap(Function.identity())
5957
.map(column -> column.render(renderingContext))
6058
.collect(FragmentCollector.collect())

src/main/java/org/mybatis/dynamic/sql/select/function/Substring.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.function;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
@@ -24,7 +25,7 @@ public class Substring<T> extends AbstractUniTypeFunction<T, Substring<T>> {
2425
private final int offset;
2526
private final int length;
2627

27-
private Substring(BindableColumn<T> column, int offset, int length) {
28+
private Substring(BasicColumn column, int offset, int length) {
2829
super(column);
2930
this.offset = offset;
3031
this.length = length;

src/main/java/org/mybatis/dynamic/sql/select/function/Subtract.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class Subtract<T> extends OperatorFunction<T> {
2525

26-
private Subtract(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
private Subtract(BasicColumn firstColumn, BasicColumn secondColumn,
2727
List<BasicColumn> subsequentColumns) {
2828
super("-", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$
2929
}

src/main/java/org/mybatis/dynamic/sql/select/function/Upper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.function;
1717

18+
import org.mybatis.dynamic.sql.BasicColumn;
1819
import org.mybatis.dynamic.sql.BindableColumn;
1920
import org.mybatis.dynamic.sql.render.RenderingContext;
2021
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2122

2223
public class Upper<T> extends AbstractUniTypeFunction<T, Upper<T>> {
2324

24-
private Upper(BindableColumn<T> column) {
25+
private Upper(BasicColumn column) {
2526
super(column);
2627
}
2728

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt

+2
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ fun <T> avg(column: BindableColumn<T>): Avg<T> = SqlBuilder.avg(column)
137137

138138
fun <T> sum(column: BindableColumn<T>): Sum<T> = SqlBuilder.sum(column)
139139

140+
fun sum(column: BasicColumn): Sum<*> = SqlBuilder.sum(column)
141+
140142
fun <T> sum(column: BindableColumn<T>, condition: VisitableCondition<T>): Sum<T> = SqlBuilder.sum(column, condition)
141143

142144
// constants

0 commit comments

Comments
 (0)