Add aggregate functions and streams in queryable store

First, aggregate functions for minimum, maximum, sum and average
have been added to the queryable store API. These can be used
with the query fields, which have been enhanced for this.

Second, an additional stream like API has been added to retrieve
collections to avoid the creation of huge result objects.
This commit is contained in:
Rene Pfeuffer
2025-04-09 13:12:33 +02:00
parent 395a2edeb3
commit 01e8d493d2
18 changed files with 443 additions and 136 deletions

View File

@@ -20,21 +20,17 @@ import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.TypeName;
class NumberQueryFieldHandler extends QueryFieldHandler {
public NumberQueryFieldHandler(String packageName, String className) {
this(packageName, className, null);
}
public NumberQueryFieldHandler(String packageName, String className, String suffix) {
NumberQueryFieldHandler(String className) {
super(
"NumberQueryField",
new TypeName[]{ClassName.get(packageName, className)},
className + "QueryField",
new TypeName[]{},
(fieldBuilder, element, fieldClass, fieldName) -> fieldBuilder
.initializer(
"new $T<>($S)",
ClassName.get("sonia.scm.store", "QueryableStore").nestedClass(fieldClass),
fieldName
),
suffix
null
);
}
}

View File

@@ -264,19 +264,15 @@ class QueryFieldClassCreator {
SIMPLE_INITIALIZER));
case "int", "java.lang.Integer" -> List.of(
new NumberQueryFieldHandler(
"java.lang",
"Integer"));
case "long", "java.lang.Long" -> List.of(
new NumberQueryFieldHandler(
"java.lang",
"Long"));
case "float", "java.lang.Float" -> List.of(
new NumberQueryFieldHandler(
"java.lang",
"Float"));
case "double", "java.lang.Double" -> List.of(
new NumberQueryFieldHandler(
"java.lang",
"Double"));
case "java.util.Date", "java.time.Instant" -> List.of(
new QueryFieldHandler(

View File

@@ -16,35 +16,31 @@
package sonia.scm.testing;
import java.lang.Double;
import java.lang.Float;
import java.lang.Integer;
import java.lang.Long;
import sonia.scm.store.QueryableStore;
public final class DQueryFields {
public static final QueryableStore.IdQueryField<D> INTERNAL_ID =
new QueryableStore.IdQueryField<>();
public static final QueryableStore.NumberQueryField<D, Integer> AGE =
new QueryableStore.NumberQueryField<>("age");
public static final QueryableStore.NumberQueryField<D, Integer> WEIGHT =
new QueryableStore.NumberQueryField<>("weight");
public static final QueryableStore.IntegerQueryField<D> AGE =
new QueryableStore.IntegerQueryField<>("age");
public static final QueryableStore.IntegerQueryField<D> WEIGHT =
new QueryableStore.IntegerQueryField<>("weight");
public static final QueryableStore.NumberQueryField<D, Long> CREATIONTIME =
new QueryableStore.NumberQueryField<>("creationTime");
public static final QueryableStore.NumberQueryField<D, Long> LASTMODIFIED =
new QueryableStore.NumberQueryField<>("lastModified");
public static final QueryableStore.LongQueryField<D> CREATIONTIME =
new QueryableStore.LongQueryField<>("creationTime");
public static final QueryableStore.LongQueryField<D> LASTMODIFIED =
new QueryableStore.LongQueryField<>("lastModified");
public static final QueryableStore.NumberQueryField<D, Float> HEIGHT =
new QueryableStore.NumberQueryField<>("height");
public static final QueryableStore.NumberQueryField<D, Float> WIDTH =
new QueryableStore.NumberQueryField<>("width");
public static final QueryableStore.FloatQueryField<D> HEIGHT =
new QueryableStore.FloatQueryField<>("height");
public static final QueryableStore.FloatQueryField<D> WIDTH =
new QueryableStore.FloatQueryField<>("width");
public static final QueryableStore.NumberQueryField<D, Double> PRICE =
new QueryableStore.NumberQueryField<>("price");
public static final QueryableStore.NumberQueryField<D, Double> MARGIN =
new QueryableStore.NumberQueryField<>("margin");
public static final QueryableStore.DoubleQueryField<D> PRICE =
new QueryableStore.DoubleQueryField<>("price");
public static final QueryableStore.DoubleQueryField<D> MARGIN =
new QueryableStore.DoubleQueryField<>("margin");
private DQueryFields() {
}