Skip to content

Commit 6d58374

Browse files
committed
Added explicit table name to where conditions
1 parent 360a197 commit 6d58374

File tree

7 files changed

+51
-25
lines changed

7 files changed

+51
-25
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
.gradle
21
.idea
32
target
3+
out

README.MD

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
Lambda2sql (lambda) -> "sql"
22
==========
33

4-
**Please note:** This is a Java 10 library so make sure you have at least Java 10 installed when using it.
4+
**Please note:** This is a Java 11 library so make sure you have at least Java 11 installed when using it.
55

66
Convert Java 8 lambdas to SQL statements.
77

8-
For example, the following Predicate<Person>:
8+
For example, the following ``SqlPredicate<Person>``:
99
```jshelllanguage
1010
person -> person.getAge() < 100 && person.getHeight() > 200
1111
```
1212

1313
is converted to a string:
1414

1515
```
16-
age < 100 AND height > 200
16+
person.age < 100 AND person.height > 200
1717
```
1818
allowing you to write readable queries in a type safe way.
19+
20+
**Note:** Remember to annotate the class used in the ``Predicate<T>`` with the ``TableName`` attribute.
21+
If the attribute is not supplied, the class in lower case characters will be used.
1922

2023
Usage
2124
---------
@@ -25,10 +28,9 @@ int age = 100;
2528
int height = 200;
2629
SqlPredicate<Person> predicate = person -> person.getAge() < age && person.getHeight() > height;
2730
28-
String sql = Lambda2Sql.toSql(predicate); // age < 100 AND height > 200
31+
String sql = Lambda2Sql.toSql(predicate); // person.age < 100 AND person.height > 200
2932
```
3033

31-
3234
How it works
3335
---------
3436

@@ -57,7 +59,7 @@ You can include the Maven dependency:
5759
<dependency>
5860
<groupId>com.github.collinalpert</groupId>
5961
<artifactId>lambda2sql</artifactId>
60-
<version>1.0</version>
62+
<version>1.6</version>
6163
</dependency>
6264
```
6365

pom.xml

Lines changed: 2 additions & 3 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.5</version>
9+
<version>1.6</version>
1010
<packaging>jar</packaging>
1111

1212
<name>lambda2sql</name>
@@ -57,6 +57,7 @@
5757
<version>5.2.0</version>
5858
<scope>test</scope>
5959
</dependency>
60+
6061
</dependencies>
6162

6263
<build>
@@ -123,6 +124,4 @@
123124
</plugin>
124125
</plugins>
125126
</build>
126-
127-
128127
</project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.collinalpert.lambda2sql;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
* Annotation for specifying the SQL table name.
10+
*
11+
* @author Collin Alpert
12+
*/
13+
@Target(ElementType.TYPE)
14+
@Retention(RetentionPolicy.RUNTIME)
15+
public @interface TableName {
16+
String value();
17+
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,14 @@ public StringBuilder visit(MemberExpression e) {
133133
String name = e.getMember().getName();
134134
name = name.replaceAll("^(get)", "");
135135
name = name.substring(0, 1).toLowerCase() + name.substring(1);
136-
return sb.append(name);
136+
var annotation = e.getMember().getDeclaringClass().getAnnotation(TableName.class);
137+
String tableName;
138+
if (annotation != null) {
139+
tableName = annotation.value();
140+
} else {
141+
tableName = e.getMember().getDeclaringClass().getSimpleName().toLowerCase();
142+
}
143+
return sb.append(tableName).append(".").append(name);
137144
}
138145

139146
/**

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,38 @@ class Lambda2SqlTest {
99

1010
@Test
1111
void testComparisons() {
12-
assertPredicateEqual("age = 1", e -> e.getAge() == 1);
13-
assertPredicateEqual("age > 1", e -> e.getAge() > 1);
14-
assertPredicateEqual("age < 1", e -> e.getAge() < 1);
15-
assertPredicateEqual("age >= 1", e -> e.getAge() >= 1);
16-
assertPredicateEqual("age <= 1", e -> e.getAge() <= 1);
17-
assertPredicateEqual("age != 1", e -> e.getAge() != 1);
12+
assertPredicateEqual("person.age = 1", e -> e.getAge() == 1);
13+
assertPredicateEqual("person.age > 1", e -> e.getAge() > 1);
14+
assertPredicateEqual("person.age < 1", e -> e.getAge() < 1);
15+
assertPredicateEqual("person.age >= 1", e -> e.getAge() >= 1);
16+
assertPredicateEqual("person.age <= 1", e -> e.getAge() <= 1);
17+
assertPredicateEqual("person.age != 1", e -> e.getAge() != 1);
1818
}
1919

2020
@Test
2121
void testLogicalOps() {
22-
assertPredicateEqual("!isActive", e -> !e.isActive());
23-
assertPredicateEqual("age < 100 AND height > 200", e -> e.getAge() < 100 && e.getHeight() > 200);
24-
assertPredicateEqual("age < 100 OR height > 200", e -> e.getAge() < 100 || e.getHeight() > 200);
22+
assertPredicateEqual("!person.isActive", e -> !e.isActive());
23+
assertPredicateEqual("person.age < 100 AND person.height > 200", e -> e.getAge() < 100 && e.getHeight() > 200);
24+
assertPredicateEqual("person.age < 100 OR person.height > 200", e -> e.getAge() < 100 || e.getHeight() > 200);
2525
}
2626

2727
@Test
2828
void testMultipleLogicalOps() {
29-
assertPredicateEqual("isActive AND (age < 100 OR height > 200)", e -> e.isActive() && (e.getAge() < 100 || e.getHeight() > 200));
30-
assertPredicateEqual("(age < 100 OR height > 200) AND isActive", e -> (e.getAge() < 100 || e.getHeight() > 200) && e.isActive());
29+
assertPredicateEqual("person.isActive AND (person.age < 100 OR person.height > 200)", e -> e.isActive() && (e.getAge() < 100 || e.getHeight() > 200));
30+
assertPredicateEqual("(person.age < 100 OR person.height > 200) AND person.isActive", e -> (e.getAge() < 100 || e.getHeight() > 200) && e.isActive());
3131
}
3232

3333
@Test
3434
void testWithVariables() {
3535
var name = "Donald";
3636
var age = 80;
37-
assertPredicateEqual("name = 'Donald' AND age > 80", person -> person.getName() == name && person.getAge() > age);
37+
assertPredicateEqual("person.name = 'Donald' AND person.age > 80", person -> person.getName() == name && person.getAge() > age);
3838
}
3939

4040
@Test
4141
void testFunction() {
42-
assertFunctionEqual("name", Person::getName);
43-
assertFunctionEqual("age", person -> person.getAge());
42+
assertFunctionEqual("person.name", Person::getName);
43+
assertFunctionEqual("person.age", person -> person.getAge());
4444
}
4545

4646
private void assertPredicateEqual(String expectedSql, SqlPredicate<Person> p) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.collinalpert.lambda2sql;
22

3+
@TableName("person")
34
public interface Person {
45
String getName();
56

0 commit comments

Comments
 (0)