Skip to content

Commit d734f13

Browse files
committed
Support literal expressions
1 parent 77da9b4 commit d734f13

File tree

5 files changed

+167
-2
lines changed

5 files changed

+167
-2
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/Expressions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@
66

77
public class Expressions {
88

9+
public static PropertyMetamodel<String> literal(String value) {
10+
Objects.requireNonNull(value);
11+
return new LiteralExpression.StringLiteral(value);
12+
}
13+
14+
public static PropertyMetamodel<Integer> literal(int value) {
15+
Objects.requireNonNull(value);
16+
return new LiteralExpression.IntLiteral(value);
17+
}
18+
919
public static <PROPERTY> ArithmeticExpression.Add<PROPERTY> add(
1020
PropertyMetamodel<PROPERTY> left, PROPERTY right) {
1121
Objects.requireNonNull(left);
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package org.seasar.doma.jdbc.criteria.expression;
2+
3+
import java.util.Objects;
4+
import org.seasar.doma.DomaIllegalArgumentException;
5+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
6+
import org.seasar.doma.jdbc.entity.EntityPropertyType;
7+
8+
public interface LiteralExpression<PROPERTY> extends PropertyMetamodel<PROPERTY> {
9+
10+
String toString();
11+
12+
abstract class AbstractLiteralExpression<PROPERTY> implements LiteralExpression<PROPERTY> {
13+
protected final PROPERTY value;
14+
15+
protected AbstractLiteralExpression(PROPERTY value) {
16+
this.value = Objects.requireNonNull(value);
17+
}
18+
19+
@Override
20+
public Class<?> asClass() {
21+
return value.getClass();
22+
}
23+
24+
@Override
25+
public EntityPropertyType<?, ?> asType() {
26+
return null;
27+
}
28+
29+
@Override
30+
public boolean equals(Object o) {
31+
if (this == o) return true;
32+
if (!(o instanceof AbstractLiteralExpression)) return false;
33+
AbstractLiteralExpression<?> that = (AbstractLiteralExpression<?>) o;
34+
return value.equals(that.value);
35+
}
36+
37+
@Override
38+
public int hashCode() {
39+
return Objects.hash(value);
40+
}
41+
}
42+
43+
class StringLiteral extends AbstractLiteralExpression<String> {
44+
45+
private static final char QUOTATION = '\'';
46+
47+
public StringLiteral(String value) {
48+
super(Objects.requireNonNull(value));
49+
if (value.indexOf(QUOTATION) > -1) {
50+
throw new DomaIllegalArgumentException(
51+
"value", "The value must not contain the single quotation.");
52+
}
53+
}
54+
55+
@Override
56+
public String toString() {
57+
return QUOTATION + value + QUOTATION;
58+
}
59+
60+
@Override
61+
public String getName() {
62+
return value;
63+
}
64+
65+
@Override
66+
public void accept(PropertyMetamodel.Visitor visitor) {
67+
if (visitor instanceof LiteralExpression.Visitor) {
68+
LiteralExpression.Visitor v = (LiteralExpression.Visitor) visitor;
69+
v.visit(this);
70+
}
71+
}
72+
}
73+
74+
class IntLiteral extends AbstractLiteralExpression<Integer> {
75+
76+
public IntLiteral(int value) {
77+
super(value);
78+
}
79+
80+
@Override
81+
public String toString() {
82+
return Integer.toString(value);
83+
}
84+
85+
@Override
86+
public String getName() {
87+
return Integer.toString(value);
88+
}
89+
90+
@Override
91+
public void accept(PropertyMetamodel.Visitor visitor) {
92+
if (visitor instanceof LiteralExpression.Visitor) {
93+
LiteralExpression.Visitor v = (LiteralExpression.Visitor) visitor;
94+
v.visit(this);
95+
}
96+
}
97+
}
98+
99+
interface Visitor {
100+
void visit(StringLiteral stringLiteral);
101+
102+
void visit(IntLiteral intLiteral);
103+
}
104+
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.seasar.doma.jdbc.criteria.context.SelectContext;
1616
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction;
1717
import org.seasar.doma.jdbc.criteria.expression.ArithmeticExpression;
18+
import org.seasar.doma.jdbc.criteria.expression.LiteralExpression;
1819
import org.seasar.doma.jdbc.criteria.expression.StringExpression;
1920
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
2021
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
@@ -466,9 +467,10 @@ private void not(List<Criterion> criterionList) {
466467

467468
class PropertyMetamodelVisitor
468469
implements PropertyMetamodel.Visitor,
469-
AggregateFunction.Visitor,
470470
ArithmeticExpression.Visitor,
471-
StringExpression.Visitor {
471+
StringExpression.Visitor,
472+
LiteralExpression.Visitor,
473+
AggregateFunction.Visitor {
472474

473475
@Override
474476
public void visit(PropertyMetamodel<?> propertyMetamodel) {
@@ -515,6 +517,16 @@ public void visit(StringExpression.Concat<?> concat) {
515517
buf, () -> concat.left.accept(operandVisitor), () -> concat.right.accept(operandVisitor));
516518
}
517519

520+
@Override
521+
public void visit(LiteralExpression.StringLiteral stringLiteral) {
522+
buf.appendSql(stringLiteral.toString());
523+
}
524+
525+
@Override
526+
public void visit(LiteralExpression.IntLiteral intLiteral) {
527+
buf.appendSql(intLiteral.toString());
528+
}
529+
518530
@Override
519531
public void visit(AggregateFunction.Avg<?> avg) {
520532
aggregateFunction(avg.getName(), avg.argument());

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg;
55
import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat;
66
import static org.seasar.doma.jdbc.criteria.expression.Expressions.count;
7+
import static org.seasar.doma.jdbc.criteria.expression.Expressions.literal;
78
import static org.seasar.doma.jdbc.criteria.expression.Expressions.max;
89
import static org.seasar.doma.jdbc.criteria.expression.Expressions.min;
910
import static org.seasar.doma.jdbc.criteria.expression.Expressions.sum;
@@ -1122,4 +1123,20 @@ public Dialect getDialect() {
11221123
Sql<?> sql = stmt.asSql();
11231124
assertEquals("select (t0_.NAME + 'a') from EMP t0_", sql.getFormattedSql());
11241125
}
1126+
1127+
@Test
1128+
void expression_stringLiteral() {
1129+
Emp_ e = new Emp_();
1130+
Buildable<?> stmt = nativeSql.from(e).select(literal("a"));
1131+
Sql<?> sql = stmt.asSql();
1132+
assertEquals("select 'a' from EMP t0_", sql.getRawSql());
1133+
}
1134+
1135+
@Test
1136+
void expression_intLiteral() {
1137+
Emp_ e = new Emp_();
1138+
Buildable<?> stmt = nativeSql.from(e).select(literal(123));
1139+
Sql<?> sql = stmt.asSql();
1140+
assertEquals("select 123 from EMP t0_", sql.getRawSql());
1141+
}
11251142
}

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/expression/ExpressionsTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
56
import static org.seasar.doma.jdbc.criteria.expression.Expressions.add;
67
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg;
78
import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat;
89
import static org.seasar.doma.jdbc.criteria.expression.Expressions.count;
910
import static org.seasar.doma.jdbc.criteria.expression.Expressions.div;
11+
import static org.seasar.doma.jdbc.criteria.expression.Expressions.literal;
1012
import static org.seasar.doma.jdbc.criteria.expression.Expressions.max;
1113
import static org.seasar.doma.jdbc.criteria.expression.Expressions.min;
1214
import static org.seasar.doma.jdbc.criteria.expression.Expressions.mod;
@@ -15,12 +17,32 @@
1517
import static org.seasar.doma.jdbc.criteria.expression.Expressions.sum;
1618

1719
import org.junit.jupiter.api.Test;
20+
import org.seasar.doma.DomaIllegalArgumentException;
1821
import org.seasar.doma.jdbc.criteria.entity.Emp_;
1922

2023
class ExpressionsTest {
2124

2225
private final Emp_ e = new Emp_();
2326

27+
@Test
28+
void testStringLiteral() {
29+
assertEquals(literal("abc"), literal("abc"));
30+
assertNotEquals(literal("abc"), literal("def"));
31+
}
32+
33+
@Test
34+
void testStringLiteral_contains_single_quotation() {
35+
DomaIllegalArgumentException ex =
36+
assertThrows(DomaIllegalArgumentException.class, () -> literal("ab'c"));
37+
System.out.println(ex.getMessage());
38+
}
39+
40+
@Test
41+
void testIntLiteral() {
42+
assertEquals(literal(1), literal(1));
43+
assertNotEquals(literal(1), literal(2));
44+
}
45+
2446
@Test
2547
void testAdd() {
2648
assertEquals(add(e.id, 1), add(e.id, 1));

0 commit comments

Comments
 (0)