Skip to content

Commit f96f4fd

Browse files
authored
Feature/storm 14 (#17)
* Refactor query builder api. * Improve subquery handling. * Improve alias resolve error handling.
1 parent ef10fb8 commit f96f4fd

24 files changed

Lines changed: 562 additions & 519 deletions

README.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,8 @@ ORM::
367367
----
368368
List<User> users = ORM(dataSource).entity(User.class)
369369
.select()
370-
.where(it -> it.filter(User_.city, EQUALS, city)
371-
.and(it.filter(User_.birthDate, LESS_THAN, LocalDate.of(2000, 1, 1))))
370+
.where(it -> it.when(User_.city, EQUALS, city)
371+
.and(it.when(User_.birthDate, LESS_THAN, LocalDate.of(2000, 1, 1))))
372372
.getResultList();
373373
----
374374
SQL Template::
@@ -645,7 +645,7 @@ List<Ref<User>> users = ...;
645645
List<Role> roles = ORM(dataSource).entity(UserRole.class)
646646
.select(Role.class)
647647
.distinct()
648-
.whereRefs(UserRole_.user, users)
648+
.whereRef(UserRole_.user, users)
649649
.getResultList();
650650
----
651651
SQL Template::
@@ -776,7 +776,7 @@ ORM::
776776
+
777777
[source,java]
778778
----
779-
try (Stream<User> users = userRepository.select()) {
779+
try (Stream<User> users = userRepository.selectAll()) {
780780
List<Integer> userIds = users.map(User::id).toList();
781781
...
782782
}

storm-kotlin/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</goals>
4141
<configuration>
4242
<sourceDirs>
43-
<source>src/main/java</source>
43+
<source>src/main/kotlin</source>
4444
<source>target/generated-sources/annotations</source>
4545
</sourceDirs>
4646
</configuration>

storm-kotlin/src/main/java/st/orm/kotlin/template/KQueryBuilder.java

Lines changed: 139 additions & 179 deletions
Large diffs are not rendered by default.

storm-kotlin/src/main/java/st/orm/kotlin/template/KSubqueryTemplate.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,19 @@ public interface KSubqueryTemplate {
5151
* @param <T> the table type.
5252
* @param <R> the select type.
5353
*/
54-
default <T extends Record, R extends Record> KQueryBuilder<T, R, ?> subquery(@Nonnull KClass<T> fromType,
54+
default <T extends Record, R extends Record> KQueryBuilder<T, ?, ?> subquery(@Nonnull KClass<T> fromType,
5555
@Nonnull KClass<R> selectType) {
56-
return subquery(fromType, selectType, RAW."\{selectType}");
56+
return subquery(fromType, RAW."\{selectType}");
5757
}
5858

5959
/**
6060
* Create a subquery for the given table and select type using the given template.
6161
*
6262
* @param fromType the table to create the subquery for.
63-
* @param selectType the type to select.
6463
* @param template the template to use for the subquery.
6564
* @return the subquery builder.
6665
* @param <T> the table type.
67-
* @param <R> the select type.
6866
*/
69-
<T extends Record, R> KQueryBuilder<T, R, ?> subquery(@Nonnull KClass<T> fromType,
70-
@Nonnull KClass<R> selectType,
67+
<T extends Record> KQueryBuilder<T, ?, ?> subquery(@Nonnull KClass<T> fromType,
7168
@Nonnull StringTemplate template);
7269
}

storm-kotlin/src/main/java/st/orm/kotlin/template/impl/KQueryBuilderImpl.java

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,13 @@ private KPredicateBuilderImpl(@Nonnull PredicateBuilder<TX, RX, IDX> predicateBu
322322
}
323323

324324
@Override
325-
public KPredicateBuilder<TX, RX, IDX> and(@Nonnull KPredicateBuilder<TX, RX, IDX> predicate) {
326-
return new KPredicateBuilderImpl<>(predicateBuilder.and(((KPredicateBuilderImpl<TX, RX, IDX>) predicate).predicateBuilder));
325+
public KPredicateBuilder<TX, RX, IDX> and(@Nonnull KPredicateBuilder<?, ?, ?> predicate) {
326+
return new KPredicateBuilderImpl<>(predicateBuilder.and(((KPredicateBuilderImpl<?, ?, ?>) predicate).predicateBuilder));
327327
}
328328

329329
@Override
330-
public KPredicateBuilder<TX, RX, IDX> or(@Nonnull KPredicateBuilder<TX, RX, IDX> predicate) {
331-
return new KPredicateBuilderImpl<>(predicateBuilder.or(((KPredicateBuilderImpl<TX, RX, IDX>) predicate).predicateBuilder));
330+
public KPredicateBuilder<TX, RX, IDX> or(@Nonnull KPredicateBuilder<?, ?, ?> predicate) {
331+
return new KPredicateBuilderImpl<>(predicateBuilder.or(((KPredicateBuilderImpl<?, ?, ?>) predicate).predicateBuilder));
332332
}
333333
}
334334

@@ -340,14 +340,9 @@ private KWhereBuilderImpl(@Nonnull WhereBuilder<TX, RX, IDX> whereBuilder) {
340340
}
341341

342342
@Override
343-
public <T extends Record, R> KQueryBuilder<T, R, ?> subquery(@Nonnull KClass<T> fromType, @Nonnull KClass<R> selectType, @Nonnull StringTemplate template) {
343+
public <T extends Record> KQueryBuilder<T, ?, ?> subquery(@Nonnull KClass<T> fromType, @Nonnull StringTemplate template) {
344344
//noinspection unchecked
345-
return new KQueryBuilderImpl<>(whereBuilder.subquery((Class<T>) REFLECTION.getRecordType(fromType), (Class<R>) REFLECTION.getType(selectType), template));
346-
}
347-
348-
@Override
349-
public KPredicateBuilder<TX, RX, IDX> expression(@Nonnull StringTemplate template) throws PersistenceException {
350-
return new KPredicateBuilderImpl<>(whereBuilder.expression(template));
345+
return new KQueryBuilderImpl<>(whereBuilder.subquery((Class<T>) REFLECTION.getRecordType(fromType), template));
351346
}
352347

353348
@Override
@@ -361,68 +356,93 @@ public KPredicateBuilder<TX, RX, IDX> notExists(@Nonnull KQueryBuilder<?, ?, ?>
361356
}
362357

363358
@Override
364-
public KPredicateBuilder<TX, RX, IDX> filter(@Nonnull IDX id) {
365-
return new KPredicateBuilderImpl<>(whereBuilder.filter(id));
359+
public KPredicateBuilder<TX, RX, IDX> whereId(@Nonnull IDX id) {
360+
return new KPredicateBuilderImpl<>(whereBuilder.whereId(id));
361+
}
362+
363+
@Override
364+
public KPredicateBuilder<TX, RX, IDX> whereRef(@Nonnull Ref<TX> ref) {
365+
return new KPredicateBuilderImpl<>(whereBuilder.whereRef(ref));
366+
}
367+
368+
@Override
369+
public KPredicateBuilder<TX, RX, IDX> whereAnyRef(@Nonnull Ref<? extends Record> ref) {
370+
return new KPredicateBuilderImpl<>(whereBuilder.whereAnyRef(ref));
371+
}
372+
373+
@Override
374+
public KPredicateBuilder<TX, RX, IDX> where(@Nonnull TX record) {
375+
return new KPredicateBuilderImpl<>(whereBuilder.where(record));
376+
}
377+
378+
@Override
379+
public KPredicateBuilder<TX, RX, IDX> whereAny(@Nonnull Record record) {
380+
return new KPredicateBuilderImpl<>(whereBuilder.whereAny(record));
381+
}
382+
383+
@Override
384+
public KPredicateBuilder<TX, RX, IDX> whereId(@Nonnull Iterable<? extends IDX> it) {
385+
return new KPredicateBuilderImpl<>(whereBuilder.whereId(it));
366386
}
367387

368388
@Override
369-
public KPredicateBuilder<TX, RX, IDX> filter(@Nonnull Ref<TX> ref) {
370-
return new KPredicateBuilderImpl<>(whereBuilder.filter(ref));
389+
public KPredicateBuilder<TX, RX, IDX> whereRef(@Nonnull Iterable<? extends Ref<TX>> it) {
390+
return new KPredicateBuilderImpl<>(whereBuilder.whereRef(it));
371391
}
372392

373393
@Override
374-
public KPredicateBuilder<TX, RX, IDX> filter(@Nonnull TX record) {
375-
return new KPredicateBuilderImpl<>(whereBuilder.filter(record));
394+
public KPredicateBuilder<TX, RX, IDX> whereAnyRef(@Nonnull Iterable<? extends Ref<? extends Record>> it) {
395+
return new KPredicateBuilderImpl<>(whereBuilder.whereAnyRef(it));
376396
}
377397

378398
@Override
379-
public KPredicateBuilder<TX, RX, IDX> filterAny(@Nonnull Record record) {
380-
return new KPredicateBuilderImpl<>(whereBuilder.filterAny(record));
399+
public KPredicateBuilder<TX, RX, IDX> where(@Nonnull Iterable<? extends TX> it) {
400+
return new KPredicateBuilderImpl<>(whereBuilder.where(it));
381401
}
382402

383403
@Override
384-
public KPredicateBuilder<TX, RX, IDX> filterIds(@Nonnull Iterable<? extends IDX> it) {
385-
return new KPredicateBuilderImpl<>(whereBuilder.filterIds(it));
404+
public KPredicateBuilder<TX, RX, IDX> whereAny(@Nonnull Iterable<? extends Record> it) {
405+
return new KPredicateBuilderImpl<>(whereBuilder.whereAny(it));
386406
}
387407

388408
@Override
389-
public KPredicateBuilder<TX, RX, IDX> filterRefs(@Nonnull Iterable<? extends Ref<TX>> it) {
390-
return new KPredicateBuilderImpl<>(whereBuilder.filterRefs(it));
409+
public <V extends Record> KPredicateBuilder<TX, RX, IDX> where(@Nonnull Metamodel<TX, V> path, @Nonnull Ref<V> ref) {
410+
return new KPredicateBuilderImpl<>(whereBuilder.where(path, ref));
391411
}
392412

393413
@Override
394-
public KPredicateBuilder<TX, RX, IDX> filter(@Nonnull Iterable<? extends TX> it) {
395-
return new KPredicateBuilderImpl<>(whereBuilder.filter(it));
414+
public <V extends Record> KPredicateBuilder<TX, RX, IDX> whereAny(@Nonnull Metamodel<?, V> path, @Nonnull Ref<V> ref) {
415+
return new KPredicateBuilderImpl<>(whereBuilder.whereAny(path, ref));
396416
}
397417

398418
@Override
399-
public <V extends Record> KPredicateBuilder<TX, RX, IDX> filter(@Nonnull Metamodel<TX, V> path, @Nonnull Ref<V> ref) {
400-
return new KPredicateBuilderImpl<>(whereBuilder.filter(path, ref));
419+
public <V extends Record> KPredicateBuilder<TX, RX, IDX> whereRef(@Nonnull Metamodel<TX, V> path, @Nonnull Iterable<? extends Ref<V>> it) {
420+
return new KPredicateBuilderImpl<>(whereBuilder.whereRef(path, it));
401421
}
402422

403423
@Override
404-
public KPredicateBuilder<TX, RX, IDX> filterAny(@Nonnull Iterable<? extends Record> it) {
405-
return new KPredicateBuilderImpl<>(whereBuilder.filterAny(it));
424+
public <V extends Record> KPredicateBuilder<TX, RX, IDX> whereAnyRef(@Nonnull Metamodel<?, V> path, @Nonnull Iterable<? extends Ref<V>> it) {
425+
return new KPredicateBuilderImpl<>(whereBuilder.whereAnyRef(path, it));
406426
}
407427

408428
@Override
409-
public <V extends Record> KPredicateBuilder<TX, RX, IDX> filterRefs(@Nonnull Metamodel<TX, V> path, @Nonnull Iterable<? extends Ref<V>> it) {
410-
return new KPredicateBuilderImpl<>(whereBuilder.filterRefs(path, it));
429+
public <V> KPredicateBuilder<TX, RX, IDX> where(@Nonnull Metamodel<TX, V> path, @Nonnull Operator operator, @Nonnull Iterable<? extends V> it) {
430+
return new KPredicateBuilderImpl<>(whereBuilder.where(path, operator, it));
411431
}
412432

413433
@Override
414-
public <V> KPredicateBuilder<TX, RX, IDX> filter(@Nonnull Metamodel<TX, V> path, @Nonnull Operator operator, @Nonnull Iterable<? extends V> it) {
415-
return new KPredicateBuilderImpl<>(whereBuilder.filter(path, operator, it));
434+
public <V> KPredicateBuilder<TX, RX, IDX> whereAny(@Nonnull Metamodel<?, V> path, @Nonnull Operator operator, @Nonnull Iterable<? extends V> it) {
435+
return new KPredicateBuilderImpl<>(whereBuilder.whereAny(path, operator, it));
416436
}
417437

418438
@Override
419-
public <V> KPredicateBuilder<TX, RX, IDX> filterAny(@Nonnull Metamodel<?, V> path, @Nonnull Operator operator, @Nonnull Iterable<? extends V> it) {
420-
return new KPredicateBuilderImpl<>(whereBuilder.filterAny(path, operator, it));
439+
public KPredicateBuilder<TX, RX, IDX> where(@Nonnull StringTemplate template) throws PersistenceException {
440+
return new KPredicateBuilderImpl<>(whereBuilder.where(template));
421441
}
422442

423443
@Override
424-
protected <V> KPredicateBuilder<TX, RX, IDX> filterImpl(@Nonnull Metamodel<?, V> path, @Nonnull Operator operator, @Nonnull V[] o) {
425-
return new KPredicateBuilderImpl<>(whereBuilder.filterAny(path, operator, o));
444+
protected <V> KPredicateBuilder<TX, RX, IDX> whereImpl(@Nonnull Metamodel<?, V> path, @Nonnull Operator operator, @Nonnull V[] o) {
445+
return new KPredicateBuilderImpl<>(whereBuilder.whereAny(path, operator, o));
426446
}
427447
}
428448

storm-kotlin/src/test/java/st/orm/kotlin/KotlinBuilderPreparedStatementIntegrationTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ open class KotlinBuilderPreparedStatementIntegrationTest {
4646
fun testBuilderWithWhere() {
4747
val list = ORM(dataSource)
4848
.selectFrom(Vet::class)
49-
.where { it.filter(1).or(it.filter(2)) }
49+
.where { it.whereId(1).or(it.whereId(2)) }
5050
.resultList
5151
Assertions.assertEquals(2, list.size)
5252
}
@@ -64,7 +64,7 @@ open class KotlinBuilderPreparedStatementIntegrationTest {
6464
fun testBuilderWithWhereTemplateFunction() {
6565
val list = ORM(dataSource)
6666
.selectFrom(Vet::class)
67-
.where { it.expression { "1 = 1" } }
67+
.where { it.where { "1 = 1" } }
6868
.resultList
6969
Assertions.assertEquals(6, list.size)
7070
}
@@ -73,7 +73,7 @@ open class KotlinBuilderPreparedStatementIntegrationTest {
7373
fun testBuilderWithWhereTemplateFunctionAfterOr() {
7474
val list = ORM(dataSource)
7575
.selectFrom(Vet::class)
76-
.where { it.filter(1).or(it.expression {"${it(Vet::class)}.id = ${it(2)}"}) }
76+
.where { it.whereId(1).or(it.where {"${it(Vet::class)}.id = ${it(2)}"}) }
7777
.resultList
7878
Assertions.assertEquals(2, list.size)
7979
}

storm-kotlin/src/test/java/st/orm/kotlin/KotlinRepositoryPreparedStatementIntegrationTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ open class KotlinRepositoryPreparedStatementIntegrationTest {
5151
val list = ORM(dataSource).entity(Pet::class)
5252
.select()
5353
.innerJoin(Visit::class).on(Pet::class)
54-
.whereAny(Visit(1, null, null, null))
54+
.where { it.whereAny(Visit(1, null, null, null)) }
5555
.resultList
5656
assertEquals(1, list.size)
5757
assertEquals(7, list[0].id)

storm/src/main/java/st/orm/spi/BaseRepositoryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ public Stream<E> select(@Nonnull Stream<ID> ids) {
290290
* connectivity.
291291
*/
292292
public Stream<E> select(@Nonnull Stream<ID> ids, int batchSize) {
293-
return slice(ids, batchSize, batch -> select().whereIds(batch).getResultStream()); // Stream returned by getResultStream is closed by the batch operation.
293+
return slice(ids, batchSize, batch -> select().whereId(batch).getResultStream()); // Stream returned by getResultStream is closed by the batch operation.
294294
}
295295

296296
/**
@@ -325,7 +325,7 @@ public long count(@Nonnull Stream<ID> ids) {
325325
public long count(@Nonnull Stream<ID> ids, int batchSize) {
326326
return slice(ids, batchSize)
327327
.mapToLong(slice -> select(Long.class, RAW."COUNT(*)")
328-
.whereIds(slice)
328+
.whereId(slice)
329329
.getSingleResult())
330330
.sum();
331331
}

0 commit comments

Comments
 (0)