From 6010c4ca206ab7f98b295731c979973ee0395c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 3 Feb 2021 09:45:51 +0100 Subject: [PATCH] HSEARCH-4153 Stop using DefaultProjectionHitMapper/EntityLoader in the backend TCK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don't use it in the POJO mapper, so it makes sense that we don't test it in the backend TCK. Signed-off-by: Yoann Rodière --- .../search/projection/SearchProjectionIT.java | 14 +-- ...rchQueryResultLoadingOrTransformingIT.java | 116 ++++++++---------- .../SearchQueryScrollResultLoadingIT.java | 22 ++-- .../tck/testsupport/stub/MapperMockUtils.java | 73 ++++++----- .../testsupport/stub/StubEntityLoader.java | 16 --- 5 files changed, 109 insertions(+), 132 deletions(-) delete mode 100644 integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/StubEntityLoader.java diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java index 9c2bb46578d..ac080905953 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java @@ -30,7 +30,6 @@ import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFactory; import org.hibernate.search.engine.backend.types.dsl.StandardIndexFieldTypeOptionsStep; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext; -import org.hibernate.search.engine.search.loading.spi.EntityLoader; import org.hibernate.search.engine.search.projection.SearchProjection; import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory; @@ -40,7 +39,6 @@ import org.hibernate.search.engine.search.query.SearchResult; import org.hibernate.search.integrationtest.backend.tck.testsupport.configuration.DefaultAnalysisDefinitions; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubDocumentReferenceConverter; -import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubEntityLoader; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubLoadedObject; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubTransformedReference; import org.hibernate.search.integrationtest.backend.tck.testsupport.util.StandardFieldMapper; @@ -163,8 +161,6 @@ public void references_transformed() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = mainIndex.createGenericScope(); @@ -189,20 +185,20 @@ public void references_transformed() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, /* * Expect each reference to be transformed because of the reference projection, * but also loaded because of the entity projection. */ c -> c .entityReference( document1Reference, document1TransformedReference ) - .load( document1Reference, document1TransformedReference, document1LoadedObject ) + .load( document1Reference, document1LoadedObject ) .entityReference( document2Reference, document2TransformedReference ) - .load( document2Reference, document2TransformedReference, document2LoadedObject ) + .load( document2Reference, document2LoadedObject ) .entityReference( document3Reference, document3TransformedReference ) - .load( document3Reference, document3TransformedReference, document3LoadedObject ) + .load( document3Reference, document3LoadedObject ) .entityReference( emptyReference, emptyTransformedReference ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatQuery( query ).hasListHitsAnyOrder( b -> { b.list( document1Reference, document1TransformedReference, document1LoadedObject ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryResultLoadingOrTransformingIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryResultLoadingOrTransformingIT.java index b18345c6a0e..3458130dde5 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryResultLoadingOrTransformingIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryResultLoadingOrTransformingIT.java @@ -31,14 +31,11 @@ import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.engine.backend.common.DocumentReference; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext; -import org.hibernate.search.engine.search.loading.spi.DefaultProjectionHitMapper; -import org.hibernate.search.engine.search.loading.spi.EntityLoader; import org.hibernate.search.engine.backend.common.spi.DocumentReferenceConverter; import org.hibernate.search.engine.search.query.SearchQuery; import org.hibernate.search.engine.search.query.SearchScroll; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubDocumentReferenceConverter; -import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubEntityLoader; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubHitTransformer; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubLoadedObject; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubTransformedHit; @@ -94,8 +91,6 @@ public void setup() { public void defaultResultType() { DocumentReference mainReference = reference( index.typeName(), MAIN_ID ); DocumentReference emptyReference = reference( index.typeName(), EMPTY_ID ); - StubTransformedReference mainTransformedReference = new StubTransformedReference( mainReference ); - StubTransformedReference emptyTransformedReference = new StubTransformedReference( emptyReference ); StubLoadedObject mainLoadedObject = new StubLoadedObject( mainReference ); StubLoadedObject emptyLoadedObject = new StubLoadedObject( emptyReference ); @@ -103,8 +98,6 @@ public void defaultResultType() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -118,19 +111,19 @@ public void defaultResultType() { * so that the mapper can run state checks (session is still open, ...). */ expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatQuery( objectsQuery ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatHits( hitsUsingScroll( objectsQuery ) ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); } @@ -139,8 +132,6 @@ public void defaultResultType() { public void defaultResultType_entityLoadingTimeout() { DocumentReference mainReference = reference( index.typeName(), MAIN_ID ); DocumentReference emptyReference = reference( index.typeName(), EMPTY_ID ); - StubTransformedReference mainTransformedReference = new StubTransformedReference( mainReference ); - StubTransformedReference emptyTransformedReference = new StubTransformedReference( emptyReference ); StubLoadedObject mainLoadedObject = new StubLoadedObject( mainReference ); StubLoadedObject emptyLoadedObject = new StubLoadedObject( emptyReference ); @@ -148,8 +139,6 @@ public void defaultResultType_entityLoadingTimeout() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -159,10 +148,10 @@ public void defaultResultType_entityLoadingTimeout() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatQuery( objectsQuery ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); // Check in particular that the backend gets the projection hit mapper from the loading context, @@ -172,10 +161,10 @@ public void defaultResultType_entityLoadingTimeout() { // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatHits( hitsUsingScroll( objectsQuery ) ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); verify( loadingContextMock ).createProjectionHitMapper(); @@ -224,8 +213,6 @@ public void selectEntityReference_referenceTransformer() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -235,7 +222,7 @@ public void selectEntityReference_referenceTransformer() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c .entityReference( mainReference, mainTransformedReference ) .entityReference( emptyReference, emptyTransformedReference ) @@ -248,7 +235,7 @@ public void selectEntityReference_referenceTransformer() { // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c .entityReference( mainReference, mainTransformedReference ) .entityReference( emptyReference, emptyTransformedReference ) @@ -261,8 +248,6 @@ public void selectEntityReference_referenceTransformer() { public void selectEntity_referencesTransformer_entityLoading() { DocumentReference mainReference = reference( index.typeName(), MAIN_ID ); DocumentReference emptyReference = reference( index.typeName(), EMPTY_ID ); - StubTransformedReference mainTransformedReference = new StubTransformedReference( mainReference ); - StubTransformedReference emptyTransformedReference = new StubTransformedReference( emptyReference ); StubLoadedObject mainLoadedObject = new StubLoadedObject( mainReference ); StubLoadedObject emptyLoadedObject = new StubLoadedObject( emptyReference ); @@ -270,8 +255,6 @@ public void selectEntity_referencesTransformer_entityLoading() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -281,10 +264,10 @@ public void selectEntity_referencesTransformer_entityLoading() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatQuery( objectsQuery ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); // Check in particular that the backend gets the projection hit mapper from the loading context, @@ -294,10 +277,10 @@ public void selectEntity_referencesTransformer_entityLoading() { // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c - .load( mainReference, mainTransformedReference, mainLoadedObject ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( mainReference, mainLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatHits( hitsUsingScroll( objectsQuery ) ).hasHitsAnyOrder( mainLoadedObject, emptyLoadedObject ); verify( loadingContextMock ).createProjectionHitMapper(); @@ -316,8 +299,6 @@ public void select_referencesTransformer_entityLoading() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -334,16 +315,16 @@ public void select_referencesTransformer_entityLoading() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, /* * Expect each reference to be transformed because of the entity reference projection, * but also loaded because of the entity projection. */ c -> c .entityReference( mainReference, mainTransformedReference ) - .load( mainReference, mainTransformedReference, mainLoadedObject ) + .load( mainReference, mainLoadedObject ) .entityReference( emptyReference, emptyTransformedReference ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatQuery( projectionsQuery ).hasListHitsAnyOrder( b -> { b.list( STRING_VALUE, mainReference, mainTransformedReference, mainLoadedObject ); @@ -356,16 +337,16 @@ public void select_referencesTransformer_entityLoading() { // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, /* * Expect each reference to be transformed because of the entity reference projection, * but also loaded because of the entity projection. */ c -> c .entityReference( mainReference, mainTransformedReference ) - .load( mainReference, mainTransformedReference, mainLoadedObject ) + .load( mainReference, mainLoadedObject ) .entityReference( emptyReference, emptyTransformedReference ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); assertThatHits( hitsUsingScroll( projectionsQuery ) ).hasListHitsAnyOrder( b -> { b.list( STRING_VALUE, mainReference, mainTransformedReference, mainLoadedObject ); @@ -442,8 +423,6 @@ public void select_hitTransformer_referencesTransformer_entityLoading() { mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); Function, StubTransformedHit> hitTransformerMock = mock( StubHitTransformer.class ); GenericStubMappingScope scope = @@ -462,16 +441,16 @@ public void select_hitTransformer_referencesTransformer_entityLoading() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, /* * Expect each reference to be transformed because of the entity reference projection, * but also loaded because of the entity projection. */ c -> c .entityReference( mainReference, mainTransformedReference ) - .load( mainReference, mainTransformedReference, mainLoadedObject ) + .load( mainReference, mainLoadedObject ) .entityReference( emptyReference, emptyTransformedReference ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); when( hitTransformerMock.apply( projectionMatcher( STRING_VALUE, mainReference, mainTransformedReference, mainLoadedObject @@ -489,16 +468,16 @@ public void select_hitTransformer_referencesTransformer_entityLoading() { // check the same for the scroll API expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, /* * Expect each reference to be transformed because of the entity reference projection, * but also loaded because of the entity projection. */ c -> c .entityReference( mainReference, mainTransformedReference ) - .load( mainReference, mainTransformedReference, mainLoadedObject ) + .load( mainReference, mainLoadedObject ) .entityReference( emptyReference, emptyTransformedReference ) - .load( emptyReference, emptyTransformedReference, emptyLoadedObject ) + .load( emptyReference, emptyLoadedObject ) ); when( hitTransformerMock.apply( projectionMatcher( STRING_VALUE, mainReference, mainTransformedReference, mainLoadedObject @@ -563,8 +542,13 @@ public void countQueryWithProjection() { @Test public void callGetProjectionHitMapperEveryTime() { + DocumentReference mainReference = reference( index.typeName(), MAIN_ID ); + DocumentReference emptyReference = reference( index.typeName(), EMPTY_ID ); + SearchLoadingContext loadingContextMock = mock( SearchLoadingContext.class ); + DocumentReferenceConverter documentReferenceConverterMock = + mock( DocumentReferenceConverter.class ); GenericStubMappingScope scope = index.createGenericScope(); SearchQuery query = scope.query( loadingContextMock ) @@ -572,8 +556,12 @@ public void callGetProjectionHitMapperEveryTime() { .where( f -> f.matchAll() ) .toQuery(); - when( loadingContextMock.createProjectionHitMapper() ) - .thenReturn( new DefaultProjectionHitMapper<>( reference -> reference, EntityLoader.identity() ) ); + expectHitMapping( + loadingContextMock, documentReferenceConverterMock, + c -> c + .load( mainReference, mainReference ) + .load( emptyReference, emptyReference ) + ); query.fetchAll(); // Check in particular that the backend gets the projection hit mapper from the loading context, // which must happen every time we execute the query, @@ -582,8 +570,12 @@ public void callGetProjectionHitMapperEveryTime() { // Second query execution to make sure the backend doesn't try to cache the projection hit mapper... reset( loadingContextMock ); - when( loadingContextMock.createProjectionHitMapper() ) - .thenReturn( new DefaultProjectionHitMapper<>( reference -> reference, EntityLoader.identity() ) ); + expectHitMapping( + loadingContextMock, documentReferenceConverterMock, + c -> c + .load( mainReference, mainReference ) + .load( emptyReference, emptyReference ) + ); query.fetchAll(); verify( loadingContextMock ).createProjectionHitMapper(); } @@ -593,16 +585,12 @@ public void callGetProjectionHitMapperEveryTime() { public void failedEntityLoading_skipHit() { DocumentReference mainDocumentReference = reference( index.typeName(), MAIN_ID ); DocumentReference emptyDocumentReference = reference( index.typeName(), EMPTY_ID ); - StubTransformedReference mainEntityReference = new StubTransformedReference( mainDocumentReference ); - StubTransformedReference emptyEntityReference = new StubTransformedReference( emptyDocumentReference ); StubLoadedObject emptyLoadedObject = new StubLoadedObject( emptyDocumentReference ); SearchLoadingContext loadingContextMock = mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = - mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); @@ -611,11 +599,11 @@ public void failedEntityLoading_skipHit() { .toQuery(); expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> c // Return "null" when loading, meaning the entity failed to load - .load( mainDocumentReference, mainEntityReference, null ) - .load( emptyDocumentReference, emptyEntityReference, emptyLoadedObject ) + .load( mainDocumentReference, null ) + .load( emptyDocumentReference, emptyLoadedObject ) ); // Expect the main document to be excluded from hits, since it could not be loaded. assertThatQuery( objectsQuery ).hasHitsAnyOrder( emptyLoadedObject ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java index cbc9b54168f..92c87123d18 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java @@ -21,12 +21,10 @@ import org.hibernate.search.engine.backend.document.model.dsl.IndexSchemaElement; import org.hibernate.search.engine.backend.types.Sortable; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext; -import org.hibernate.search.engine.search.loading.spi.EntityLoader; import org.hibernate.search.engine.search.query.SearchQuery; import org.hibernate.search.engine.search.query.SearchScroll; import org.hibernate.search.engine.search.query.SearchScrollResult; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubDocumentReferenceConverter; -import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubEntityLoader; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubLoadedObject; import org.hibernate.search.integrationtest.backend.tck.testsupport.stub.StubTransformedReference; import org.hibernate.search.integrationtest.backend.tck.testsupport.util.rule.SearchSetupHelper; @@ -72,7 +70,6 @@ public static void setup() { public void resultLoadingOnScrolling() { SearchLoadingContext loadingContextMock = mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); SearchQuery objectsQuery = scope.query( loadingContextMock ) @@ -81,14 +78,13 @@ public void resultLoadingOnScrolling() { .toQuery(); SearchScroll scroll = objectsQuery.scroll( 5 ); - verifyLoading( loadingContextMock, documentReferenceConverterMock, objectLoaderMock, scroll ); + verifyLoading( loadingContextMock, documentReferenceConverterMock, scroll ); } @Test public void resultLoadingOnScrolling_entityLoadingTimeout() { SearchLoadingContext loadingContextMock = mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); SearchQuery objectsQuery = scope.query( loadingContextMock ) @@ -98,14 +94,13 @@ public void resultLoadingOnScrolling_entityLoadingTimeout() { .toQuery(); SearchScroll scroll = objectsQuery.scroll( 5 ); - verifyLoading( loadingContextMock, documentReferenceConverterMock, objectLoaderMock, scroll ); + verifyLoading( loadingContextMock, documentReferenceConverterMock, scroll ); } @Test public void resultLoadingOnScrolling_softTimeout() { SearchLoadingContext loadingContextMock = mock( SearchLoadingContext.class ); DocumentReferenceConverter documentReferenceConverterMock = mock( StubDocumentReferenceConverter.class ); - EntityLoader objectLoaderMock = mock( StubEntityLoader.class ); GenericStubMappingScope scope = index.createGenericScope(); SearchQuery objectsQuery = scope.query( loadingContextMock ) @@ -116,22 +111,21 @@ public void resultLoadingOnScrolling_softTimeout() { SearchScroll scroll = objectsQuery.scroll( 5 ); // softTimeout is passed to the entity loading too - verifyLoading( loadingContextMock, documentReferenceConverterMock, objectLoaderMock, scroll ); + verifyLoading( loadingContextMock, documentReferenceConverterMock, scroll ); } private void verifyLoading(SearchLoadingContext loadingContextMock, DocumentReferenceConverter documentReferenceConverterMock, - EntityLoader objectLoaderMock, SearchScroll scroll) { // 7 full size pages for ( int j = 0; j < 7; j++ ) { int base = j * 5; expectHitMapping( - loadingContextMock, documentReferenceConverterMock, objectLoaderMock, + loadingContextMock, documentReferenceConverterMock, c -> { for ( int i = 0; i < 5; i++ ) { - c.load( references[base + i].reference, references[base + i].transformedReference, references[base + i].loadedObject ); + c.load( references[base + i].reference, references[base + i].loadedObject ); } } ); @@ -149,10 +143,10 @@ private void verifyLoading(SearchLoadingContext { for ( int i = 35; i <= 36; i++ ) { - c.load( references[i].reference, references[i].transformedReference, references[i].loadedObject ); + c.load( references[i].reference, references[i].loadedObject ); } } ); @@ -168,14 +162,12 @@ private static class IndexItem { final String id; final int value; final DocumentReference reference; - final StubTransformedReference transformedReference; final StubLoadedObject loadedObject; IndexItem(int i) { id = i + ""; value = i; reference = reference( index.typeName(), id ); - transformedReference = new StubTransformedReference( reference ); loadedObject = new StubLoadedObject( reference ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/MapperMockUtils.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/MapperMockUtils.java index 1989bb47a82..9b6e9eab7f4 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/MapperMockUtils.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/MapperMockUtils.java @@ -18,14 +18,14 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; -import java.util.stream.Collectors; import org.hibernate.search.engine.backend.common.DocumentReference; import org.hibernate.search.engine.backend.common.spi.DocumentReferenceConverter; +import org.hibernate.search.engine.search.loading.spi.LoadingResult; +import org.hibernate.search.engine.search.loading.spi.ProjectionHitMapper; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext; -import org.hibernate.search.engine.search.loading.spi.DefaultProjectionHitMapper; -import org.hibernate.search.engine.search.loading.spi.EntityLoader; -import org.hibernate.search.util.impl.integrationtest.common.MockUtils; + +import org.mockito.Mockito; public final class MapperMockUtils { @@ -35,7 +35,6 @@ private MapperMockUtils() { /** * @param loadingContextMock The mock for the loading context. * @param referenceTransformerMock The mock for the reference transformer. - * @param objectLoaderMock The mock for the entity loader. * @param hitMappingDefinition A definition of the reference -> entity mapping. * @param The reference type. * @param The entity type. @@ -43,43 +42,56 @@ private MapperMockUtils() { public static void expectHitMapping( SearchLoadingContext loadingContextMock, DocumentReferenceConverter referenceTransformerMock, - EntityLoader objectLoaderMock, Consumer> hitMappingDefinition) { - reset( loadingContextMock, referenceTransformerMock, objectLoaderMock ); + reset( loadingContextMock, referenceTransformerMock ); + + @SuppressWarnings("unchecked") + ProjectionHitMapper projectionHitMapperMock = Mockito.mock( ProjectionHitMapper.class ); + @SuppressWarnings("unchecked") + LoadingResult loadingResultMock = Mockito.mock( LoadingResult.class ); /* * We expect getProjectionHitMapper to be called *every time* a load is performed, - * so that the mapper can check its state (session is open in ORM, for example). + * because it may not reset its internal state, + * and also so that the mapper can check the session state (session is still open in ORM, for example). */ when( loadingContextMock.createProjectionHitMapper() ) - .thenReturn( new DefaultProjectionHitMapper<>( - referenceTransformerMock, - objectLoaderMock - ) ); + .thenReturn( projectionHitMapperMock ); + when( projectionHitMapperMock.loadBlocking( any() ) ) + .thenReturn( loadingResultMock ); HitMappingDefinitionContext context = new HitMappingDefinitionContext<>(); hitMappingDefinition.accept( context ); + List loadingKeys = new ArrayList<>(); + for ( int i = 0; i < context.referencesToLoad.size(); i++ ) { + DocumentReference documentReference = context.referencesToLoad.get( i ); + StubLoadingKey loadingKey = new StubLoadingKey( i ); + loadingKeys.add( loadingKey ); + when( projectionHitMapperMock.planLoading( referenceMatcher( documentReference ) ) ) + .thenReturn( loadingKey ); + } + + when( projectionHitMapperMock.loadBlocking( any() ) ) + .thenReturn( loadingResultMock ); + + for ( int i = 0; i < context.loadedObjects.size(); i++ ) { + when( loadingResultMock.get( loadingKeys.get( i ) ) ) + .thenReturn( context.loadedObjects.get( i ) ); + } + for ( Map.Entry> entry : context.referenceMap.entrySet() ) { for ( R transformedReference : entry.getValue() ) { - when( referenceTransformerMock.fromDocumentReference( referenceMatcher( entry.getKey() ) ) ) + when( loadingResultMock.convertReference( referenceMatcher( entry.getKey() ) ) ) .thenReturn( transformedReference ); } } - - Set keysToLoad = context.loadingMap.keySet(); - if ( !keysToLoad.isEmpty() ) { - when( objectLoaderMock.loadBlocking( - MockUtils.collectionAnyOrderMatcher( new ArrayList<>( keysToLoad ) ), any() ) ) - .thenAnswer( invocationOnMock -> invocationOnMock.>getArgument( 0 ).stream() - .map( context.loadingMap::get ) - .collect( Collectors.toList() ) ); - } } public static class HitMappingDefinitionContext { private final Map> referenceMap = new HashMap<>(); - private final Map loadingMap = new HashMap<>(); + private final List referencesToLoad = new ArrayList<>(); + private final List loadedObjects = new ArrayList<>(); public HitMappingDefinitionContext entityReference(DocumentReference documentReference, R transformedReference) { referenceMap.computeIfAbsent( documentReference, ignored -> new LinkedHashSet<>() ) @@ -87,12 +99,17 @@ public HitMappingDefinitionContext entityReference(DocumentReference docum return this; } - public HitMappingDefinitionContext load(DocumentReference documentReference, R transformedReference, E loadedObject) { - // For each load, the backend must first transform the reference - entityReference( documentReference, transformedReference ); - // Then it will need to trigger loading - loadingMap.put( transformedReference, loadedObject ); + public HitMappingDefinitionContext load(DocumentReference documentReference, E loadedObject) { + referencesToLoad.add( documentReference ); + loadedObjects.add( loadedObject ); return this; } } + + private static class StubLoadingKey { + private final int ordinal; + public StubLoadingKey(int ordinal) { + this.ordinal = ordinal; + } + } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/StubEntityLoader.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/StubEntityLoader.java deleted file mode 100644 index e76b929951d..00000000000 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/stub/StubEntityLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Hibernate Search, full-text search for your domain model - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.search.integrationtest.backend.tck.testsupport.stub; - -import org.hibernate.search.engine.search.loading.spi.EntityLoader; - -/** - * The only purpose of this class is to avoid unchecked cast warnings when creating mocks. - */ -public interface StubEntityLoader - extends EntityLoader { -}