Skip to content

Commit 247e7f5

Browse files
authored
Merge pull request #21 from jeffgbutler/master
Add support for arithmetic expressions and constants
2 parents c0980e9 + 25fb8c0 commit 247e7f5

File tree

16 files changed

+675
-92
lines changed

16 files changed

+675
-92
lines changed

pom.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@
3030
<inceptionYear>2016</inceptionYear>
3131

3232
<properties>
33-
<maven.compiler.source>1.8</maven.compiler.source>
34-
<maven.compiler.target>1.8</maven.compiler.target>
35-
<maven.compiler.testTarget>1.8</maven.compiler.testTarget>
36-
<maven.compiler.testSource>1.8</maven.compiler.testSource>
33+
<java.version>8</java.version>
34+
<maven.compiler.source>${java.version}</maven.compiler.source>
35+
<maven.compiler.target>${java.version}</maven.compiler.target>
36+
<maven.compiler.testTarget>${java.version}</maven.compiler.testTarget>
37+
<maven.compiler.testSource>${java.version}</maven.compiler.testSource>
3738
<junit.jupiter.version>5.0.2</junit.jupiter.version>
3839
<junit.platform.version>1.0.2</junit.platform.version>
3940
<clirr.comparisonVersion>1.0.0</clirr.comparisonVersion>

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@
3535
import org.mybatis.dynamic.sql.select.aggregate.Min;
3636
import org.mybatis.dynamic.sql.select.aggregate.Sum;
3737
import org.mybatis.dynamic.sql.select.function.Add;
38+
import org.mybatis.dynamic.sql.select.function.Constant;
39+
import org.mybatis.dynamic.sql.select.function.Divide;
3840
import org.mybatis.dynamic.sql.select.function.Lower;
41+
import org.mybatis.dynamic.sql.select.function.Multiply;
3942
import org.mybatis.dynamic.sql.select.function.Substring;
43+
import org.mybatis.dynamic.sql.select.function.Subtract;
4044
import org.mybatis.dynamic.sql.select.function.Upper;
4145
import org.mybatis.dynamic.sql.select.join.EqualTo;
4246
import org.mybatis.dynamic.sql.select.join.JoinCondition;
@@ -187,10 +191,38 @@ static Sum sum(BasicColumn column) {
187191
return Sum.of(column);
188192
}
189193

194+
// constants
195+
static <T extends Number> Constant<T> constant(T number) {
196+
return Constant.of(number);
197+
}
198+
199+
static Constant<String> constant(String string) {
200+
return Constant.of("'" + string + "'"); //$NON-NLS-1$ //$NON-NLS-2$
201+
}
202+
190203
// functions
191204
@SafeVarargs
192-
static <T extends Number> Add<T> add(BindableColumn<T>... columns) {
193-
return Add.of(Arrays.asList(columns));
205+
static <T extends Number> Add<T> add(BindableColumn<T> firstColumn, BasicColumn secondColumn,
206+
BasicColumn... subsequentColumns) {
207+
return Add.of(firstColumn, secondColumn, Arrays.asList(subsequentColumns));
208+
}
209+
210+
@SafeVarargs
211+
static <T extends Number> Divide<T> divide(BindableColumn<T> firstColumn, BasicColumn secondColumn,
212+
BasicColumn... subsequentColumns) {
213+
return Divide.of(firstColumn, secondColumn, Arrays.asList(subsequentColumns));
214+
}
215+
216+
@SafeVarargs
217+
static <T extends Number> Multiply<T> multiply(BindableColumn<T> firstColumn, BasicColumn secondColumn,
218+
BasicColumn... subsequentColumns) {
219+
return Multiply.of(firstColumn, secondColumn, Arrays.asList(subsequentColumns));
220+
}
221+
222+
@SafeVarargs
223+
static <T extends Number> Subtract<T> subtract(BindableColumn<T> firstColumn, BasicColumn secondColumn,
224+
BasicColumn... subsequentColumns) {
225+
return Subtract.of(firstColumn, secondColumn, Arrays.asList(subsequentColumns));
194226
}
195227

196228
static Lower lower(BindableColumn<String> column) {

src/main/java/org/mybatis/dynamic/sql/select/function/BaseFunction.java renamed to src/main/java/org/mybatis/dynamic/sql/select/function/AbstractFunction.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2017 the original author or authors.
2+
* Copyright 2016-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,17 +21,24 @@
2121

2222
import org.mybatis.dynamic.sql.BindableColumn;
2323

24-
public abstract class BaseFunction<T, S extends BaseFunction<T, S>> implements BindableColumn<T> {
25-
24+
public abstract class AbstractFunction<T, U extends AbstractFunction<T, U>> implements BindableColumn<T> {
2625
protected BindableColumn<T> column;
27-
28-
protected BaseFunction(BindableColumn<T> column) {
26+
protected String alias;
27+
28+
protected AbstractFunction(BindableColumn<T> column) {
2929
this.column = Objects.requireNonNull(column);
3030
}
31+
32+
@Override
33+
public Optional<String> alias() {
34+
return Optional.ofNullable(alias);
35+
}
3136

3237
@Override
33-
public S as(String alias) {
34-
return copyWithColumn(column.as(alias));
38+
public U as(String alias) {
39+
U newThing = copy();
40+
newThing.alias = alias;
41+
return newThing;
3542
}
3643

3744
@Override
@@ -43,11 +50,6 @@ public JDBCType jdbcType() {
4350
public Optional<String> typeHandler() {
4451
return column.typeHandler();
4552
}
46-
47-
@Override
48-
public Optional<String> alias() {
49-
return column.alias();
50-
}
5153

52-
protected abstract S copyWithColumn(BindableColumn<T> column);
54+
protected abstract U copy();
5355
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* Copyright 2016-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.select.function;
17+
18+
import java.util.ArrayList;
19+
import java.util.List;
20+
import java.util.Objects;
21+
import java.util.function.Function;
22+
import java.util.stream.Collectors;
23+
import java.util.stream.Stream;
24+
25+
import org.mybatis.dynamic.sql.BasicColumn;
26+
import org.mybatis.dynamic.sql.BindableColumn;
27+
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
28+
29+
public abstract class AbstractMultipleColumnArithmeticFunction<T extends Number,
30+
U extends AbstractMultipleColumnArithmeticFunction<T, U>>
31+
extends AbstractFunction<T, AbstractMultipleColumnArithmeticFunction<T,U>> {
32+
33+
protected BasicColumn secondColumn;
34+
protected List<BasicColumn> subsequentColumns = new ArrayList<>();
35+
36+
protected AbstractMultipleColumnArithmeticFunction(BindableColumn<T> firstColumn, BasicColumn secondColumn,
37+
List<BasicColumn> subsequentColumns) {
38+
super(firstColumn);
39+
this.secondColumn = Objects.requireNonNull(secondColumn);
40+
this.subsequentColumns.addAll(subsequentColumns);
41+
}
42+
43+
@Override
44+
public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
45+
// note - the cast below is added for a type inference bug in the Java9 compiler.
46+
return Stream.of(Stream.of((BasicColumn) column), Stream.of(secondColumn), subsequentColumns.stream())
47+
.flatMap(Function.identity())
48+
.map(column -> column.renderWithTableAlias(tableAliasCalculator))
49+
.collect(Collectors.joining(padOperator(), "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$
50+
}
51+
52+
private String padOperator() {
53+
return " " + operator() + " "; //$NON-NLS-1$ //$NON-NLS-2$
54+
}
55+
56+
protected abstract String operator();
57+
}

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

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,54 +15,30 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.function;
1717

18-
import java.sql.JDBCType;
19-
import java.util.ArrayList;
2018
import java.util.List;
21-
import java.util.Optional;
22-
import java.util.stream.Collectors;
2319

20+
import org.mybatis.dynamic.sql.BasicColumn;
2421
import org.mybatis.dynamic.sql.BindableColumn;
25-
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2622

27-
public class Add<T extends Number> implements BindableColumn<T> {
23+
public class Add<T extends Number> extends AbstractMultipleColumnArithmeticFunction<T, Add<T>> {
2824

29-
private String alias;
30-
private List<BindableColumn<T>> columns = new ArrayList<>();
31-
32-
private Add(List<BindableColumn<T>> columns) {
33-
this.columns.addAll(columns);
34-
}
35-
36-
@Override
37-
public Optional<String> alias() {
38-
return Optional.ofNullable(alias);
39-
}
40-
41-
@Override
42-
public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
43-
return columns.stream()
44-
.map(column -> column.renderWithTableAlias(tableAliasCalculator))
45-
.collect(Collectors.joining(" + ")); //$NON-NLS-1$
46-
}
47-
48-
@Override
49-
public BindableColumn<T> as(String alias) {
50-
Add<T> newColumn = new Add<>(columns);
51-
newColumn.alias = alias;
52-
return newColumn;
25+
private Add(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
List<BasicColumn> subsequentColumns) {
27+
super(firstColumn, secondColumn, subsequentColumns);
5328
}
5429

5530
@Override
56-
public JDBCType jdbcType() {
57-
return columns.get(0).jdbcType();
31+
protected Add<T> copy() {
32+
return new Add<>(column, secondColumn, subsequentColumns);
5833
}
5934

6035
@Override
61-
public Optional<String> typeHandler() {
62-
return columns.get(0).typeHandler();
36+
protected String operator() {
37+
return "+"; //$NON-NLS-1$
6338
}
6439

65-
public static <T extends Number> Add<T> of(List<BindableColumn<T>> columns) {
66-
return new Add<>(columns);
40+
public static <T extends Number> Add<T> of(BindableColumn<T> firstColumn, BasicColumn secondColumn,
41+
List<BasicColumn> subsequentColumns) {
42+
return new Add<>(firstColumn, secondColumn, subsequentColumns);
6743
}
6844
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* Copyright 2016-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.select.function;
17+
18+
import java.util.Objects;
19+
import java.util.Optional;
20+
21+
import org.mybatis.dynamic.sql.BasicColumn;
22+
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
23+
24+
public class Constant<T> implements BasicColumn {
25+
26+
private String alias;
27+
private T value;
28+
29+
private Constant(T value) {
30+
this.value = Objects.requireNonNull(value);
31+
}
32+
33+
@Override
34+
public Optional<String> alias() {
35+
return Optional.ofNullable(alias);
36+
}
37+
38+
@Override
39+
public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
40+
return value.toString();
41+
}
42+
43+
@Override
44+
public Constant<T> as(String alias) {
45+
Constant<T> copy = new Constant<>(value);
46+
copy.alias = alias;
47+
return copy;
48+
}
49+
50+
public static <T> Constant<T> of(T value) {
51+
return new Constant<>(value);
52+
}
53+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright 2016-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.select.function;
17+
18+
import java.util.List;
19+
20+
import org.mybatis.dynamic.sql.BasicColumn;
21+
import org.mybatis.dynamic.sql.BindableColumn;
22+
23+
public class Divide<T extends Number> extends AbstractMultipleColumnArithmeticFunction<T, Divide<T>> {
24+
25+
private Divide(BindableColumn<T> firstColumn, BasicColumn secondColumn,
26+
List<BasicColumn> subsequentColumns) {
27+
super(firstColumn, secondColumn, subsequentColumns);
28+
}
29+
30+
@Override
31+
protected Divide<T> copy() {
32+
return new Divide<>(column, secondColumn, subsequentColumns);
33+
}
34+
35+
@Override
36+
protected String operator() {
37+
return "/"; //$NON-NLS-1$
38+
}
39+
40+
public static <T extends Number> Divide<T> of(BindableColumn<T> firstColumn, BasicColumn secondColumn,
41+
List<BasicColumn> subsequentColumns) {
42+
return new Divide<>(firstColumn, secondColumn, subsequentColumns);
43+
}
44+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2017 the original author or authors.
2+
* Copyright 2016-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
1818
import org.mybatis.dynamic.sql.BindableColumn;
1919
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2020

21-
public class Lower extends BaseFunction<String, Lower> {
21+
public class Lower extends AbstractFunction<String, Lower> {
2222

2323
private Lower(BindableColumn<String> column) {
2424
super(column);
@@ -32,7 +32,7 @@ public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
3232
}
3333

3434
@Override
35-
protected Lower copyWithColumn(BindableColumn<String> column) {
35+
protected Lower copy() {
3636
return new Lower(column);
3737
}
3838

0 commit comments

Comments
 (0)