Skip to content

Commit cd6036f

Browse files
committed
Update QueryBuilder.
1 parent ec54c2e commit cd6036f

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ Primary and foreign key annotations associated with the [`Actor`](kilo-test/src/
872872
select actor.* from actor
873873
join film_actor on actor.actor_id = film_actor.actor_id
874874
where film_actor.film_id = :filmID
875-
order by actor.last_name asc, actor.first_name asc
875+
order by last_name asc, first_name asc
876876
```
877877

878878
Insert, update, and delete operations are also supported. See the [pet](kilo-test/src/main/java/org/httprpc/kilo/test/PetService.java), [catalog](kilo-test/src/main/java/org/httprpc/kilo/test/CatalogService.java), and [film](kilo-test/src/main/java/org/httprpc/kilo/test/FilmService.java) service examples for more information.

kilo-client/src/main/java/org/httprpc/kilo/sql/QueryBuilder.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,28 @@ private static String getForeignKeyColumnName(Class<?> from, Class<?> to) {
522522
throw new UnsupportedOperationException("Foreign key is not defined.");
523523
}
524524

525+
/**
526+
* Appends a "union" operation.
527+
*
528+
* @param queryBuilder
529+
* A "select" query.
530+
*
531+
* @return
532+
* The {@link QueryBuilder} instance.
533+
*/
534+
public QueryBuilder union(QueryBuilder queryBuilder) {
535+
if (queryBuilder == null) {
536+
throw new IllegalArgumentException();
537+
}
538+
539+
sqlBuilder.append(" union ");
540+
sqlBuilder.append(queryBuilder);
541+
542+
parameters.addAll(queryBuilder.parameters);
543+
544+
return this;
545+
}
546+
525547
/**
526548
* Creates an "insert" query.
527549
*
@@ -1040,6 +1062,10 @@ private QueryBuilder filterByIndex(String operator, String... keys) {
10401062
* The {@link QueryBuilder} instance.
10411063
*/
10421064
public QueryBuilder filterByExists(QueryBuilder queryBuilder) {
1065+
if (queryBuilder == null) {
1066+
throw new IllegalArgumentException();
1067+
}
1068+
10431069
sqlBuilder.append(" ");
10441070
sqlBuilder.append(filterCount == 0 ? WHERE : AND);
10451071
sqlBuilder.append(" exists (");
@@ -1063,6 +1089,10 @@ public QueryBuilder filterByExists(QueryBuilder queryBuilder) {
10631089
* The {@link QueryBuilder} instance.
10641090
*/
10651091
public QueryBuilder filterByNotExists(QueryBuilder queryBuilder) {
1092+
if (queryBuilder == null) {
1093+
throw new IllegalArgumentException();
1094+
}
1095+
10661096
sqlBuilder.append(" ");
10671097
sqlBuilder.append(filterCount == 0 ? WHERE : AND);
10681098
sqlBuilder.append(" not exists (");
@@ -1088,8 +1118,6 @@ public QueryBuilder filterByNotExists(QueryBuilder queryBuilder) {
10881118
public QueryBuilder ordered(boolean ascending) {
10891119
var first = types.getFirst();
10901120

1091-
var tableName = getTableName(first);
1092-
10931121
sqlBuilder.append(" order by ");
10941122

10951123
var i = 0;
@@ -1099,8 +1127,6 @@ public QueryBuilder ordered(boolean ascending) {
10991127
sqlBuilder.append(", ");
11001128
}
11011129

1102-
sqlBuilder.append(tableName);
1103-
sqlBuilder.append(".");
11041130
sqlBuilder.append(indexColumnName);
11051131
sqlBuilder.append(" ");
11061132
sqlBuilder.append(ascending ? "asc" : "desc");

kilo-client/src/test/java/org/httprpc/kilo/sql/QueryBuilderTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public void testSelectIHGF() {
315315
+ "join H on I.h = H.h "
316316
+ "join G on H.g = G.g "
317317
+ "where G.f = ? "
318-
+ "order by I.t asc, I.u asc", queryBuilder.toString());
318+
+ "order by t asc, u asc", queryBuilder.toString());
319319

320320
assertEquals(listOf("f"), getParameters(queryBuilder));
321321
}
@@ -332,7 +332,7 @@ public void testSelectIJK() {
332332
+ "join J on I.i = J.i "
333333
+ "join K on J.i = K.i "
334334
+ "where I.i = ? "
335-
+ "order by I.t desc, I.u desc", queryBuilder.toString());
335+
+ "order by t desc, u desc", queryBuilder.toString());
336336

337337
assertEquals(listOf("i"), getParameters(queryBuilder));
338338
}
@@ -431,6 +431,14 @@ public void testNotExists() {
431431
assertEquals(listOf("b"), getParameters(queryBuilder));
432432
}
433433

434+
@Test
435+
public void testUnion() {
436+
var queryBuilder = QueryBuilder.select(A.class).filterByPrimaryKey("a1").union(QueryBuilder.select(A.class).filterByPrimaryKey("a2"));
437+
438+
assertEquals("select A.a, A.b, A.c, A.d as x from A where A.a = ? union select A.a, A.b, A.c, A.d as x from A where A.a = ?", queryBuilder.toString());
439+
assertEquals(listOf("a1", "a2"), getParameters(queryBuilder));
440+
}
441+
434442
@Test
435443
public void testInsert() {
436444
var queryBuilder = QueryBuilder.insert(A.class);

0 commit comments

Comments
 (0)