diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/impl/StubScopeModel.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/impl/StubScopeModel.java index 4f34e64de08..f2ad0b409cc 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/impl/StubScopeModel.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/impl/StubScopeModel.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Set; +import org.hibernate.search.engine.backend.types.converter.spi.DocumentIdentifierValueConverter; import org.hibernate.search.util.common.impl.CollectionHelper; import org.hibernate.search.util.impl.integrationtest.common.stub.backend.document.model.StubIndexSchemaNode; import org.hibernate.search.util.impl.integrationtest.common.stub.backend.types.converter.impl.StubFieldConverter; @@ -55,6 +56,18 @@ else if ( !result.isConvertIndexToProjectionCompatibleWith( converter ) ) { return result; } + public DocumentIdentifierValueConverter idDslConverter() { + for ( StubIndexSchemaNode index : rootSchemaNodes ) { + DocumentIdentifierValueConverter converter = index.getIdDslConverter(); + + // there is no need to check the compatibility - this is a stub backend + if ( converter != null ) { + return converter; + } + } + return null; + } + private static List getSchemaNodes(StubIndexSchemaNode root, String[] pathComponents) { List parents; List children = CollectionHelper.asList( root ); diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubFieldSearchProjection.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubFieldSearchProjection.java index cea1792b41c..1b1c08d13bd 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubFieldSearchProjection.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubFieldSearchProjection.java @@ -23,7 +23,7 @@ class StubFieldSearchProjection implements StubSearchProjection { public Object extract(ProjectionHitMapper projectionHitMapper, Object projectionFromIndex, StubSearchProjectionContext context) { return converter.convertIndexToProjection( - projectionFromIndex, context.getFromDocumentFieldValueConvertContext() + projectionFromIndex, context.fromDocumentFieldValueConvertContext() ); } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubIdSearchProjection.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubIdSearchProjection.java new file mode 100644 index 00000000000..320c1790fb4 --- /dev/null +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubIdSearchProjection.java @@ -0,0 +1,59 @@ +/* + * 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.util.impl.integrationtest.common.stub.backend.search.projection.impl; + +import org.hibernate.search.engine.backend.common.DocumentReference; +import org.hibernate.search.engine.backend.types.converter.spi.DocumentIdentifierValueConverter; +import org.hibernate.search.engine.search.loading.spi.LoadingResult; +import org.hibernate.search.engine.search.loading.spi.ProjectionHitMapper; +import org.hibernate.search.engine.search.projection.SearchProjection; +import org.hibernate.search.engine.search.projection.spi.IdProjectionBuilder; + +public class StubIdSearchProjection implements StubSearchProjection { + + private final DocumentIdentifierValueConverter identifierValueConverter; + + private StubIdSearchProjection(DocumentIdentifierValueConverter identifierValueConverter) { + this.identifierValueConverter = identifierValueConverter; + } + + @Override + public Object extract(ProjectionHitMapper projectionHitMapper, Object projectionFromIndex, + StubSearchProjectionContext context) { + return projectionFromIndex; + } + + @SuppressWarnings("unchecked") + @Override + public I transform(LoadingResult loadingResult, Object extractedData, + StubSearchProjectionContext context) { + DocumentReference documentReference = (DocumentReference) extractedData; + + context.fromDocumentFieldValueConvertContext(); + return identifierValueConverter.convertToSource( + documentReference.id(), context.fromDocumentIdentifierValueConvertContext() ); + } + + public static class Builder implements IdProjectionBuilder { + + private final StubSearchProjection projection; + + public Builder(DocumentIdentifierValueConverter identifierValueConverter, Class identifierType) { + // check expected identifier type: + identifierValueConverter.requiresType( identifierType ); + @SuppressWarnings("uncheked") // just checked + DocumentIdentifierValueConverter casted = (DocumentIdentifierValueConverter) identifierValueConverter; + + projection = new StubIdSearchProjection( casted ); + } + + @Override + public SearchProjection build() { + return projection; + } + } +} diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionBuilderFactory.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionBuilderFactory.java index c874b72c314..34d3b262afc 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionBuilderFactory.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionBuilderFactory.java @@ -85,8 +85,7 @@ public EntityReferenceProjectionBuilder entityReference() { @Override public IdProjectionBuilder id(Class identifierType) { - // TODO HSEARCH-4142 Support from this backend - return null; + return new StubIdSearchProjection.Builder<>( scopeModel.idDslConverter(), identifierType ); } @Override diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionContext.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionContext.java index 9601f0e9f5b..469c3f1a0b3 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionContext.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/impl/StubSearchProjectionContext.java @@ -9,21 +9,28 @@ import org.hibernate.search.engine.backend.types.converter.runtime.FromDocumentFieldValueConvertContext; import org.hibernate.search.engine.backend.types.converter.runtime.spi.FromDocumentFieldValueConvertContextImpl; import org.hibernate.search.engine.backend.session.spi.BackendSessionContext; +import org.hibernate.search.engine.backend.types.converter.runtime.spi.FromDocumentIdentifierValueConvertContextImpl; public class StubSearchProjectionContext { private final FromDocumentFieldValueConvertContext fromDocumentFieldValueConvertContext; + private final FromDocumentIdentifierValueConvertContextImpl fromDocumentIdentifierValueConvertContext; private boolean hasFailedLoad = false; public StubSearchProjectionContext(BackendSessionContext sessionContext) { - this.fromDocumentFieldValueConvertContext = new FromDocumentFieldValueConvertContextImpl( sessionContext ); + fromDocumentFieldValueConvertContext = new FromDocumentFieldValueConvertContextImpl( sessionContext ); + fromDocumentIdentifierValueConvertContext = new FromDocumentIdentifierValueConvertContextImpl( sessionContext ); } - FromDocumentFieldValueConvertContext getFromDocumentFieldValueConvertContext() { + FromDocumentFieldValueConvertContext fromDocumentFieldValueConvertContext() { return fromDocumentFieldValueConvertContext; } + FromDocumentIdentifierValueConvertContextImpl fromDocumentIdentifierValueConvertContext() { + return fromDocumentIdentifierValueConvertContext; + } + void reportFailedLoad() { hasFailedLoad = true; }