diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/massindexing/impl/HibernateOrmMassIndexingContext.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/massindexing/impl/HibernateOrmMassIndexingContext.java index 89bf5a65242..1f87d4dfa12 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/massindexing/impl/HibernateOrmMassIndexingContext.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/massindexing/impl/HibernateOrmMassIndexingContext.java @@ -18,7 +18,6 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmEntityLoadingStrategy; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmMassEntityLoader; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmMassIdentifierLoader; @@ -41,8 +40,6 @@ public final class HibernateOrmMassIndexingContext implements PojoMassIndexingContext, HibernateOrmMassLoadingOptions { private final HibernateOrmMassIndexingMappingContext mappingContext; private final HibernateOrmSessionTypeContextProvider typeContextProvider; - private final DetachedBackendSessionContext sessionContext; - private final Map, ConditionalExpression> conditionalExpressions = new HashMap<>(); private CacheMode cacheMode = CacheMode.IGNORE; private Integer idLoadingTransactionTimeout; @@ -51,11 +48,9 @@ public final class HibernateOrmMassIndexingContext private long objectsLimit = 0; //means no limit at all public HibernateOrmMassIndexingContext(HibernateOrmMassIndexingMappingContext mappingContext, - HibernateOrmSessionTypeContextProvider typeContextContainer, - DetachedBackendSessionContext sessionContext) { + HibernateOrmSessionTypeContextProvider typeContextContainer) { this.mappingContext = mappingContext; this.typeContextProvider = typeContextContainer; - this.sessionContext = sessionContext; } @Override @@ -179,7 +174,7 @@ public PojoMassIdentifierLoader createIdentifierLoader(PojoMassIndexingIdentifie typeContexts, conditionalExpression ); SharedSessionContractImplementor session = (SharedSessionContractImplementor) sessionFactory .withStatelessOptions() - .tenantIdentifier( sessionContext.tenantIdentifier() ) + .tenantIdentifier( context.tenantIdentifier() ) .openStatelessSession(); try { PojoMassIdentifierSink sink = context.createSink(); @@ -203,7 +198,7 @@ public PojoMassEntityLoader createEntityLoader(PojoMassIndexingEntityLoadingC typeContexts, conditionalExpression ); SessionImplementor session = (SessionImplementor) sessionFactory .withOptions() - .tenantIdentifier( sessionContext.tenantIdentifier() ) + .tenantIdentifier( context.tenantIdentifier() ) .openSession(); try { session.setHibernateFlushMode( FlushMode.MANUAL ); diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java index 196219f1633..45cf2e46086 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java @@ -6,6 +6,7 @@ */ package org.hibernate.search.mapper.orm.scope; +import java.util.Collection; import java.util.Set; import java.util.function.Function; @@ -158,6 +159,19 @@ public interface SearchScope { */ MassIndexer massIndexer(String tenantId); + /** + * Create a {@link MassIndexer} for the indexes mapped to types in this scope, or to any of their sub-types. + *

+ * This method works for both single- and multi-tenant applications. + * If multi-tenancy is disabled, simply keep the list of tenants empty. + *

+ * {@link MassIndexer} instances cannot be reused. + * + * @param tenantIds The tenants identifiers whose index content should be targeted. If empty, all tenants will be targeted. + * @return A {@link MassIndexer}. + */ + MassIndexer massIndexer(Collection tenantIds); + /** * @return A set containing one {@link SearchIndexedEntity} for each indexed entity in this scope. */ diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java index 31a638ef8ba..898000dc12f 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java @@ -6,7 +6,11 @@ */ package org.hibernate.search.mapper.orm.scope.impl; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.hibernate.search.engine.backend.scope.IndexScopeExtension; import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; @@ -18,9 +22,9 @@ import org.hibernate.search.mapper.orm.common.EntityReference; import org.hibernate.search.mapper.orm.entity.SearchIndexedEntity; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmSelectionLoadingContext; -import org.hibernate.search.mapper.orm.massindexing.impl.HibernateOrmMassIndexingContext; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.massindexing.impl.HibernateOrmMassIndexer; +import org.hibernate.search.mapper.orm.massindexing.impl.HibernateOrmMassIndexingContext; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; import org.hibernate.search.mapper.orm.schema.management.impl.SearchSchemaManagerImpl; import org.hibernate.search.mapper.orm.scope.SearchScope; @@ -89,20 +93,30 @@ public SearchWorkspace workspace(DetachedBackendSessionContext detachedSessionCo @Override public MassIndexer massIndexer() { - return massIndexer( (String) null ); + return massIndexer( Collections.emptyList() ); } @Override public MassIndexer massIndexer(String tenantId) { - return massIndexer( DetachedBackendSessionContext.of( mappingContext, tenantId ) ); + return massIndexer( Collections.singletonList( tenantId ) ); + } + + @Override + public MassIndexer massIndexer(Collection tenantIds) { + return massIndexer( tenantIds.isEmpty() ? + Collections.singletonList( DetachedBackendSessionContext.of( mappingContext, null ) ) : + tenantIds.stream() + .map( id -> DetachedBackendSessionContext.of( mappingContext, id ) ) + .collect( Collectors.toList() ) + ); } - public MassIndexer massIndexer(DetachedBackendSessionContext detachedSessionContext) { + public MassIndexer massIndexer(List detachedSessionContexts) { HibernateOrmMassIndexingContext massIndexingContext = new HibernateOrmMassIndexingContext( mappingContext, - mappingContext.typeContextProvider(), detachedSessionContext ); + mappingContext.typeContextProvider() ); PojoMassIndexer massIndexerDelegate = delegate - .massIndexer( massIndexingContext, detachedSessionContext ); + .massIndexer( massIndexingContext, detachedSessionContexts ); return new HibernateOrmMassIndexer( massIndexerDelegate, massIndexingContext ); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java index 9932bdc4e71..19ea9067efd 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java @@ -7,6 +7,7 @@ package org.hibernate.search.mapper.orm.session.impl; import java.lang.invoke.MethodHandles; +import java.util.Arrays; import java.util.Collection; import javax.persistence.EntityManager; import javax.transaction.Synchronization; @@ -154,7 +155,7 @@ public SearchWorkspace workspace(Collection> types) { @Override public MassIndexer massIndexer(Collection> types) { - return scope( types ).massIndexer( DetachedBackendSessionContext.of( this ) ); + return scope( types ).massIndexer( Arrays.asList( DetachedBackendSessionContext.of( this ) ) ); } @Override diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java index 44c25113bcb..308e6f92331 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java @@ -7,6 +7,7 @@ package org.hibernate.search.mapper.pojo.massindexing.impl; import java.lang.invoke.MethodHandles; +import java.util.Collection; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -16,12 +17,11 @@ import org.hibernate.search.mapper.pojo.logging.impl.Log; import org.hibernate.search.mapper.pojo.massindexing.MassIndexingFailureHandler; import org.hibernate.search.mapper.pojo.massindexing.MassIndexingMonitor; +import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexer; import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexingContext; import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexingMappingContext; -import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexer; - import org.hibernate.search.mapper.pojo.schema.management.spi.PojoScopeSchemaManager; -import org.hibernate.search.mapper.pojo.work.spi.PojoScopeWorkspace; +import org.hibernate.search.mapper.pojo.scope.spi.PojoScopeDelegate; import org.hibernate.search.util.common.impl.Futures; import org.hibernate.search.util.common.logging.impl.LoggerFactory; @@ -41,8 +41,8 @@ public class PojoDefaultMassIndexer implements PojoMassIndexer { private final PojoMassIndexingTypeContextProvider typeContextProvider; private final Set> targetedIndexedTypes; private final PojoScopeSchemaManager scopeSchemaManager; - private final DetachedBackendSessionContext detachedSession; - private final PojoScopeWorkspace scopeWorkspace; + private final Collection detachedSessions; + private final PojoScopeDelegate pojoScopeDelegate; // default settings defined here: private int typesToIndexInParallel = 1; @@ -60,15 +60,15 @@ public PojoDefaultMassIndexer(PojoMassIndexingContext indexingContext, PojoMassIndexingTypeContextProvider typeContextProvider, Set> targetedIndexedTypes, PojoScopeSchemaManager scopeSchemaManager, - DetachedBackendSessionContext detachedSession, - PojoScopeWorkspace scopeWorkspace) { + Collection detachedSessions, + PojoScopeDelegate pojoScopeDelegate) { this.indexingContext = indexingContext; this.mappingContext = mappingContext; this.typeContextProvider = typeContextProvider; this.targetedIndexedTypes = targetedIndexedTypes; this.scopeSchemaManager = scopeSchemaManager; - this.detachedSession = detachedSession; - this.scopeWorkspace = scopeWorkspace; + this.detachedSessions = detachedSessions; + this.pojoScopeDelegate = pojoScopeDelegate; } @Override @@ -169,7 +169,8 @@ private PojoMassIndexingBatchCoordinator createCoordinator() { return new PojoMassIndexingBatchCoordinator( mappingContext, notifier, - typeGroupsToIndex, scopeSchemaManager, detachedSession, scopeWorkspace, + typeGroupsToIndex, scopeSchemaManager, + detachedSessions, pojoScopeDelegate, typesToIndexInParallel, documentBuilderThreads, mergeSegmentsOnFinish, // false by default: diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java index 7cf8f6bdbc3..bf7d25a146b 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java @@ -7,11 +7,13 @@ package org.hibernate.search.mapper.pojo.massindexing.impl; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.function.Function; import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.engine.backend.work.execution.OperationSubmitter; @@ -20,6 +22,7 @@ import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexingMappingContext; import org.hibernate.search.mapper.pojo.reporting.impl.PojoEventContextMessages; import org.hibernate.search.mapper.pojo.schema.management.spi.PojoScopeSchemaManager; +import org.hibernate.search.mapper.pojo.scope.spi.PojoScopeDelegate; import org.hibernate.search.mapper.pojo.work.spi.PojoScopeWorkspace; import org.hibernate.search.util.common.AssertionFailure; import org.hibernate.search.util.common.impl.Closer; @@ -38,9 +41,8 @@ public class PojoMassIndexingBatchCoordinator extends PojoMassIndexingFailureHan private final List> typeGroupsToIndex; private final PojoScopeSchemaManager scopeSchemaManager; - private final DetachedBackendSessionContext detachedSession; - private final PojoScopeWorkspace scopeWorkspace; - + private final Collection detachedSessions; + private final PojoScopeDelegate pojoScopeDelegate; private final int typesToIndexInParallel; private final int documentBuilderThreads; private final boolean mergeSegmentsOnFinish; @@ -49,14 +51,15 @@ public class PojoMassIndexingBatchCoordinator extends PojoMassIndexingFailureHan private final boolean mergeSegmentsAfterPurge; private final List> indexingFutures = new ArrayList<>(); - private PojoMassIndexerAgent agent; + + private final Collection coordinatorContexts = new ArrayList<>(); public PojoMassIndexingBatchCoordinator(PojoMassIndexingMappingContext mappingContext, PojoMassIndexingNotifier notifier, List> typeGroupsToIndex, PojoScopeSchemaManager scopeSchemaManager, - DetachedBackendSessionContext detachedSession, - PojoScopeWorkspace scopeWorkspace, + Collection detachedSessions, + PojoScopeDelegate pojoScopeDelegate, int typesToIndexInParallel, int documentBuilderThreads, boolean mergeSegmentsOnFinish, boolean dropAndCreateSchemaOnStart, boolean purgeAtStart, boolean mergeSegmentsAfterPurge) { super( notifier ); @@ -64,8 +67,8 @@ public PojoMassIndexingBatchCoordinator(PojoMassIndexingMappingContext mappingCo this.typeGroupsToIndex = typeGroupsToIndex; this.scopeSchemaManager = scopeSchemaManager; - this.detachedSession = detachedSession; - this.scopeWorkspace = scopeWorkspace; + this.detachedSessions = detachedSessions; + this.pojoScopeDelegate = pojoScopeDelegate; this.typesToIndexInParallel = typesToIndexInParallel; this.documentBuilderThreads = documentBuilderThreads; this.mergeSegmentsOnFinish = mergeSegmentsOnFinish; @@ -96,12 +99,25 @@ public void runWithFailureHandler() throws InterruptedException { * Operations to do before the multiple-threads start indexing */ private void beforeBatch() throws InterruptedException { - // Create an agent to suspend concurrent indexing - agent = mappingContext.createMassIndexerAgent( - new PojoMassIndexerAgentCreateContextImpl( mappingContext, detachedSession.tenantIdentifier() ) - ); + // Prepare the contexts first. These will be used for all batch related work: + for ( DetachedBackendSessionContext detachedSession : detachedSessions ) { + coordinatorContexts.add( + new SessionContext( + // Create an agent to suspend concurrent indexing + mappingContext.createMassIndexerAgent( + new PojoMassIndexerAgentCreateContextImpl( mappingContext, detachedSession.tenantIdentifier() ) + ), + pojoScopeDelegate.workspace( detachedSession ), + detachedSession + ) + ); + } + // Start the agent and wait until concurrent indexing actually gets suspended - Futures.unwrappedExceptionGet( agent.start() ); + applyToAllContexts( + c -> CompletableFuture.supplyAsync( () -> c.agent().start() ) + ); + if ( dropAndCreateSchemaOnStart ) { RootFailureCollector failureCollector = new RootFailureCollector( @@ -112,9 +128,17 @@ private void beforeBatch() throws InterruptedException { } if ( purgeAtStart ) { - Futures.unwrappedExceptionGet( scopeWorkspace.purge( Collections.emptySet(), OperationSubmitter.BLOCKING ) ); + applyToAllContexts( + context -> context.scopeWorkspace().purge( Collections.emptySet(), OperationSubmitter.BLOCKING ) + ); if ( mergeSegmentsAfterPurge ) { - Futures.unwrappedExceptionGet( scopeWorkspace.mergeSegments( OperationSubmitter.BLOCKING ) ); + // TODO: HSEARCH-4767 Note this only works fine as long as we have only a discriminator-based multitenancy. + // We deliberately are targeting a single context as the underlying operation at this point is not tenant dependent + // and calling it for multiple tenants would just request doing the same work. + Futures.unwrappedExceptionGet( + coordinatorContexts.iterator().next() + .scopeWorkspace().mergeSegments( OperationSubmitter.BLOCKING ) + ); } } } @@ -131,7 +155,9 @@ private void doBatchWork() throws InterruptedException { PojoMassIndexingBatchIndexingWorkspace.THREAD_NAME_PREFIX + "Workspace" ); for ( PojoMassIndexingIndexedTypeGroup typeGroup : typeGroupsToIndex ) { - indexingFutures.add( Futures.runAsync( createBatchIndexingWorkspace( typeGroup ), executor ) ); + for ( SessionContext context : coordinatorContexts ) { + indexingFutures.add( Futures.runAsync( createBatchIndexingWorkspace( typeGroup, context ), executor ) ); + } } executor.shutdown(); @@ -142,11 +168,13 @@ private void doBatchWork() throws InterruptedException { } private PojoMassIndexingBatchIndexingWorkspace createBatchIndexingWorkspace( - PojoMassIndexingIndexedTypeGroup typeGroup) { + PojoMassIndexingIndexedTypeGroup typeGroup, SessionContext context) { return new PojoMassIndexingBatchIndexingWorkspace<>( mappingContext, getNotifier(), typeGroup, typeGroup.loadingStrategy(), - documentBuilderThreads ); + documentBuilderThreads, + context.sessionContext().tenantIdentifier() + ); } /** @@ -154,17 +182,28 @@ mappingContext, getNotifier(), typeGroup, */ private void afterBatch() throws InterruptedException { if ( mergeSegmentsOnFinish ) { - Futures.unwrappedExceptionGet( scopeWorkspace.mergeSegments( OperationSubmitter.BLOCKING ) ); + // TODO: HSEARCH-4767 Note this only works fine as long as we have only a discriminator-based multitenancy. + // We deliberately are targeting a single context as the underlying operation at this point is not tenant dependent + // and calling it for multiple tenants would just request doing the same work. + Futures.unwrappedExceptionGet( coordinatorContexts.iterator().next() + .scopeWorkspace().mergeSegments( OperationSubmitter.BLOCKING ) + ); } flushAndRefresh(); - Futures.unwrappedExceptionGet( agent.preStop() ); - agent.stop(); - agent = null; + applyToAllContexts( + context -> context.agent().preStop() + .thenRun( () -> context.agent().stop() ) + ); + coordinatorContexts.clear(); } private void flushAndRefresh() throws InterruptedException { - Futures.unwrappedExceptionGet( scopeWorkspace.flush( OperationSubmitter.BLOCKING ) ); - Futures.unwrappedExceptionGet( scopeWorkspace.refresh( OperationSubmitter.BLOCKING ) ); + // TODO: HSEARCH-4767 Note this only works fine as long as we have only a discriminator-based multitenancy. + // We deliberately are targeting a single context as the underlying operation at this point is not tenant dependent + // and calling it for multiple tenants would just request doing the same work. + SessionContext context = coordinatorContexts.iterator().next(); + Futures.unwrappedExceptionGet( context.scopeWorkspace().flush( OperationSubmitter.BLOCKING ) ); + Futures.unwrappedExceptionGet( context.scopeWorkspace().refresh( OperationSubmitter.BLOCKING ) ); } @Override @@ -174,8 +213,8 @@ protected void cleanUpOnInterruption() throws InterruptedException { // Indexing performed before the exception must still be committed, // in order to leave the index in a consistent state closer.push( PojoMassIndexingBatchCoordinator::flushAndRefresh, this ); - closer.push( PojoMassIndexerAgent::stop, agent ); - agent = null; + closer.pushAll( PojoMassIndexerAgent::stop, coordinatorContexts, SessionContext::agent ); + coordinatorContexts.clear(); } } @@ -183,8 +222,8 @@ protected void cleanUpOnInterruption() throws InterruptedException { protected void cleanUpOnFailure() { try ( Closer closer = new Closer<>() ) { closer.pushAll( this::cancelPendingTask, indexingFutures ); - closer.push( PojoMassIndexerAgent::stop, agent ); - agent = null; + closer.pushAll( PojoMassIndexerAgent::stop, coordinatorContexts, SessionContext::agent ); + coordinatorContexts.clear(); } } @@ -212,4 +251,38 @@ protected void notifyFailure(RuntimeException exception) { getNotifier().reportIndexingCompleted(); } + public static class SessionContext { + private final PojoMassIndexerAgent agent; + private final PojoScopeWorkspace scopeWorkspace; + private final DetachedBackendSessionContext sessionContext; + + public SessionContext(PojoMassIndexerAgent agent, PojoScopeWorkspace scopeWorkspace, DetachedBackendSessionContext sessionContext) { + this.agent = agent; + this.scopeWorkspace = scopeWorkspace; + this.sessionContext = sessionContext; + } + + public PojoMassIndexerAgent agent() { + return agent; + } + + public PojoScopeWorkspace scopeWorkspace() { + return scopeWorkspace; + } + + public DetachedBackendSessionContext sessionContext() { + return sessionContext; + } + } + + private void applyToAllContexts(Function> operation) throws InterruptedException { + Futures.unwrappedExceptionGet( + CompletableFuture.allOf( + coordinatorContexts.stream() + .map( c -> operation.apply( c ) ) + .toArray( CompletableFuture[]::new ) + ) + ); + } + } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchIndexingWorkspace.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchIndexingWorkspace.java index aa9d65db7a9..1376c577279 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchIndexingWorkspace.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchIndexingWorkspace.java @@ -41,17 +41,19 @@ public class PojoMassIndexingBatchIndexingWorkspace extends PojoMassIndexi private final PojoMassIndexingLoadingStrategy loadingStrategy; private final int entityExtractingThreads; + private final String tenantId; PojoMassIndexingBatchIndexingWorkspace(PojoMassIndexingMappingContext mappingContext, PojoMassIndexingNotifier notifier, PojoMassIndexingIndexedTypeGroup typeGroup, PojoMassIndexingLoadingStrategy loadingStrategy, - int entityExtractingThreads) { + int entityExtractingThreads, String tenantId) { super( notifier ); this.mappingContext = mappingContext; this.typeGroup = typeGroup; this.loadingStrategy = loadingStrategy; this.entityExtractingThreads = entityExtractingThreads; + this.tenantId = tenantId; } @Override @@ -95,7 +97,8 @@ private void cancelPendingTasks() { private void startProducingPrimaryKeys(PojoProducerConsumerQueue> identifierQueue) { final Runnable runnable = new PojoMassIndexingEntityIdentifierLoadingRunnable<>( getNotifier(), typeGroup, - loadingStrategy, identifierQueue ); + loadingStrategy, identifierQueue, tenantId + ); //execIdentifiersLoader has size 1 and is not configurable: ensures the list is consistent as produced by one transaction final ThreadPoolExecutor identifierProducingExecutor = mappingContext.threadPoolProvider().newFixedThreadPool( 1, @@ -111,7 +114,8 @@ private void startProducingPrimaryKeys(PojoProducerConsumerQueue> identi private void startIndexing(PojoProducerConsumerQueue> identifierQueue) { final Runnable runnable = new PojoMassIndexingEntityLoadingRunnable<>( getNotifier(), typeGroup, - loadingStrategy, identifierQueue ); + loadingStrategy, identifierQueue, tenantId + ); final ThreadPoolExecutor indexingExecutor = mappingContext.threadPoolProvider().newFixedThreadPool( entityExtractingThreads, THREAD_NAME_PREFIX + typeGroup.notifiedGroupName() + " - Entity loading" diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityIdentifierLoadingRunnable.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityIdentifierLoadingRunnable.java index 119045e8445..fb98a2b3975 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityIdentifierLoadingRunnable.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityIdentifierLoadingRunnable.java @@ -27,15 +27,17 @@ public class PojoMassIndexingEntityIdentifierLoadingRunnable private final PojoMassIndexingIndexedTypeGroup typeGroup; private final PojoMassIndexingLoadingStrategy loadingStrategy; private final PojoProducerConsumerQueue> identifierQueue; + private final String tenantId; public PojoMassIndexingEntityIdentifierLoadingRunnable(PojoMassIndexingNotifier notifier, PojoMassIndexingIndexedTypeGroup typeGroup, PojoMassIndexingLoadingStrategy loadingStrategy, - PojoProducerConsumerQueue> identifierQueue) { + PojoProducerConsumerQueue> identifierQueue, String tenantId) { super( notifier ); this.loadingStrategy = loadingStrategy; this.typeGroup = typeGroup; this.identifierQueue = identifierQueue; + this.tenantId = tenantId; } @Override @@ -97,5 +99,10 @@ public void complete() { } }; } + + @Override + public String tenantIdentifier() { + return tenantId; + } } } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityLoadingRunnable.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityLoadingRunnable.java index 9cc9fdcde7f..59ec6b82d19 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityLoadingRunnable.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingEntityLoadingRunnable.java @@ -36,15 +36,18 @@ public class PojoMassIndexingEntityLoadingRunnable private final PojoMassIndexingIndexedTypeGroup typeGroup; private final PojoMassIndexingLoadingStrategy loadingStrategy; private final PojoProducerConsumerQueue> identifierQueue; + private final String tenantId; protected PojoMassIndexingEntityLoadingRunnable(PojoMassIndexingNotifier notifier, PojoMassIndexingIndexedTypeGroup typeGroup, PojoMassIndexingLoadingStrategy loadingStrategy, - PojoProducerConsumerQueue> identifierQueue) { + PojoProducerConsumerQueue> identifierQueue, + String tenantId) { super( notifier ); this.typeGroup = typeGroup; this.loadingStrategy = loadingStrategy; this.identifierQueue = identifierQueue; + this.tenantId = tenantId; } @Override @@ -131,6 +134,11 @@ public void accept(List batch) throws InterruptedException { }; } + @Override + public String tenantIdentifier() { + return tenantId; + } + public void waitForLastBatches() throws InterruptedException { for ( IndexingBatch batch : batches ) { batch.waitForIndexingEndAndReport(); diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingEntityLoadingContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingEntityLoadingContext.java index e7ec998f7f7..94cb8d5109b 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingEntityLoadingContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingEntityLoadingContext.java @@ -29,4 +29,9 @@ public interface PojoMassIndexingEntityLoadingContext { */ PojoMassEntitySink createSink(PojoMassIndexingSessionContext sessionContext); + /** + * @return The tenant identifier to use ({@code null} if none). + */ + String tenantIdentifier(); + } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingIdentifierLoadingContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingIdentifierLoadingContext.java index 473824bcd91..3e799ea4b6a 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingIdentifierLoadingContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/spi/PojoMassIndexingIdentifierLoadingContext.java @@ -29,4 +29,8 @@ public interface PojoMassIndexingIdentifierLoadingContext { */ PojoMassIdentifierSink createSink(); + /** + * @return The tenant identifier to use ({@code null} if none). + */ + String tenantIdentifier(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java index 8b2a5cabd98..d162cbd9d43 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java @@ -154,9 +154,9 @@ public PojoScopeSchemaManager schemaManager() { } @Override - public PojoMassIndexer massIndexer(PojoMassIndexingContext context, DetachedBackendSessionContext detachedSession) { + public PojoMassIndexer massIndexer(PojoMassIndexingContext context, Collection detachedSessions) { return new PojoDefaultMassIndexer( context, mappingContext, indexedTypeContextProvider, targetedTypeContexts, - schemaManager(), detachedSession, workspace( detachedSession ) ); + schemaManager(), detachedSessions, this ); } @Override diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java index d6c61d89464..c4610b042a7 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java @@ -6,6 +6,7 @@ */ package org.hibernate.search.mapper.pojo.scope.spi; +import java.util.Collection; import java.util.Set; import org.hibernate.search.engine.backend.common.spi.DocumentReferenceConverter; @@ -52,7 +53,7 @@ public interface PojoScopeDelegate { PojoScopeSchemaManager schemaManager(); - PojoMassIndexer massIndexer(PojoMassIndexingContext context, DetachedBackendSessionContext detachedSession); + PojoMassIndexer massIndexer(PojoMassIndexingContext context, Collection detachedSessions); T extension(IndexScopeExtension extension); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/MassLoadingOptions.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/MassLoadingOptions.java index 62b1278a1b7..610b323176a 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/MassLoadingOptions.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/MassLoadingOptions.java @@ -14,11 +14,6 @@ @Incubating public interface MassLoadingOptions { - /** - * @return The tenant identifier, or {@code null} for single-tenancy. - */ - String tenantIdentifier(); - /** * @return How many entities to load and index in each batch. * Defines the maximum expected size of each list of IDs diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/SelectionLoadingOptions.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/SelectionLoadingOptions.java index 25a44726a91..b20b2028452 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/SelectionLoadingOptions.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/SelectionLoadingOptions.java @@ -12,11 +12,6 @@ @Incubating public interface SelectionLoadingOptions { - /** - * @return The tenant identifier, or {@code null} for single-tenancy. - */ - String tenantIdentifier(); - /** * Gets context previously passed to * {@link SelectionLoadingOptionsStep#context(Class, Object)}. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/impl/StandalonePojoLoadingContext.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/impl/StandalonePojoLoadingContext.java index b0c87649bd3..268b73be3a8 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/impl/StandalonePojoLoadingContext.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/loading/impl/StandalonePojoLoadingContext.java @@ -13,7 +13,6 @@ import java.util.Optional; import java.util.Set; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.mapper.pojo.standalone.loading.MassLoadingOptions; import org.hibernate.search.mapper.pojo.standalone.loading.MassLoadingStrategy; import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingOptions; @@ -39,7 +38,6 @@ public final class StandalonePojoLoadingContext private final StandalonePojoMassIndexingMappingContext mappingContext; private final LoadingTypeContextProvider typeContextProvider; - private final DetachedBackendSessionContext sessionContext; private int batchSize = 10; private final Map, Object> contextData; @@ -47,15 +45,9 @@ public final class StandalonePojoLoadingContext private StandalonePojoLoadingContext(Builder builder) { this.mappingContext = builder.mappingContext; this.typeContextProvider = builder.typeContextProvider; - this.sessionContext = builder.sessionContext; this.contextData = builder.contextData; } - @Override - public String tenantIdentifier() { - return sessionContext.tenantIdentifier(); - } - public void batchSize(int batchSize) { if ( batchSize < 1 ) { throw new IllegalArgumentException( "batchSize must be at least 1" ); @@ -113,20 +105,18 @@ public Optional> loadingStrategyOpti throw log.entityLoadingStrategyNotRegistered( typeContext.typeIdentifier() ); } return new StandalonePojoMassIndexingLoadingStrategy<>( mappingContext, typeContextProvider, - strategyOptional.get(), sessionContext, this ); + strategyOptional.get(), this ); } public static final class Builder implements StandalonePojoSelectionLoadingContextBuilder, SelectionLoadingOptionsStep { private final StandalonePojoMassIndexingMappingContext mappingContext; private final LoadingTypeContextProvider typeContextProvider; - private final DetachedBackendSessionContext sessionContext; private final Map, Object> contextData = new HashMap<>(); public Builder(StandalonePojoMassIndexingMappingContext mappingContext, - LoadingTypeContextProvider typeContextProvider, DetachedBackendSessionContext sessionContext) { + LoadingTypeContextProvider typeContextProvider) { this.mappingContext = mappingContext; this.typeContextProvider = typeContextProvider; - this.sessionContext = sessionContext; } @Override diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java index 27c5774515f..a9535afa968 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java @@ -18,7 +18,6 @@ import org.hibernate.search.engine.backend.common.spi.EntityReferenceFactory; import org.hibernate.search.engine.backend.index.IndexManager; import org.hibernate.search.engine.backend.reporting.spi.BackendMappingHints; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.engine.common.spi.SearchIntegration; import org.hibernate.search.engine.mapper.mapping.spi.MappingPreStopContext; import org.hibernate.search.engine.mapper.mapping.spi.MappingStartContext; @@ -201,8 +200,8 @@ public Backend backend(String backendName) { } @Override - public StandalonePojoLoadingContext.Builder loadingContextBuilder(DetachedBackendSessionContext sessionContext) { - return new StandalonePojoLoadingContext.Builder( this, typeContextContainer, sessionContext ); + public StandalonePojoLoadingContext.Builder loadingContextBuilder() { + return new StandalonePojoLoadingContext.Builder( this, typeContextContainer ); } @Override @@ -212,8 +211,8 @@ public PojoMassIndexerAgent createMassIndexerAgent(PojoMassIndexerAgentCreateCon } @Override - public StandalonePojoMassIndexingSessionContext createSession(DetachedBackendSessionContext sessionContext) { - return createSessionBuilder().tenantId( sessionContext.tenantIdentifier() ).build(); + public StandalonePojoMassIndexingSessionContext createSession(String tenantIdentifier) { + return createSessionBuilder().tenantId( tenantIdentifier ).build(); } private SearchIntegration searchIntegration() { diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingLoadingStrategy.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingLoadingStrategy.java index bd7696702e7..59d26990822 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingLoadingStrategy.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingLoadingStrategy.java @@ -6,7 +6,6 @@ */ package org.hibernate.search.mapper.pojo.standalone.massindexing.impl; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.mapper.pojo.standalone.loading.MassIdentifierSink; import org.hibernate.search.mapper.pojo.standalone.loading.MassLoadingOptions; import org.hibernate.search.mapper.pojo.standalone.loading.MassEntitySink; @@ -30,17 +29,15 @@ public class StandalonePojoMassIndexingLoadingStrategy private final StandalonePojoMassIndexingMappingContext mappingContext; private final LoadingTypeContextProvider typeContextProvider; private final MassLoadingStrategy delegate; - private final DetachedBackendSessionContext sessionContext; private final MassLoadingOptions options; public StandalonePojoMassIndexingLoadingStrategy(StandalonePojoMassIndexingMappingContext mappingContext, LoadingTypeContextProvider typeContextProvider, - MassLoadingStrategy delegate, DetachedBackendSessionContext sessionContext, + MassLoadingStrategy delegate, MassLoadingOptions options) { this.mappingContext = mappingContext; this.typeContextProvider = typeContextProvider; this.delegate = delegate; - this.sessionContext = sessionContext; this.options = options; } @@ -71,7 +68,7 @@ public PojoMassIdentifierLoader createIdentifierLoader(PojoMassIndexingIdentifie @Override public PojoMassEntityLoader createEntityLoader(PojoMassIndexingEntityLoadingContext context) { - StandalonePojoMassIndexingSessionContext session = mappingContext.createSession( sessionContext ); + StandalonePojoMassIndexingSessionContext session = mappingContext.createSession( context.tenantIdentifier() ); try { StandalonePojoLoadingTypeGroup includedTypes = new StandalonePojoLoadingTypeGroup<>( typeContextProvider, context.includedTypes(), mappingContext.runtimeIntrospector() ); diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingMappingContext.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingMappingContext.java index 5081396654d..dd23d8a8e01 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingMappingContext.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/massindexing/impl/StandalonePojoMassIndexingMappingContext.java @@ -6,13 +6,12 @@ */ package org.hibernate.search.mapper.pojo.standalone.massindexing.impl; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.mapper.pojo.massindexing.spi.PojoMassIndexingMappingContext; import org.hibernate.search.mapper.pojo.model.spi.PojoRuntimeIntrospector; public interface StandalonePojoMassIndexingMappingContext extends PojoMassIndexingMappingContext { - StandalonePojoMassIndexingSessionContext createSession(DetachedBackendSessionContext sessionContext); + StandalonePojoMassIndexingSessionContext createSession(String tenantIdentifier); PojoRuntimeIntrospector runtimeIntrospector(); diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java index 8f5e65dfd9b..d24735b6c86 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java @@ -6,6 +6,7 @@ */ package org.hibernate.search.mapper.pojo.standalone.scope; +import java.util.Collection; import java.util.Set; import java.util.function.Function; @@ -160,6 +161,19 @@ public interface SearchScope { */ MassIndexer massIndexer(String tenantId); + /** + * Create a {@link MassIndexer} for the indexes mapped to types in this scope, or to any of their sub-types. + *

+ * This method works for both single- and multi-tenant applications. + * If multi-tenancy is disabled, simply keep the list of tenants empty. + *

+ * {@link MassIndexer} instances cannot be reused. + * + * @param tenantIds The tenants identifiers whose index content should be targeted. If empty, all tenants will be targeted. + * @return A {@link MassIndexer}. + */ + MassIndexer massIndexer(Collection tenantIds); + /** * @return A set containing one {@link SearchIndexedEntity} for each indexed entity in this scope. */ diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java index 6b83ef8a785..a5a8033d551 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java @@ -6,7 +6,11 @@ */ package org.hibernate.search.mapper.pojo.standalone.scope.impl; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.hibernate.search.engine.backend.common.spi.DocumentReferenceConverter; import org.hibernate.search.engine.backend.scope.IndexScopeExtension; @@ -100,17 +104,27 @@ public T extension(IndexScopeExtension extension) { @Override public MassIndexer massIndexer() { - return massIndexer( (String) null ); + return massIndexer( Collections.emptyList() ); } @Override public MassIndexer massIndexer(String tenantId) { - return massIndexer( DetachedBackendSessionContext.of( mappingContext, tenantId ) ); + return massIndexer( Collections.singletonList( tenantId ) ); } - public MassIndexer massIndexer(DetachedBackendSessionContext sessionContext) { - StandalonePojoLoadingContext context = mappingContext.loadingContextBuilder( sessionContext ).build(); - PojoMassIndexer massIndexerDelegate = delegate.massIndexer( context, sessionContext ); + @Override + public MassIndexer massIndexer(Collection tenantIds) { + return massIndexer( tenantIds.isEmpty() ? + Collections.singletonList( DetachedBackendSessionContext.of( mappingContext, null ) ) : + tenantIds.stream() + .map( id -> DetachedBackendSessionContext.of( mappingContext, id ) ) + .collect( Collectors.toList() ) + ); + } + + public MassIndexer massIndexer(List detachedSessionContexts) { + StandalonePojoLoadingContext context = mappingContext.loadingContextBuilder().build(); + PojoMassIndexer massIndexerDelegate = delegate.massIndexer( context, detachedSessionContexts ); return new StandalonePojoMassIndexer( massIndexerDelegate, context ); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/StandalonePojoScopeMappingContext.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/StandalonePojoScopeMappingContext.java index 1927cda04fa..9b24daa68f6 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/StandalonePojoScopeMappingContext.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/StandalonePojoScopeMappingContext.java @@ -7,11 +7,10 @@ package org.hibernate.search.mapper.pojo.standalone.scope.impl; import org.hibernate.search.engine.backend.mapping.spi.BackendMappingContext; -import org.hibernate.search.engine.backend.session.spi.DetachedBackendSessionContext; import org.hibernate.search.mapper.pojo.standalone.loading.impl.StandalonePojoLoadingContext; public interface StandalonePojoScopeMappingContext extends BackendMappingContext { - StandalonePojoLoadingContext.Builder loadingContextBuilder(DetachedBackendSessionContext sessionContext); + StandalonePojoLoadingContext.Builder loadingContextBuilder(); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java index 5e803c7ebb9..05d71963120 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java @@ -7,6 +7,7 @@ package org.hibernate.search.mapper.pojo.standalone.session.impl; import java.lang.invoke.MethodHandles; +import java.util.Arrays; import java.util.Collection; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -98,7 +99,7 @@ public boolean isOpen() { @Override public MassIndexer massIndexer(Collection> types) { checkOpenAndThrow(); - return scope( types ).massIndexer( DetachedBackendSessionContext.of( this ) ); + return scope( types ).massIndexer( Arrays.asList( DetachedBackendSessionContext.of( this ) ) ); } @Override @@ -189,7 +190,7 @@ public StandalonePojoSearchSessionMappingContext mappingContext() { } private StandalonePojoSelectionLoadingContextBuilder loadingContextBuilder() { - StandalonePojoLoadingContext.Builder builder = mappingContext.loadingContextBuilder( DetachedBackendSessionContext.of( this ) ); + StandalonePojoLoadingContext.Builder builder = mappingContext.loadingContextBuilder(); if ( loadingOptionsContributor != null ) { loadingOptionsContributor.accept( builder ); }