Skip to content

Commit 42646b5

Browse files
committed
Refactor column hierarchy so we can build un-typed functions
1 parent b938d32 commit 42646b5

File tree

23 files changed

+110
-44
lines changed

23 files changed

+110
-44
lines changed

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

Lines changed: 14 additions & 0 deletions
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

Lines changed: 2 additions & 17 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 7 additions & 2 deletions
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 4 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 2 additions & 0 deletions
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

src/test/java/examples/animal/data/Length.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
import java.sql.JDBCType;
1919
import java.util.Optional;
2020

21+
import org.mybatis.dynamic.sql.BasicColumn;
2122
import org.mybatis.dynamic.sql.BindableColumn;
2223
import org.mybatis.dynamic.sql.render.RenderingContext;
2324
import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction;
2425
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2526

2627
public class Length extends AbstractTypeConvertingFunction<Object, Integer, Length> {
27-
private Length(BindableColumn<Object> column) {
28+
private Length(BasicColumn column) {
2829
super(column);
2930
}
3031

@@ -48,8 +49,6 @@ protected Length copy() {
4849
}
4950

5051
public static Length length(BindableColumn<?> column) {
51-
@SuppressWarnings("unchecked")
52-
BindableColumn<Object> c = (BindableColumn<Object>) column;
53-
return new Length(c);
52+
return new Length(column);
5453
}
5554
}

src/test/java/examples/type_conversion/ToBase64.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
import java.sql.JDBCType;
1919
import java.util.Optional;
2020

21+
import org.mybatis.dynamic.sql.BasicColumn;
2122
import org.mybatis.dynamic.sql.BindableColumn;
2223
import org.mybatis.dynamic.sql.render.RenderingContext;
2324
import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction;
2425
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2526

2627
public class ToBase64 extends AbstractTypeConvertingFunction<byte[], String, ToBase64> {
2728

28-
protected ToBase64(BindableColumn<byte[]> column) {
29+
protected ToBase64(BasicColumn column) {
2930
super(column);
3031
}
3132

0 commit comments

Comments
 (0)