Skip to content

Commit

Permalink
HSEARCH-4142 Support projection id from stub backend
Browse files Browse the repository at this point in the history
  • Loading branch information
fax4ever committed Mar 1, 2021
1 parent e58f44a commit 347331e
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 5 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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<StubIndexSchemaNode> getSchemaNodes(StubIndexSchemaNode root, String[] pathComponents) {
List<StubIndexSchemaNode> parents;
List<StubIndexSchemaNode> children = CollectionHelper.asList( root );
Expand Down
Expand Up @@ -23,7 +23,7 @@ class StubFieldSearchProjection<T> implements StubSearchProjection<T> {
public Object extract(ProjectionHitMapper<?, ?> projectionHitMapper, Object projectionFromIndex,
StubSearchProjectionContext context) {
return converter.convertIndexToProjection(
projectionFromIndex, context.getFromDocumentFieldValueConvertContext()
projectionFromIndex, context.fromDocumentFieldValueConvertContext()
);
}

Expand Down
@@ -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 <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
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<I> implements StubSearchProjection<I> {

private final DocumentIdentifierValueConverter<? extends I> identifierValueConverter;

private StubIdSearchProjection(DocumentIdentifierValueConverter<? extends I> 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<I> implements IdProjectionBuilder<I> {

private final StubSearchProjection<I> projection;

public Builder(DocumentIdentifierValueConverter<?> identifierValueConverter, Class<I> identifierType) {
// check expected identifier type:
identifierValueConverter.requiresType( identifierType );
@SuppressWarnings("uncheked") // just checked
DocumentIdentifierValueConverter<? extends I> casted = (DocumentIdentifierValueConverter<? extends I>) identifierValueConverter;

projection = new StubIdSearchProjection( casted );
}

@Override
public SearchProjection<I> build() {
return projection;
}
}
}
Expand Up @@ -85,8 +85,7 @@ public <R> EntityReferenceProjectionBuilder<R> entityReference() {

@Override
public <I> IdProjectionBuilder<I> id(Class<I> identifierType) {
// TODO HSEARCH-4142 Support from this backend
return null;
return new StubIdSearchProjection.Builder<>( scopeModel.idDslConverter(), identifierType );
}

@Override
Expand Down
Expand Up @@ -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;
}
Expand Down

0 comments on commit 347331e

Please sign in to comment.