Skip to content

Commit b00c7cc

Browse files
committed
HSEARCH-5133 Address a bit the RAW model type
1 parent 95d17dd commit b00c7cc

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/impl/ElasticsearchMetricFieldAggregation.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ private TypeSelector(ElasticsearchFieldCodec<F> codec,
126126
@Override
127127
public <T> Builder<F, T> type(Class<T> expectedType, ValueModel valueModel) {
128128
ProjectionConverter<F, ? extends T> projectionConverter = null;
129-
if ( !Double.class.isAssignableFrom( expectedType )
130-
||
131-
field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( expectedType ) ) {
129+
if ( useProjectionConverter( expectedType, valueModel ) ) {
132130
projectionConverter = field.type().projectionConverter( valueModel )
133131
.withConvertedType( expectedType, field );
134132
}
@@ -137,6 +135,18 @@ public <T> Builder<F, T> type(Class<T> expectedType, ValueModel valueModel) {
137135
operation
138136
);
139137
}
138+
139+
private <T> boolean useProjectionConverter(Class<T> expectedType, ValueModel valueModel) {
140+
if ( !Double.class.isAssignableFrom( expectedType ) ) {
141+
return true;
142+
}
143+
144+
// expectedType == Double.class
145+
if ( ValueModel.RAW.equals( valueModel ) ) {
146+
return false;
147+
}
148+
return field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( Double.class );
149+
}
140150
}
141151

142152
private class MetricFieldExtractor extends AbstractExtractor<K> {

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/types/aggregation/impl/AbstractLuceneMetricCompensatedSumAggregation.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,26 @@ protected TypeSelector(AbstractLuceneNumericFieldCodec<F, ?> codec,
9090
@Override
9191
public <T> Builder<F, ?, T> type(Class<T> expectedType, ValueModel valueModel) {
9292
ProjectionConverter<F, ? extends T> projectionConverter = null;
93-
if ( !Double.class.isAssignableFrom( expectedType )
94-
||
95-
field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( expectedType ) ) {
93+
if ( useProjectionConverter( expectedType, valueModel ) ) {
9694
projectionConverter = field.type().projectionConverter( valueModel )
9795
.withConvertedType( expectedType, field );
9896
}
9997

10098
return getFtBuilder( projectionConverter );
10199
}
102100

101+
private <T> boolean useProjectionConverter(Class<T> expectedType, ValueModel valueModel) {
102+
if ( !Double.class.isAssignableFrom( expectedType ) ) {
103+
return true;
104+
}
105+
106+
// expectedType == Double.class
107+
if ( ValueModel.RAW.equals( valueModel ) ) {
108+
return false;
109+
}
110+
return field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( Double.class );
111+
}
112+
103113
protected abstract <T> Builder<F, ? extends Number, T> getFtBuilder(
104114
ProjectionConverter<F, ? extends T> projectionConverter);
105115
}

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/types/aggregation/impl/AbstractLuceneMetricNumericFieldAggregation.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,26 @@ protected TypeSelector(AbstractLuceneNumericFieldCodec<F, ?> codec,
107107
@Override
108108
public <T> Builder<F, ?, T> type(Class<T> expectedType, ValueModel valueModel) {
109109
ProjectionConverter<F, ? extends T> projectionConverter = null;
110-
if ( !Double.class.isAssignableFrom( expectedType )
111-
||
112-
field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( expectedType ) ) {
110+
if ( useProjectionConverter( expectedType, valueModel ) ) {
113111
projectionConverter = field.type().projectionConverter( valueModel )
114112
.withConvertedType( expectedType, field );
115113
}
116114

117115
return getFtBuilder( projectionConverter );
118116
}
119117

118+
private <T> boolean useProjectionConverter(Class<T> expectedType, ValueModel valueModel) {
119+
if ( !Double.class.isAssignableFrom( expectedType ) ) {
120+
return true;
121+
}
122+
123+
// expectedType == Double.class
124+
if ( ValueModel.RAW.equals( valueModel ) ) {
125+
return false;
126+
}
127+
return field.type().projectionConverter( valueModel ).valueType().isAssignableFrom( Double.class );
128+
}
129+
120130
protected abstract <T> Builder<F, ? extends Number, T> getFtBuilder(
121131
ProjectionConverter<F, ? extends T> projectionConverter);
122132
}

integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricNumericFieldsAggregationsIT.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ void test_filteringResults() {
105105
assertThat( result.aggregation( avgIntegersAsString ) ).isEqualTo( "5" );
106106
assertThat( result.aggregation( avgConverted ) ).isEqualTo( "5" );
107107
assertThat( result.aggregation( avgIntegersAsDouble ) ).isEqualTo( 5.8 );
108+
assertThat( result.aggregation( avgIntegersAsDoubleRaw ) ).isEqualTo( 5.8 );
108109
assertThat( result.aggregation( avgIntegersAsDoubleFiltered ) ).isEqualTo( 7.666666666666667 );
109110
assertThat( result.aggregation( sumDoubles ) ).isEqualTo( 29.0 );
110111
assertThat( result.aggregation( sumFloats ) ).isEqualTo( 29F );
@@ -145,6 +146,7 @@ void test_allResults() {
145146
assertThat( result.aggregation( avgIntegersAsString ) ).isEqualTo( "5" );
146147
assertThat( result.aggregation( avgConverted ) ).isEqualTo( "5" );
147148
assertThat( result.aggregation( avgIntegersAsDouble ) ).isEqualTo( 5.5 );
149+
assertThat( result.aggregation( avgIntegersAsDoubleRaw ) ).isEqualTo( 5.5 );
148150
assertThat( result.aggregation( avgIntegersAsDoubleFiltered ) ).isEqualTo( 11.8 );
149151
assertThat( result.aggregation( sumDoubles ) ).isEqualTo( 55.0 );
150152
assertThat( result.aggregation( sumFloats ) ).isEqualTo( 55F );
@@ -166,12 +168,6 @@ private SearchQuery<DocumentReference> defineAggregations(
166168
.isInstanceOf( AssertionFailure.class )
167169
.hasMessageContaining( "Raw projection converter is not supported" );
168170

169-
assertThatThrownBy( () -> {
170-
options.aggregation( avgIntegersAsDoubleRaw, f -> f.avg().field( "integer", Double.class, ValueModel.RAW ) );
171-
} )
172-
.isInstanceOf( AssertionFailure.class )
173-
.hasMessageContaining( "Raw projection converter is not supported" );
174-
175171
return options
176172
.aggregation( sumIntegers, f -> f.sum().field( "integer", Integer.class ) )
177173
.aggregation( sumIntegersAsString, f -> f.sum().field( "integer", String.class, ValueModel.STRING ) )
@@ -194,6 +190,7 @@ private SearchQuery<DocumentReference> defineAggregations(
194190
.aggregation( avgIntegersAsString, f -> f.avg().field( "integer", String.class, ValueModel.STRING ) )
195191
.aggregation( avgConverted, f -> f.avg().field( "converted", String.class ) )
196192
.aggregation( avgIntegersAsDouble, f -> f.avg().field( "integer", Double.class ) )
193+
.aggregation( avgIntegersAsDoubleRaw, f -> f.avg().field( "integer", Double.class, ValueModel.RAW ) )
197194
.aggregation( avgIntegersAsDoubleFiltered, f -> f.avg().field( "object.nestedInteger", Double.class )
198195
.filter( ff -> ff.range().field( "object.nestedInteger" ).atLeast( 5 ) ) )
199196
.aggregation( sumDoubles, f -> f.sum().field( "doubleF", Double.class ) )

0 commit comments

Comments
 (0)