Skip to content

Commit ac7b63b

Browse files
committed
Updated JaQue library
1 parent 1152655 commit ac7b63b

File tree

4 files changed

+60
-14
lines changed

4 files changed

+60
-14
lines changed

README.MD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ You can include the Maven dependency:
5656
<dependency>
5757
<groupId>com.github.collinalpert</groupId>
5858
<artifactId>lambda2sql</artifactId>
59-
<version>1.8.3</version>
59+
<version>1.8.4</version>
6060
</dependency>
6161
```
6262

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.github.collinalpert</groupId>
88
<artifactId>lambda2sql</artifactId>
9-
<version>1.8.3</version>
9+
<version>1.8.4</version>
1010
<packaging>jar</packaging>
1111

1212
<name>lambda2sql</name>
@@ -60,7 +60,7 @@
6060
<dependency>
6161
<groupId>com.trigersoft</groupId>
6262
<artifactId>jaque</artifactId>
63-
<version>2.2.1</version>
63+
<version>2.3.0</version>
6464
</dependency>
6565

6666
<dependency>

src/main/java/com/github/collinalpert/lambda2sql/ToSqlVisitor.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.trigersoft.jaque.expression.BinaryExpression;
44
import com.trigersoft.jaque.expression.ConstantExpression;
5+
import com.trigersoft.jaque.expression.DelegateExpression;
56
import com.trigersoft.jaque.expression.Expression;
67
import com.trigersoft.jaque.expression.ExpressionType;
78
import com.trigersoft.jaque.expression.ExpressionVisitor;
@@ -61,6 +62,16 @@ private static String toSqlOp(int expressionType) {
6162
*/
6263
@Override
6364
public StringBuilder visit(BinaryExpression e) {
65+
//Handling for null parameters
66+
if (e.getSecond() instanceof ParameterExpression && arguments.top().get(((ParameterExpression) e.getSecond()).getIndex()).getValue() == null) {
67+
if (e.getExpressionType() == ExpressionType.Equal) {
68+
return Expression.isNull(e.getFirst()).accept(this);
69+
}
70+
if (e.getExpressionType() == ExpressionType.NotEqual) {
71+
return Expression.unary(ExpressionType.LogicalNot, boolean.class, Expression.unary(ExpressionType.IsNull, boolean.class, e.getFirst())).accept(this);
72+
}
73+
}
74+
6475
boolean quote = e != this.body && e.getExpressionType() == ExpressionType.LogicalOr;
6576

6677
if (quote) sb.append('(');
@@ -83,10 +94,12 @@ public StringBuilder visit(BinaryExpression e) {
8394
*/
8495
@Override
8596
public StringBuilder visit(ConstantExpression e) {
97+
if (e.getValue() instanceof LambdaExpression) {
98+
((LambdaExpression) e.getValue()).getBody().accept(this);
99+
return sb;
100+
}
86101
if (e.getValue() == null) {
87-
sb.deleteCharAt(sb.length() - 1);
88-
sb.delete(sb.lastIndexOf(" "), sb.length());
89-
return sb.append(" IS NULL");
102+
return sb.append("NULL");
90103
}
91104
if (e.getValue() instanceof String) {
92105
return sb.append("'").append(e.getValue().toString()).append("'");
@@ -129,6 +142,11 @@ public StringBuilder visit(LambdaExpression<?> e) {
129142
return e.getBody().accept(this);
130143
}
131144

145+
@Override
146+
public StringBuilder visit(DelegateExpression e) {
147+
return e.getDelegate().accept(this);
148+
}
149+
132150
/**
133151
* An expression which represents a getter, and thus a field in a database, in the lambda expression.
134152
* For example:
@@ -158,6 +176,9 @@ public StringBuilder visit(MemberExpression e) {
158176
@Override
159177
public StringBuilder visit(ParameterExpression e) {
160178
arguments.top().get(e.getIndex()).accept(this);
179+
if (e.getIndex() == arguments.top().size() - 1) {
180+
arguments.pop();
181+
}
161182
return sb;
162183
}
163184

@@ -172,6 +193,11 @@ public StringBuilder visit(ParameterExpression e) {
172193
*/
173194
@Override
174195
public StringBuilder visit(UnaryExpression e) {
196+
if (e.getFirst() instanceof UnaryExpression && e.getExpressionType() == ExpressionType.LogicalNot) {
197+
if (e.getFirst().getExpressionType() == ExpressionType.IsNull) {
198+
return ((UnaryExpression) e.getFirst()).getFirst().accept(this).append(" IS NOT NULL");
199+
}
200+
}
175201
if (e.getExpressionType() == ExpressionType.IsNull) {
176202
return e.getFirst().accept(this).append(" IS NULL");
177203
}

src/test/java/com/github/collinalpert/lambda2sql/test/Lambda2SqlTest.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,18 @@ void testMethodReferences() {
5353

5454
@Test
5555
void testAndFunction() {
56-
var id = 1;
56+
var id = 2;
5757
SqlPredicate<IPerson> personPredicate = person -> person.getId() == id;
5858
SqlPredicate<IPerson> personSqlPredicateAnd = personPredicate.and(x -> true);
59-
assertPredicateEqual("person.id = 1 AND true", personSqlPredicateAnd);
59+
assertPredicateEqual("person.id = 2 AND true", personSqlPredicateAnd);
6060
}
6161

6262
@Test
6363
void testOrFunction() {
64-
var id = 1;
64+
var id = 2;
6565
SqlPredicate<IPerson> personPredicate = person -> person.getId() == id;
6666
SqlPredicate<IPerson> personSqlPredicateOr = personPredicate.or(x -> true);
67-
assertPredicateEqual("person.id = 1 OR true", personSqlPredicateOr);
67+
assertPredicateEqual("person.id = 2 OR true", personSqlPredicateOr);
6868
}
6969

7070
@Test
@@ -88,12 +88,32 @@ void testNestedProperties() {
8888
void testNull() {
8989
String isNull = null;
9090
Integer i = null;
91-
SqlPredicate<IPerson> p = person -> person.getName() == isNull;
91+
var age = 17;
92+
SqlPredicate<IPerson> p = person -> person.getAge() == age || person.getName() == isNull;
9293
SqlPredicate<IPerson> p2 = person -> person.getName() == null;
93-
SqlPredicate<IPerson> p3 = person -> person.getAge() >= i;
94-
assertPredicateEqual("person.name IS NULL", p);
94+
SqlPredicate<IPerson> p3 = person -> person.getAge() >= i && person.getAge() <= age;
95+
assertPredicateEqual("person.age = 17 OR person.name IS NULL", p);
9596
assertPredicateEqual("person.name IS NULL", p2);
96-
assertPredicateEqual("person.age IS NULL", p3);
97+
assertPredicateEqual("person.age >= NULL AND person.age <= 17", p3);
98+
}
99+
100+
@Test
101+
void testNotNull() {
102+
String isNull = null;
103+
var age = 17;
104+
SqlPredicate<IPerson> p = person -> person.getAge() == age || person.getName() != isNull;
105+
SqlPredicate<IPerson> p2 = person -> person.getName() != null;
106+
assertPredicateEqual("person.age = 17 OR person.name IS NOT NULL", p);
107+
assertPredicateEqual("person.name IS NOT NULL", p2);
108+
}
109+
110+
@Test
111+
void testParentheses() {
112+
var age = 18;
113+
SqlPredicate<IPerson> p = person -> person.getAge() == age && person.isAdult() || person.getName() == "Steve";
114+
SqlPredicate<IPerson> p2 = person -> person.getAge() == age && (person.isAdult() || person.getName() == "Steve");
115+
assertPredicateEqual("person.age = 18 AND person.isAdult OR person.name = 'Steve'", p);
116+
assertPredicateEqual("person.age = 18 AND (person.isAdult OR person.name = 'Steve')", p2);
97117
}
98118

99119
private void assertPredicateEqual(String expectedSql, SqlPredicate<IPerson> p) {

0 commit comments

Comments
 (0)