Skip to content

Commit 9cfd2fe

Browse files
committed
Added support for non null checks
1 parent ac7b63b commit 9cfd2fe

File tree

6 files changed

+47
-26
lines changed

6 files changed

+47
-26
lines changed

README.MD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Features
4545
---------
4646

4747
Current version works with predicates, functions and supports the following operators: >, >=, <, <=, =, !=, &&, ||, !
48-
48+
4949
Feel free to open an issue with any requests you might have.
5050

5151
Install
@@ -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.4</version>
59+
<version>1.8.5</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.4</version>
9+
<version>1.8.5</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.3.0</version>
63+
<version>2.4.0</version>
6464
</dependency>
6565

6666
<dependency>

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ public class LinkedListStack<T> {
1717
private Node head;
1818
private int elementCount;
1919

20-
/**
21-
* Constructor for creating an empty stack.
22-
*/
23-
public LinkedListStack() {
24-
elementCount = 0;
25-
}
26-
2720
/**
2821
* Pushes (adds) an element to the top of the stack.
2922
*

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

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ToSqlVisitor implements ExpressionVisitor<StringBuilder> {
2828
ToSqlVisitor(String prefix) {
2929
this.prefix = prefix;
3030
this.sb = new StringBuilder();
31-
arguments = new LinkedListStack<>();
31+
this.arguments = new LinkedListStack<>();
3232
}
3333

3434
/**
@@ -45,6 +45,10 @@ private static String toSqlOp(int expressionType) {
4545
return "AND";
4646
case ExpressionType.LogicalOr:
4747
return "OR";
48+
case ExpressionType.IsNull:
49+
return " IS NULL";
50+
case ExpressionType.IsNonNull:
51+
return " IS NOT NULL";
4852
case ExpressionType.Convert:
4953
return "";
5054
}
@@ -63,12 +67,12 @@ private static String toSqlOp(int expressionType) {
6367
@Override
6468
public StringBuilder visit(BinaryExpression e) {
6569
//Handling for null parameters
66-
if (e.getSecond() instanceof ParameterExpression && arguments.top().get(((ParameterExpression) e.getSecond()).getIndex()).getValue() == null) {
70+
if (e.getSecond() instanceof ParameterExpression && !arguments.top().isEmpty() && arguments.top().get(((ParameterExpression) e.getSecond()).getIndex()).getValue() == null) {
6771
if (e.getExpressionType() == ExpressionType.Equal) {
6872
return Expression.isNull(e.getFirst()).accept(this);
6973
}
7074
if (e.getExpressionType() == ExpressionType.NotEqual) {
71-
return Expression.unary(ExpressionType.LogicalNot, boolean.class, Expression.unary(ExpressionType.IsNull, boolean.class, e.getFirst())).accept(this);
75+
return Expression.isNonNull(e.getFirst()).accept(this);
7276
}
7377
}
7478

@@ -94,13 +98,13 @@ public StringBuilder visit(BinaryExpression e) {
9498
*/
9599
@Override
96100
public StringBuilder visit(ConstantExpression e) {
101+
if (e.getValue() == null) {
102+
return sb.append("NULL");
103+
}
97104
if (e.getValue() instanceof LambdaExpression) {
98105
((LambdaExpression) e.getValue()).getBody().accept(this);
99106
return sb;
100107
}
101-
if (e.getValue() == null) {
102-
return sb.append("NULL");
103-
}
104108
if (e.getValue() instanceof String) {
105109
return sb.append("'").append(e.getValue().toString()).append("'");
106110
}
@@ -193,16 +197,12 @@ public StringBuilder visit(ParameterExpression e) {
193197
*/
194198
@Override
195199
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+
if (e.getExpressionType() == ExpressionType.LogicalNot) {
201+
sb.append("!");
202+
return e.getFirst().accept(this);
200203
}
201-
if (e.getExpressionType() == ExpressionType.IsNull) {
202-
return e.getFirst().accept(this).append(" IS NULL");
203-
}
204-
sb.append(toSqlOp(e.getExpressionType()));
205-
return e.getFirst().accept(this);
204+
e.getFirst().accept(this);
205+
return sb.append(toSqlOp(e.getExpressionType()));
206206
}
207207

208208
}

src/main/java/com/github/collinalpert/lambda2sql/functions/SerializedFunctionalInterface.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
/**
66
* An interface functional interfaces can extend to become serialized.
7+
* Functional interfaces which extend this interface can be converted to SQL statements.
78
*
89
* @author Collin Alpert
910
* @see Serializable

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,33 @@ void testParentheses() {
116116
assertPredicateEqual("person.age = 18 AND (person.isAdult OR person.name = 'Steve')", p2);
117117
}
118118

119+
//@Test
120+
//This section does not work yet!
121+
void testJavaFunctions() {
122+
var name = "Steve";
123+
var age = 18;
124+
assertPredicateEqual("person.age >= 18 OR person.name LIKE 'Steve%'", person -> person.getAge() >= age || person.getName().startsWith("Steve"));
125+
assertPredicateEqual("person.name LIKE 'Steve%'", person -> person.getName().startsWith("Steve"));
126+
assertPredicateEqual("person.age >= 18 OR person.name LIKE 'Steve%'", person -> person.getAge() >= age || person.getName().startsWith(name));
127+
assertPredicateEqual("person.name LIKE 'Steve%'", person -> person.getName().startsWith(name));
128+
assertPredicateEqual("person.age >= 18 OR person.name NOT LIKE 'Steve%'", person -> person.getAge() >= age || !person.getName().startsWith(name));
129+
assertPredicateEqual("person.name NOT LIKE 'Steve%'", person -> !person.getName().startsWith(name));
130+
131+
assertPredicateEqual("person.age >= 18 OR person.name LIKE '%Steve'", person -> person.getAge() >= age || person.getName().endsWith("Steve"));
132+
assertPredicateEqual("person.name LIKE '%Steve'", person -> person.getName().endsWith("Steve"));
133+
assertPredicateEqual("person.age >= 18 OR person.name LIKE '%Steve'", person -> person.getAge() >= age || person.getName().endsWith(name));
134+
assertPredicateEqual("person.name LIKE '%Steve'", person -> person.getName().endsWith(name));
135+
assertPredicateEqual("person.age >= 18 OR person.name NOT LIKE '%Steve'", person -> person.getAge() >= age || !person.getName().endsWith(name));
136+
assertPredicateEqual("person.name NOT LIKE '%Steve'", person -> !person.getName().endsWith(name));
137+
138+
assertPredicateEqual("person.age >= 18 OR person.name LIKE '%Steve%'", person -> person.getAge() >= age || person.getName().contains("Steve"));
139+
assertPredicateEqual("person.name LIKE '%Steve%'", person -> person.getName().contains("Steve"));
140+
assertPredicateEqual("person.age >= 18 OR person.name LIKE '%Steve%'", person -> person.getAge() >= age || person.getName().contains(name));
141+
assertPredicateEqual("person.name LIKE '%Steve%'", person -> person.getName().contains(name));
142+
assertPredicateEqual("person.age >= 18 OR person.name NOT LIKE '%Steve%'", person -> person.getAge() >= age || !person.getName().contains(name));
143+
assertPredicateEqual("person.name NOT LIKE '%Steve%'", person -> !person.getName().contains(name));
144+
}
145+
119146
private void assertPredicateEqual(String expectedSql, SqlPredicate<IPerson> p) {
120147
var sql = Lambda2Sql.toSql(p, "person");
121148
Assertions.assertEquals(expectedSql, sql);

0 commit comments

Comments
 (0)