Skip to content

Commit

Permalink
HSEARCH-3273 Wrap field structure parameters with a single object in …
Browse files Browse the repository at this point in the history
…integration tests

Just in case we need to expand this to more tests.
  • Loading branch information
yrodiere committed May 5, 2020
1 parent 84e4d41 commit 8125757
Show file tree
Hide file tree
Showing 7 changed files with 212 additions and 153 deletions.
Expand Up @@ -10,14 +10,14 @@
import java.math.BigInteger;

import org.hibernate.search.engine.search.common.SortMode;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.IndexFieldStructure;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TestedFieldStructure;
import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchTestHostConnectionConfiguration;
import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.dialect.ElasticsearchTestDialect;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TckBackendFeatures;

class ElasticsearchTckBackendFeatures extends TckBackendFeatures {

private ElasticsearchTestDialect dialect;
private final ElasticsearchTestDialect dialect;

ElasticsearchTckBackendFeatures(ElasticsearchTestDialect dialect) {
this.dialect = dialect;
Expand Down Expand Up @@ -69,11 +69,9 @@ public boolean fastTimeoutResolution() {
}

@Override
public boolean sortByFieldValue(IndexFieldStructure indexFieldStructure, Class<?> fieldType, SortMode sortMode) {
public boolean sortByFieldValue(TestedFieldStructure fieldStructure, Class<?> fieldType, SortMode sortMode) {
if (
( indexFieldStructure == IndexFieldStructure.IN_NESTED
|| indexFieldStructure == IndexFieldStructure.IN_NESTED_REQUIRING_FILTER
|| indexFieldStructure == IndexFieldStructure.IN_NESTED_TWICE )
fieldStructure.isNested()
&& sortMode == SortMode.MAX
&& ( Float.class.equals( fieldType )
|| Double.class.equals( fieldType )
Expand Down
Expand Up @@ -38,8 +38,7 @@
import org.hibernate.search.integrationtest.backend.tck.testsupport.operations.expectations.AggregationScenario;
import org.hibernate.search.integrationtest.backend.tck.testsupport.operations.expectations.SupportedSingleFieldAggregationExpectations;
import org.hibernate.search.integrationtest.backend.tck.testsupport.types.FieldTypeDescriptor;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.IndexFieldStructure;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.IndexFieldValueCardinality;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TestedFieldStructure;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.SimpleFieldModelsByType;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.rule.SearchSetupHelper;
import org.hibernate.search.util.impl.integrationtest.common.assertion.SearchResultAssert;
Expand Down Expand Up @@ -68,7 +67,7 @@ public class SingleFieldAggregationBaseIT<F> {
private static Set<FieldTypeDescriptor<?>> supportedFieldTypes;
private static List<DataSet<?>> dataSets;

@Parameterized.Parameters(name = "{0} - {1} - {2}")
@Parameterized.Parameters(name = "{0} - {1}")
public static Object[][] parameters() {
supportedFieldTypes = new LinkedHashSet<>();
dataSets = new ArrayList<>();
Expand All @@ -78,13 +77,11 @@ public static Object[][] parameters() {
Optional<? extends SupportedSingleFieldAggregationExpectations<?>> expectations =
aggregationDescriptor.getSingleFieldAggregationExpectations( fieldTypeDescriptor ).getSupported();
if ( expectations.isPresent() ) {
for ( IndexFieldStructure fieldStructure : IndexFieldStructure.values() ) {
for ( IndexFieldValueCardinality valueCardinality : IndexFieldValueCardinality.values() ) {
supportedFieldTypes.add( fieldTypeDescriptor );
DataSet<?> dataSet = new DataSet<>( expectations.get(), fieldStructure, valueCardinality );
dataSets.add( dataSet );
parameters.add( new Object[] { expectations.get(), fieldStructure, valueCardinality, dataSet } );
}
for ( TestedFieldStructure fieldStructure : TestedFieldStructure.all() ) {
supportedFieldTypes.add( fieldTypeDescriptor );
DataSet<?> dataSet = new DataSet<>( expectations.get(), fieldStructure );
dataSets.add( dataSet );
parameters.add( new Object[] { expectations.get(), fieldStructure, dataSet } );
}
}
}
Expand Down Expand Up @@ -127,17 +124,14 @@ public static void setup() {

private final SupportedSingleFieldAggregationExpectations<F> expectations;
private final FieldTypeDescriptor<F> fieldType;
private final IndexFieldStructure fieldStructure;
private final IndexFieldValueCardinality valueCardinality;
private final TestedFieldStructure fieldStructure;
private final DataSet<F> dataSet;

public SingleFieldAggregationBaseIT(SupportedSingleFieldAggregationExpectations<F> expectations,
IndexFieldStructure fieldStructure, IndexFieldValueCardinality valueCardinality,
DataSet<F> dataSet) {
TestedFieldStructure fieldStructure, DataSet<F> dataSet) {
this.expectations = expectations;
this.fieldType = expectations.fieldType();
this.fieldStructure = fieldStructure;
this.valueCardinality = valueCardinality;
this.dataSet = dataSet;
}

Expand Down Expand Up @@ -182,7 +176,7 @@ private <A> void doTest_simple(AggregationScenario<A> scenario) {
}

private Function<? super SearchPredicateFactory, ? extends PredicateFinalStep> getFilterOrNull(IndexBinding binding) {
if ( fieldStructure == IndexFieldStructure.IN_NESTED_REQUIRING_FILTER ) {
if ( fieldStructure.isNestedFilterRequired() ) {
return pf -> pf.match()
.field( binding.nestedObjectRequiringFilter.relativeFieldName + ".discriminator" )
.matching( "included" );
Expand Down Expand Up @@ -296,7 +290,7 @@ private <A> void testValidAggregation(AggregationScenario<A> scenario, StubMappi

private AggregationScenario<?> getSimpleScenario() {
AggregationScenario<?> scenario;
if ( IndexFieldValueCardinality.SINGLE_VALUED.equals( valueCardinality ) ) {
if ( fieldStructure.isSingleValued() ) {
scenario = expectations.simple();
}
else {
Expand All @@ -306,7 +300,7 @@ private AggregationScenario<?> getSimpleScenario() {
}

private String getFieldPath(IndexBinding indexBinding) {
switch ( fieldStructure ) {
switch ( fieldStructure.location ) {
case ROOT:
return getRelativeFieldName( indexBinding );
case IN_FLATTENED:
Expand All @@ -323,7 +317,7 @@ private String getFieldPath(IndexBinding indexBinding) {
return indexBinding.nestedObjectRequiringFilter.relativeFieldName
+ "." + getRelativeFieldName( indexBinding.nestedObjectRequiringFilter );
default:
throw new IllegalStateException( "Unexpected value: " + fieldStructure );
throw new IllegalStateException( "Unexpected value: " + fieldStructure.location );
}
}

Expand All @@ -332,36 +326,32 @@ private String getRelativeFieldName(AbstractObjectBinding binding) {
}

private SimpleFieldModelsByType getFieldModelsByType(AbstractObjectBinding binding) {
switch ( valueCardinality ) {
case SINGLE_VALUED:
return binding.fieldWithSingleValueModels;
case MULTI_VALUED:
return binding.fieldWithMultipleValuesModels;
default:
throw new IllegalStateException( "Unexpected field value cardinality: " + valueCardinality );
if ( fieldStructure.isSingleValued() ) {
return binding.fieldWithSingleValueModels;
}
else {
return binding.fieldWithMultipleValuesModels;
}
}

private static class DataSet<F> {
final SupportedSingleFieldAggregationExpectations<F> expectations;
final FieldTypeDescriptor<F> fieldType;
final String name;
private final IndexFieldStructure fieldStructure;
private final IndexFieldValueCardinality valueCardinality;
private final TestedFieldStructure fieldStructure;

private DataSet(SupportedSingleFieldAggregationExpectations<F> expectations,
IndexFieldStructure fieldStructure, IndexFieldValueCardinality valueCardinality) {
TestedFieldStructure fieldStructure) {
this.expectations = expectations;
this.fieldType = expectations.fieldType();
this.name = expectations.aggregationName() + "_" + expectations.fieldType().getUniqueName()
+ "_" + fieldStructure.name() + "_" + valueCardinality.name();
+ "_" + fieldStructure.getUniqueName();
this.fieldStructure = fieldStructure;
this.valueCardinality = valueCardinality;
}

private void init(Consumer<CompletableFuture<?>> futureCollector) {
IndexIndexer indexer = mainIndex.createIndexer();
if ( IndexFieldValueCardinality.SINGLE_VALUED.equals( valueCardinality ) ) {
if ( fieldStructure.isSingleValued() ) {
List<F> values = expectations.getMainIndexDocumentFieldValues();
for ( int i = 0; i < values.size(); i++ ) {
F valueForDocument = values.get( i );
Expand Down Expand Up @@ -394,7 +384,7 @@ private void init(Consumer<CompletableFuture<?>> futureCollector) {
indexer = nullOnlyIndex.createIndexer();
futureCollector.accept(
indexer.add( referenceProvider( name + "_nullOnlyIndex_document_0", name ), document -> {
if ( IndexFieldValueCardinality.SINGLE_VALUED.equals( valueCardinality ) ) {
if ( fieldStructure.isSingleValued() ) {
initSingleValued( nullOnlyIndex.binding(), document, null, null );
}
else {
Expand All @@ -405,7 +395,7 @@ private void init(Consumer<CompletableFuture<?>> futureCollector) {
}

private void initSingleValued(IndexBinding binding, DocumentElement document, F value, F garbageValue) {
switch ( fieldStructure ) {
switch ( fieldStructure.location ) {
case ROOT:
document.addValue( binding.fieldWithSingleValueModels.get( fieldType ).reference, value );
break;
Expand Down Expand Up @@ -451,7 +441,7 @@ private void initSingleValued(IndexBinding binding, DocumentElement document, F
}

private void initMultiValued(IndexBinding binding, DocumentElement document, List<F> values, List<F> garbageValues) {
switch ( fieldStructure ) {
switch ( fieldStructure.location ) {
case ROOT:
for ( F value : values ) {
document.addValue( binding.fieldWithMultipleValuesModels.get( fieldType ).reference, value );
Expand Down
Expand Up @@ -31,8 +31,7 @@
import org.hibernate.search.engine.search.sort.dsl.SortOrder;
import org.hibernate.search.engine.spatial.GeoPoint;
import org.hibernate.search.integrationtest.backend.tck.testsupport.types.values.AscendingUniqueTermValues;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.IndexFieldStructure;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.IndexFieldValueCardinality;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TestedFieldStructure;
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.rule.SearchSetupHelper;
import org.hibernate.search.util.common.SearchException;
import org.hibernate.search.util.impl.integrationtest.mapper.stub.StubMappingIndexManager;
Expand All @@ -53,15 +52,13 @@
@RunWith(Parameterized.class)
public class DistanceSearchSortBaseIT {

@Parameterized.Parameters(name = "{0} - {1} - {2}")
@Parameterized.Parameters(name = "{0} - {1}")
public static Object[][] parameters() {
List<Object[]> parameters = new ArrayList<>();
for ( IndexFieldStructure indexFieldStructure : IndexFieldStructure.values() ) {
for ( IndexFieldValueCardinality indexFieldValueCardinality : IndexFieldValueCardinality.values() ) {
parameters.add( new Object[] { indexFieldStructure, indexFieldValueCardinality, null } );
for ( SortMode sortMode : SortMode.values() ) {
parameters.add( new Object[] { indexFieldStructure, indexFieldValueCardinality, sortMode } );
}
for ( TestedFieldStructure fieldStructure : TestedFieldStructure.all() ) {
parameters.add( new Object[] { fieldStructure, null } );
for ( SortMode sortMode : SortMode.values() ) {
parameters.add( new Object[] { fieldStructure, sortMode } );
}
}
return parameters.toArray( new Object[0][] );
Expand Down Expand Up @@ -104,14 +101,11 @@ public static void setup() {
initData();
}

private final IndexFieldStructure indexFieldStructure;
private final IndexFieldValueCardinality indexFieldValueCardinality;
private final TestedFieldStructure fieldStructure;
private final SortMode sortMode;

public DistanceSearchSortBaseIT(IndexFieldStructure indexFieldStructure,
IndexFieldValueCardinality indexFieldValueCardinality, SortMode sortMode) {
this.indexFieldStructure = indexFieldStructure;
this.indexFieldValueCardinality = indexFieldValueCardinality;
public DistanceSearchSortBaseIT(TestedFieldStructure fieldStructure, SortMode sortMode) {
this.fieldStructure = fieldStructure;
this.sortMode = sortMode;
}

Expand Down Expand Up @@ -200,10 +194,7 @@ private void assumeTestParametersWork() {
}

private boolean isMedianWithNestedField() {
return SortMode.MEDIAN.equals( sortMode )
&& EnumSet.of( IndexFieldStructure.IN_NESTED, IndexFieldStructure.IN_NESTED_TWICE,
IndexFieldStructure.IN_NESTED_REQUIRING_FILTER )
.contains( indexFieldStructure );
return SortMode.MEDIAN.equals( sortMode ) && fieldStructure.isNested();
}

private boolean isSum() {
Expand All @@ -229,7 +220,7 @@ private SearchQuery<DocumentReference> simpleQuery(
}

private DistanceSortOptionsStep<?, ?> applyFilter(DistanceSortOptionsStep<?, ?> optionsStep) {
if ( IndexFieldStructure.IN_NESTED_REQUIRING_FILTER.equals( indexFieldStructure ) ) {
if ( fieldStructure.isNestedFilterRequired() ) {
return optionsStep.filter( f -> f.match()
.field( "nestedObjectRequiringFilter.discriminator" )
.matching( "included" ) );
Expand All @@ -240,7 +231,7 @@ private SearchQuery<DocumentReference> simpleQuery(
}

private String getFieldPath(SortOrder expectedOrder) {
switch ( indexFieldStructure ) {
switch ( fieldStructure.location ) {
case ROOT:
return getRelativeFieldName( expectedOrder );
case IN_FLATTENED:
Expand All @@ -252,45 +243,42 @@ private String getFieldPath(SortOrder expectedOrder) {
case IN_NESTED_REQUIRING_FILTER:
return "nestedObjectRequiringFilter." + getRelativeFieldName( expectedOrder );
default:
throw new IllegalStateException( "Unexpected value: " + indexFieldStructure );
throw new IllegalStateException( "Unexpected value: " + fieldStructure.location );
}
}

private String getRelativeFieldName(SortOrder expectedOrder) {
switch ( indexFieldValueCardinality ) {
case SINGLE_VALUED:
// Sort on a single-valued field.
return "geoPoint";
case MULTI_VALUED:
if ( sortMode == null ) {
// Default sort mode: min in ascending order, max in descending order
switch ( expectedOrder ) {
case ASC:
return "geoPoint_ascendingMin";
case DESC:
return "geoPoint_ascendingMax";
default:
throw new IllegalStateException( "Unexpected sort order: " + expectedOrder );
}
if ( fieldStructure.isSingleValued() ) {
return "geoPoint";
}
else {
if ( sortMode == null ) {
// Default sort mode: min in ascending order, max in descending order
switch ( expectedOrder ) {
case ASC:
return "geoPoint_ascendingMin";
case DESC:
return "geoPoint_ascendingMax";
default:
throw new IllegalStateException( "Unexpected sort order: " + expectedOrder );
}
else {
switch ( sortMode ) {
case SUM:
return "geoPoint_ascendingSum";
case MIN:
return "geoPoint_ascendingMin";
case MAX:
return "geoPoint_ascendingMax";
case AVG:
return "geoPoint_ascendingAvg";
case MEDIAN:
return "geoPoint_ascendingMedian";
default:
throw new IllegalStateException( "Unexpected sort mode: " + sortMode );
}
}
else {
switch ( sortMode ) {
case SUM:
return "geoPoint_ascendingSum";
case MIN:
return "geoPoint_ascendingMin";
case MAX:
return "geoPoint_ascendingMax";
case AVG:
return "geoPoint_ascendingAvg";
case MEDIAN:
return "geoPoint_ascendingMedian";
default:
throw new IllegalStateException( "Unexpected sort mode: " + sortMode );
}
default:
throw new IllegalStateException( "Unexpected field value cardinality: " + indexFieldValueCardinality );
}
}
}

Expand Down Expand Up @@ -514,7 +502,7 @@ private SecondLevelObjectMapping(IndexSchemaObjectField objectField) {
}

private static class AscendingUniqueDistanceFromCenterValues extends AscendingUniqueTermValues<GeoPoint> {
private static AscendingUniqueDistanceFromCenterValues INSTANCE = new AscendingUniqueDistanceFromCenterValues();
private static final AscendingUniqueDistanceFromCenterValues INSTANCE = new AscendingUniqueDistanceFromCenterValues();

@Override
protected List<GeoPoint> createSingle() {
Expand Down

0 comments on commit 8125757

Please sign in to comment.