55import java .util .List ;
66import java .util .function .Function ;
77
8+ import io .weaviate .client6 .v1 .api .collections .query .Filter ;
89import io .weaviate .client6 .v1 .internal .ObjectBuilder ;
910import io .weaviate .client6 .v1 .internal .grpc .protocol .WeaviateProtoAggregate ;
11+ import io .weaviate .client6 .v1 .internal .grpc .protocol .WeaviateProtoBase ;
1012
1113public record Aggregation (
1214 AggregateObjectFilter filter ,
15+ Filter whereFilter ,
1316 Integer objectLimit ,
1417 boolean includeTotalCount ,
1518 List <PropertyAggregation > returnMetrics ) {
@@ -29,6 +32,7 @@ public static Aggregation of(AggregateObjectFilter objectFilter, Function<Builde
2932 public Aggregation (Builder builder ) {
3033 this (
3134 builder .objectFilter ,
35+ builder .whereFilter ,
3236 builder .objectLimit ,
3337 builder .includeTotalCount ,
3438 builder .metrics );
@@ -41,6 +45,7 @@ public Builder(AggregateObjectFilter objectFilter) {
4145 this .objectFilter = objectFilter ;
4246 }
4347
48+ private Filter whereFilter ;
4449 private List <PropertyAggregation > metrics = new ArrayList <>();
4550 private Integer objectLimit ;
4651 private boolean includeTotalCount = false ;
@@ -55,6 +60,24 @@ public final Builder includeTotalCount(boolean include) {
5560 return this ;
5661 }
5762
63+ /**
64+ * Filter result set using traditional filtering operators: {@code eq},
65+ * {@code gte}, {@code like}, etc.
66+ * Subsequent calls to {@link #filter} aggregate with an AND operator.
67+ */
68+ public final Builder filters (Filter filter ) {
69+ this .whereFilter = this .whereFilter == null
70+ ? filter
71+ : Filter .and (this .whereFilter , filter );
72+ return this ;
73+ }
74+
75+ /** Combine several conditions using with an AND operator. */
76+ public final Builder filters (Filter ... filters ) {
77+ Arrays .stream (filters ).map (this ::filters );
78+ return this ;
79+ }
80+
5881 @ SafeVarargs
5982 public final Builder metrics (PropertyAggregation ... metrics ) {
6083 this .metrics = Arrays .asList (metrics );
@@ -80,6 +103,12 @@ public void appendTo(WeaviateProtoAggregate.AggregateRequest.Builder req) {
80103 req .setObjectLimit (objectLimit );
81104 }
82105
106+ if (whereFilter != null ) {
107+ var protoFilters = WeaviateProtoBase .Filters .newBuilder ();
108+ whereFilter .appendTo (protoFilters );
109+ req .setFilters (protoFilters );
110+ }
111+
83112 for (final var metric : returnMetrics ) {
84113 var aggregation = WeaviateProtoAggregate .AggregateRequest .Aggregation .newBuilder ();
85114 metric .appendTo (aggregation );
0 commit comments