Skip to content

Commit

Permalink
HSEARCH-5133 Push operations into each Lucene*Aggregation
Browse files Browse the repository at this point in the history
  • Loading branch information
fax4ever committed Aug 27, 2024
1 parent 2972d63 commit 9c15aa2
Show file tree
Hide file tree
Showing 11 changed files with 175 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,41 +121,30 @@ private TypeSelector(AbstractLuceneNumericFieldCodec<F, ?> codec,
.withConvertedType( expectedType, field );
}

return new Builder<>( codec, scope, field,
projectionConverter,
operation
);
if ( "sum".equals( operation ) ) {
return new LuceneSumCompensatedSumAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else if ( "avg".equals( operation ) ) {
return new LuceneAvgCompensatedSumAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else {
throw new AssertionFailure( "Aggregation operation not supported: " + operation );
}
}
}

protected static class Builder<F, E extends Number, K> extends AbstractBuilder<K>
protected abstract static class Builder<F, E extends Number, K> extends AbstractBuilder<K>
implements FieldMetricAggregationBuilder<K> {

private final AbstractLuceneNumericFieldCodec<F, E> codec;
private final ProjectionConverter<F, ? extends K> fromFieldValueConverter;
private final String operation;

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec, LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter,
String operation) {
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( scope, field );
this.codec = codec;
this.fromFieldValueConverter = fromFieldValueConverter;
this.operation = operation;
}

@Override
public AbstractLuceneMetricCompensatedSumAggregation<F, E, K> build() {
if ( "sum".equals( operation ) ) {
return new LuceneSumCompensatedSumAggregation<>( this );
}
else if ( "avg".equals( operation ) ) {
return new LuceneAvgCompensatedSumAggregation<>( this );
}
else {
throw new AssertionFailure( "Aggregation operation not supported: " + operation );
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,47 +138,36 @@ private TypeSelector(AbstractLuceneNumericFieldCodec<F, ?> codec,
.withConvertedType( expectedType, field );
}

return new Builder<>( codec, scope, field,
projectionConverter,
operation
);
if ( "sum".equals( operation ) ) {
return new LuceneSumNumericFieldAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else if ( "min".equals( operation ) ) {
return new LuceneMinNumericFieldAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else if ( "max".equals( operation ) ) {
return new LuceneMaxNumericFieldAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else if ( "avg".equals( operation ) ) {
return new LuceneAvgNumericFieldAggregation.Builder<>( codec, scope, field, projectionConverter );
}
else {
throw new AssertionFailure( "Aggregation operation not supported: " + operation );
}
}
}

protected static class Builder<F, E extends Number, K> extends AbstractBuilder<K>
protected abstract static class Builder<F, E extends Number, K> extends AbstractBuilder<K>
implements FieldMetricAggregationBuilder<K> {

private final AbstractLuceneNumericFieldCodec<F, E> codec;
private final ProjectionConverter<F, ? extends K> fromFieldValueConverter;
private final String operation;

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec, LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter,
String operation) {
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( scope, field );
this.codec = codec;
this.fromFieldValueConverter = fromFieldValueConverter;
this.operation = operation;
}

@Override
public AbstractLuceneMetricNumericFieldAggregation<F, E, K> build() {
if ( "sum".equals( operation ) ) {
return new LuceneSumNumericFieldAggregation<>( this );
}
else if ( "min".equals( operation ) ) {
return new LuceneMinNumericFieldAggregation<>( this );
}
else if ( "max".equals( operation ) ) {
return new LuceneMaxNumericFieldAggregation<>( this );
}
else if ( "avg".equals( operation ) ) {
return new LuceneAvgNumericFieldAggregation<>( this );
}
else {
throw new AssertionFailure( "Aggregation operation not supported: " + operation );
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public abstract class AbstractLuceneMetricNumericLongAggregation extends Abstrac

protected CollectorKey<?, Long> collectorKey;

AbstractLuceneMetricNumericLongAggregation(Builder builder) {
AbstractLuceneMetricNumericLongAggregation(AbstractBuilder<Long> builder) {
super( builder );
this.indexNames = builder.scope.hibernateSearchIndexNames();
this.absoluteFieldPath = builder.field.absolutePath();
Expand Down Expand Up @@ -69,27 +69,11 @@ protected Factory(AbstractLuceneNumericFieldCodec<F, ?> codec, String operation)
@Override
public FieldMetricAggregationBuilder<Long> create(LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field) {
return new Builder( scope, field, operation );
}
}

protected static class Builder extends AbstractBuilder<Long> implements FieldMetricAggregationBuilder<Long> {
private final String operation;

public Builder(LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<?> field,
String operation) {
super( scope, field );
this.operation = operation;
}

@Override
public AbstractLuceneMetricNumericLongAggregation build() {
if ( "value_count".equals( operation ) ) {
return new LuceneCountNumericLongAggregation( this );
return new LuceneCountNumericLongAggregation.Builder( scope, field );
}
else if ( "cardinality".equals( operation ) ) {
return new LuceneCountDistinctNumericLongAggregation( this );
return new LuceneCountDistinctNumericLongAggregation.Builder( scope, field );
}
else {
throw new AssertionFailure( "Aggregation operation not supported: " + operation );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationExtractContext;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.backend.lucene.types.lowlevel.impl.LuceneNumericDomain;
import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter;

public class LuceneAvgCompensatedSumAggregation<F, E extends Number, K>
extends AbstractLuceneMetricCompensatedSumAggregation<F, E, K> {
Expand Down Expand Up @@ -43,4 +46,20 @@ E extractEncoded(AggregationExtractContext context, LuceneNumericDomain<E> numer
double avg = ( sum / counts );
return numericDomain.doubleToTerm( avg );
}

protected static class Builder<F, E extends Number, K>
extends AbstractLuceneMetricCompensatedSumAggregation.Builder<F, E, K> {

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec,
LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( codec, scope, field, fromFieldValueConverter );
}

@Override
public AbstractLuceneMetricCompensatedSumAggregation<F, E, K> build() {
return new LuceneAvgCompensatedSumAggregation<>( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
import org.hibernate.search.backend.lucene.lowlevel.aggregation.collector.impl.SumCollectorFactory;
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter;

public class LuceneAvgNumericFieldAggregation<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation<F, E, K> {
Expand All @@ -30,4 +33,20 @@ void fillCollectors(JoiningLongMultiValuesSource source, AggregationRequestConte
context.requireCollector( sumCollectorFactory );
context.requireCollector( countCollectorFactory );
}

protected static class Builder<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation.Builder<F, E, K> {

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec,
LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( codec, scope, field, fromFieldValueConverter );
}

@Override
public AbstractLuceneMetricNumericFieldAggregation<F, E, K> build() {
return new LuceneAvgNumericFieldAggregation<>( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
import org.hibernate.search.backend.lucene.lowlevel.aggregation.collector.impl.CountDistinctCollectorFactory;
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.engine.search.aggregation.spi.FieldMetricAggregationBuilder;

public class LuceneCountDistinctNumericLongAggregation extends AbstractLuceneMetricNumericLongAggregation {

Expand All @@ -25,4 +28,15 @@ void fillCollectors(JoiningLongMultiValuesSource source, AggregationRequestConte
collectorKey = collectorFactory.getCollectorKey();
context.requireCollector( collectorFactory );
}

protected static class Builder extends AbstractBuilder<Long> implements FieldMetricAggregationBuilder<Long> {
public Builder(LuceneSearchIndexScope<?> scope, LuceneSearchIndexValueFieldContext<?> field) {
super( scope, field );
}

@Override
public AbstractLuceneMetricNumericLongAggregation build() {
return new LuceneCountDistinctNumericLongAggregation( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@
import org.hibernate.search.backend.lucene.lowlevel.aggregation.collector.impl.CountCollectorFactory;
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.engine.search.aggregation.spi.FieldMetricAggregationBuilder;

public class LuceneCountNumericLongAggregation extends AbstractLuceneMetricNumericLongAggregation {

public static <F> Factory<F> factory(AbstractLuceneNumericFieldCodec<F, ?> codec) {
return new Factory<>( codec, "value_count" );
}

LuceneCountNumericLongAggregation(AbstractLuceneMetricNumericLongAggregation.Builder builder) {
LuceneCountNumericLongAggregation(Builder builder) {
super( builder );
}

Expand All @@ -25,4 +28,15 @@ void fillCollectors(JoiningLongMultiValuesSource source, AggregationRequestConte
collectorKey = collectorFactory.getCollectorKey();
context.requireCollector( collectorFactory );
}

protected static class Builder extends AbstractBuilder<Long> implements FieldMetricAggregationBuilder<Long> {
public Builder(LuceneSearchIndexScope<?> scope, LuceneSearchIndexValueFieldContext<?> field) {
super( scope, field );
}

@Override
public AbstractLuceneMetricNumericLongAggregation build() {
return new LuceneCountNumericLongAggregation( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
import org.hibernate.search.backend.lucene.lowlevel.aggregation.collector.impl.MaxCollectorFactory;
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter;

public class LuceneMaxNumericFieldAggregation<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation<F, E, K> {
Expand All @@ -26,4 +29,20 @@ void fillCollectors(JoiningLongMultiValuesSource source, AggregationRequestConte
collectorKey = collectorFactory.getCollectorKey();
context.requireCollector( collectorFactory );
}

protected static class Builder<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation.Builder<F, E, K> {

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec,
LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( codec, scope, field, fromFieldValueConverter );
}

@Override
public AbstractLuceneMetricNumericFieldAggregation<F, E, K> build() {
return new LuceneMaxNumericFieldAggregation<>( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
import org.hibernate.search.backend.lucene.lowlevel.aggregation.collector.impl.MinCollectorFactory;
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter;

public class LuceneMinNumericFieldAggregation<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation<F, E, K> {
Expand All @@ -26,4 +29,20 @@ void fillCollectors(JoiningLongMultiValuesSource source, AggregationRequestConte
collectorKey = collectorFactory.getCollectorKey();
context.requireCollector( collectorFactory );
}

protected static class Builder<F, E extends Number, K>
extends AbstractLuceneMetricNumericFieldAggregation.Builder<F, E, K> {

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec,
LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( codec, scope, field, fromFieldValueConverter );
}

@Override
public AbstractLuceneMetricNumericFieldAggregation<F, E, K> build() {
return new LuceneMinNumericFieldAggregation<>( this );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationExtractContext;
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationRequestContext;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexScope;
import org.hibernate.search.backend.lucene.search.common.impl.LuceneSearchIndexValueFieldContext;
import org.hibernate.search.backend.lucene.types.codec.impl.AbstractLuceneNumericFieldCodec;
import org.hibernate.search.backend.lucene.types.lowlevel.impl.LuceneNumericDomain;
import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter;

public class LuceneSumCompensatedSumAggregation<F, E extends Number, K>
extends AbstractLuceneMetricCompensatedSumAggregation<F, E, K> {
Expand All @@ -18,7 +21,7 @@ public static <F> Factory<F> factory(AbstractLuceneNumericFieldCodec<F, ?> codec
return new Factory<>( codec, "sum" );
}

LuceneSumCompensatedSumAggregation(AbstractLuceneMetricCompensatedSumAggregation.Builder<F, E, K> builder) {
LuceneSumCompensatedSumAggregation(Builder<F, E, K> builder) {
super( builder );
}

Expand All @@ -36,4 +39,20 @@ E extractEncoded(AggregationExtractContext context, LuceneNumericDomain<E> numer
Double sum = context.getFacets( compensatedSumCollectorKey );
return numericDomain.doubleToTerm( sum );
}

protected static class Builder<F, E extends Number, K>
extends AbstractLuceneMetricCompensatedSumAggregation.Builder<F, E, K> {

public Builder(AbstractLuceneNumericFieldCodec<F, E> codec,
LuceneSearchIndexScope<?> scope,
LuceneSearchIndexValueFieldContext<F> field,
ProjectionConverter<F, ? extends K> fromFieldValueConverter) {
super( codec, scope, field, fromFieldValueConverter );
}

@Override
public AbstractLuceneMetricCompensatedSumAggregation<F, E, K> build() {
return new LuceneSumCompensatedSumAggregation<>( this );
}
}
}
Loading

0 comments on commit 9c15aa2

Please sign in to comment.