@Test public void testUninvertingReaderIsUsedIfNotAllSortsAreCovered() throws Exception { ExtendedSearchIntegrator integrator = factoryHolder.getSearchFactory(); EntityIndexBinding binding = integrator.getIndexBinding( PERSON_TYPE ); Set<IndexManager> indexManagers = binding.getIndexManagerSelector().forFilters( new FullTextFilterImpl[0] ); Sort sort = new Sort( new SortField( "ageForIntSorting", Type.INT ), new SortField( "ageForStringSorting", Type.STRING ) ); SortConfigurations configuredSorts = new SortConfigurations.Builder() .setIndex( "person" ) .setEntityType( PERSON_TYPE ) .addSortableFields( Arrays.asList( new SortableFieldMetadata.Builder( "ageForStringSorting" ).build() ) ) .build(); IndexManager[] indexManagersArray = indexManagers.toArray( new IndexManager[indexManagers.size()] ); try ( ManagedMultiReader reader = (ManagedMultiReader) MultiReaderFactory.openReader( configuredSorts, sort, indexManagersArray, true ) ) { List<? extends IndexReader> actualReaders = reader.getSubReaders(); assertThat( actualReaders ).hasSize( 1 ); assertThat( actualReaders.get( 0 ).getClass().getSimpleName() ).isEqualTo( "UninvertingDirectoryReader" ); } }
@Test public void testStandardReaderIsUsedIfAllSortsAreCovered() throws Exception { ExtendedSearchIntegrator integrator = factoryHolder.getSearchFactory(); EntityIndexBinding binding = integrator.getIndexBinding( PERSON_TYPE ); Set<IndexManager> indexManagers = binding.getIndexManagerSelector().forFilters( new FullTextFilterImpl[0] ); Sort sort = new Sort( new SortField( "ageForIntSorting", Type.INT ), new SortField( "ageForStringSorting", Type.STRING ) ); SortConfigurations configuredSorts = new SortConfigurations.Builder() .setIndex( "test" ) .setEntityType( PERSON_TYPE ) .addSortableFields( Arrays.asList( new SortableFieldMetadata.Builder( "ageForIntSorting" ).build(), new SortableFieldMetadata.Builder( "ageForStringSorting" ).build() ) ) .build(); IndexManager[] indexManagersArray = indexManagers.toArray( new IndexManager[indexManagers.size()] ); try ( ManagedMultiReader reader = (ManagedMultiReader) MultiReaderFactory.openReader( configuredSorts, sort, indexManagersArray, false ) ) { List<? extends IndexReader> actualReaders = reader.getSubReaders(); assertThat( actualReaders ).hasSize( 1 ); assertThat( actualReaders.get( 0 ).getClass().getSimpleName() ).isEqualTo( "StandardDirectoryReader" ); } }
/** * Collects all sort fields declared on the properties of the given type or the properties of all the types it * embeds into the given list. */ private void collectSortableFields(SortConfigurations.Builder sortConfigurations, Iterable<IndexManager> indexManagers, TypeMetadata typeMetadata, Optional<CustomTypeMetadata> customTypeMetadataOptional) { for ( IndexManager indexManager : indexManagers ) { sortConfigurations.setIndex( indexManager.getIndexName() ); sortConfigurations.setEntityType( typeMetadata.getType() ); sortConfigurations.addSortableFields( typeMetadata.getClassBridgeSortableFieldMetadata() ); sortConfigurations.addSortableFields( typeMetadata.getIdPropertyMetadata().getSortableFieldMetadata() ); for ( PropertyMetadata property : typeMetadata.getAllPropertyMetadata() ) { sortConfigurations.addSortableFields( property.getSortableFieldMetadata() ); } for ( EmbeddedTypeMetadata embeddedType : typeMetadata.getEmbeddedTypeMetadata() ) { collectSortableFields( sortConfigurations, embeddedType ); } if ( customTypeMetadataOptional.isPresent() ) { CustomTypeMetadata customTypeMetadata = customTypeMetadataOptional.get(); for ( String fieldName : customTypeMetadata.getSortableFields() ) { sortConfigurations.addSortableField( new SortableFieldMetadata.Builder( fieldName ).build() ); } } } }
/** * Collects all sort fields declared on the properties of the given type or the properties of all the types it * embeds into the given list. */ private void collectSortableFields(SortConfigurations.Builder sortConfigurations, Iterable<IndexManager> indexManagers, TypeMetadata typeMetadata, Optional<CustomTypeMetadata> customTypeMetadataOptional) { for ( IndexManager indexManager : indexManagers ) { sortConfigurations.setIndex( indexManager.getIndexName() ); sortConfigurations.setEntityType( typeMetadata.getType() ); sortConfigurations.addSortableFields( typeMetadata.getClassBridgeSortableFieldMetadata() ); sortConfigurations.addSortableFields( typeMetadata.getIdPropertyMetadata().getSortableFieldMetadata() ); for ( PropertyMetadata property : typeMetadata.getAllPropertyMetadata() ) { sortConfigurations.addSortableFields( property.getSortableFieldMetadata() ); } for ( EmbeddedTypeMetadata embeddedType : typeMetadata.getEmbeddedTypeMetadata() ) { collectSortableFields( sortConfigurations, embeddedType ); } if ( customTypeMetadataOptional.isPresent() ) { CustomTypeMetadata customTypeMetadata = customTypeMetadataOptional.get(); for ( String fieldName : customTypeMetadata.getSortableFields() ) { sortConfigurations.addSortableField( new SortableFieldMetadata.Builder( fieldName ).build() ); } } } }