From dc381d9fbc5442c943b0c6ae6b1f31c7c2b8c8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 9 Feb 2021 15:51:11 +0100 Subject: [PATCH] HSEARCH-4153 Add a reference to the root indexing plan in type indexing plans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is not very useful now, but it will be when we add loading plans. Signed-off-by: Yoann Rodière --- .../impl/PojoContainedTypeManager.java | 8 +-- .../mapping/impl/PojoIndexedTypeManager.java | 4 +- .../impl/AbstractPojoTypeIndexingPlan.java | 15 +++--- .../impl/PojoContainedTypeIndexingPlan.java | 4 +- .../impl/PojoIndexedTypeIndexingPlan.java | 9 ++-- .../pojo/work/impl/PojoIndexingPlanImpl.java | 49 ++++++++++--------- .../impl/PojoWorkContainedTypeContext.java | 3 +- .../work/impl/PojoWorkIndexedTypeContext.java | 1 + 8 files changed, 49 insertions(+), 44 deletions(-) diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoContainedTypeManager.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoContainedTypeManager.java index 15fe1bd1308..edc5b4d52f3 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoContainedTypeManager.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoContainedTypeManager.java @@ -11,6 +11,7 @@ import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeIdentifier; import org.hibernate.search.mapper.pojo.scope.impl.PojoScopeContainedTypeContext; import org.hibernate.search.mapper.pojo.work.impl.PojoContainedTypeIndexingPlan; +import org.hibernate.search.mapper.pojo.work.impl.PojoIndexingPlanImpl; import org.hibernate.search.mapper.pojo.work.impl.PojoWorkContainedTypeContext; import org.hibernate.search.mapper.pojo.work.spi.PojoWorkSessionContext; @@ -26,10 +27,9 @@ public PojoContainedTypeManager(String entityName, PojoRawTypeIdentifier type } @Override - public PojoContainedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext) { - return new PojoContainedTypeIndexingPlan<>( - this, sessionContext - ); + public PojoContainedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext, + PojoIndexingPlanImpl root) { + return new PojoContainedTypeIndexingPlan<>( this, sessionContext, root ); } } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java index c2acae7ae95..00da10ae3df 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java @@ -27,6 +27,7 @@ import org.hibernate.search.mapper.pojo.scope.impl.PojoScopeIndexedTypeContext; import org.hibernate.search.mapper.pojo.work.impl.PojoDocumentContributor; import org.hibernate.search.mapper.pojo.work.impl.PojoIndexedTypeIndexingPlan; +import org.hibernate.search.mapper.pojo.work.impl.PojoIndexingPlanImpl; import org.hibernate.search.mapper.pojo.work.impl.PojoTypeIndexer; import org.hibernate.search.mapper.pojo.work.impl.PojoWorkIndexedTypeContext; import org.hibernate.search.mapper.pojo.work.impl.PojoWorkRouter; @@ -133,9 +134,10 @@ public IndexWorkspace createWorkspace(DetachedBackendSessionContext sessionConte @Override public PojoIndexedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext, + PojoIndexingPlanImpl root, DocumentCommitStrategy commitStrategy, DocumentRefreshStrategy refreshStrategy) { return new PojoIndexedTypeIndexingPlan<>( - this, sessionContext, + this, sessionContext, root, indexManager.createIndexingPlan( sessionContext, sessionContext.entityReferenceFactory(), commitStrategy, refreshStrategy diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/AbstractPojoTypeIndexingPlan.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/AbstractPojoTypeIndexingPlan.java index 94aa887be38..c0fb354a891 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/AbstractPojoTypeIndexingPlan.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/AbstractPojoTypeIndexingPlan.java @@ -13,7 +13,6 @@ import org.hibernate.search.mapper.pojo.automaticindexing.impl.PojoImplicitReindexingResolverRootContext; import org.hibernate.search.mapper.pojo.automaticindexing.spi.PojoImplicitReindexingResolverSessionContext; -import org.hibernate.search.mapper.pojo.automaticindexing.impl.PojoReindexingCollector; import org.hibernate.search.mapper.pojo.work.spi.PojoWorkSessionContext; /** @@ -24,12 +23,14 @@ abstract class AbstractPojoTypeIndexingPlan.AbstractEntityState> { final PojoWorkSessionContext sessionContext; + final PojoIndexingPlanImpl root; // Use a LinkedHashMap for deterministic iteration final Map statesPerId = new LinkedHashMap<>(); - AbstractPojoTypeIndexingPlan(PojoWorkSessionContext sessionContext) { + AbstractPojoTypeIndexingPlan(PojoWorkSessionContext sessionContext, PojoIndexingPlanImpl root) { this.sessionContext = sessionContext; + this.root = root; } void add(Object providedId, String providedRoutingKey, Object entity) { @@ -45,7 +46,7 @@ void addOrUpdate(Object providedId, String providedRoutingKey, Object entity) { } void addOrUpdate(Object providedId, String providedRoutingKey, Object entity, BitSet dirtyPaths) { - Supplier entitySupplier = typeContext().toEntitySupplier( sessionContext, entity ); + Supplier entitySupplier = entity == null ? null : typeContext().toEntitySupplier( sessionContext, entity ); I identifier = toIdentifier( providedId, entitySupplier ); getState( identifier ).addOrUpdate( entitySupplier, providedRoutingKey, dirtyPaths ); } @@ -56,9 +57,9 @@ void delete(Object providedId, String providedRoutingKey, Object entity) { getState( identifier ).delete( entitySupplier, providedRoutingKey ); } - void resolveDirty(PojoReindexingCollector containingEntityCollector) { + void resolveDirty() { for ( S state : statesPerId.values() ) { - state.resolveDirty( containingEntityCollector ); + state.resolveDirty(); } } @@ -150,10 +151,10 @@ void delete(Supplier entitySupplier, String providedRoutingKey) { dirtyPaths = null; } - void resolveDirty(PojoReindexingCollector containingEntityCollector) { + void resolveDirty() { if ( shouldResolveToReindex ) { shouldResolveToReindex = false; // Avoid infinite looping - typeContext().resolveEntitiesToReindex( containingEntityCollector, sessionContext, identifier, + typeContext().resolveEntitiesToReindex( root, sessionContext, identifier, entitySupplier, this ); } } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoContainedTypeIndexingPlan.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoContainedTypeIndexingPlan.java index 7c168704057..4f769e5b5b4 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoContainedTypeIndexingPlan.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoContainedTypeIndexingPlan.java @@ -19,8 +19,8 @@ public class PojoContainedTypeIndexingPlan private final PojoWorkContainedTypeContext typeContext; public PojoContainedTypeIndexingPlan(PojoWorkContainedTypeContext typeContext, - PojoWorkSessionContext sessionContext) { - super( sessionContext ); + PojoWorkSessionContext sessionContext, PojoIndexingPlanImpl root) { + super( sessionContext, root ); this.typeContext = typeContext; } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexedTypeIndexingPlan.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexedTypeIndexingPlan.java index 08e254374c0..41ea7595066 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexedTypeIndexingPlan.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexedTypeIndexingPlan.java @@ -14,7 +14,6 @@ import org.hibernate.search.engine.backend.work.execution.spi.DocumentReferenceProvider; import org.hibernate.search.engine.backend.work.execution.spi.IndexIndexingPlan; import org.hibernate.search.engine.backend.work.execution.spi.IndexIndexingPlanExecutionReport; -import org.hibernate.search.mapper.pojo.automaticindexing.impl.PojoReindexingCollector; import org.hibernate.search.mapper.pojo.route.impl.DocumentRouteImpl; import org.hibernate.search.mapper.pojo.work.spi.PojoWorkSessionContext; @@ -30,9 +29,9 @@ public class PojoIndexedTypeIndexingPlan private final IndexIndexingPlan delegate; public PojoIndexedTypeIndexingPlan(PojoWorkIndexedTypeContext typeContext, - PojoWorkSessionContext sessionContext, + PojoWorkSessionContext sessionContext, PojoIndexingPlanImpl root, IndexIndexingPlan delegate) { - super( sessionContext ); + super( sessionContext, root ); this.typeContext = typeContext; this.delegate = delegate; } @@ -44,11 +43,11 @@ void updateBecauseOfContained(Object entity) { } @Override - void resolveDirty(PojoReindexingCollector containingEntityCollector) { + void resolveDirty() { // We need to iterate on a "frozen snapshot" of the states because of HSEARCH-3857 List frozenIndexingPlansPerId = new ArrayList<>( statesPerId.values() ); for ( IndexedEntityState plan : frozenIndexingPlansPerId ) { - plan.resolveDirty( containingEntityCollector ); + plan.resolveDirty(); } } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexingPlanImpl.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexingPlanImpl.java index 83692d2ce2e..aeb3cf488a7 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexingPlanImpl.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoIndexingPlanImpl.java @@ -18,6 +18,7 @@ import org.hibernate.search.engine.backend.work.execution.DocumentCommitStrategy; import org.hibernate.search.engine.backend.work.execution.DocumentRefreshStrategy; import org.hibernate.search.engine.backend.work.execution.spi.IndexIndexingPlanExecutionReport; +import org.hibernate.search.mapper.pojo.automaticindexing.impl.PojoReindexingCollector; import org.hibernate.search.mapper.pojo.logging.impl.Log; import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeIdentifier; import org.hibernate.search.mapper.pojo.model.spi.PojoRuntimeIntrospector; @@ -26,7 +27,7 @@ import org.hibernate.search.util.common.AssertionFailure; import org.hibernate.search.util.common.logging.impl.LoggerFactory; -public class PojoIndexingPlanImpl implements PojoIndexingPlan { +public class PojoIndexingPlanImpl implements PojoIndexingPlan, PojoReindexingCollector { private static final Log log = LoggerFactory.make( Log.class, MethodHandles.lookup() ); @@ -90,12 +91,12 @@ public void process() { isProcessing = true; try { for ( PojoContainedTypeIndexingPlan delegate : containedTypeDelegates.values() ) { - delegate.resolveDirty( this::updateBecauseOfContained ); + delegate.resolveDirty(); } // We need to iterate on a "frozen snapshot" of the indexedTypeDelegates values because of HSEARCH-3857 List> frozenIndexedTypeDelegates = new ArrayList<>( indexedTypeDelegates.values() ); for ( PojoIndexedTypeIndexingPlan delegate : frozenIndexedTypeDelegates ) { - delegate.resolveDirty( this::updateBecauseOfContained ); + delegate.resolveDirty(); } for ( PojoIndexedTypeIndexingPlan delegate : indexedTypeDelegates.values() ) { delegate.process(); @@ -140,6 +141,24 @@ public void discardNotProcessed() { } } + @Override + public void markForReindexing(Object containingEntity) { + // Note this method won't work when using provided identifiers + // Fortunately, all platforms relying on provided identifiers (Infinispan) + // also disable reindexing of other entities on updates, + // so they won't ever call this method. + + PojoRawTypeIdentifier typeIdentifier = getIntrospector().detectEntityType( containingEntity ); + if ( typeIdentifier == null ) { + throw new AssertionFailure( + "Attempt to reindex entity " + containingEntity + " because a contained entity was modified," + + " but this entity type is not indexed directly." + ); + } + PojoIndexedTypeIndexingPlan delegate = getOrCreateIndexedDelegateForContainedUpdate( typeIdentifier ); + delegate.updateBecauseOfContained( containingEntity ); + } + private PojoRuntimeIntrospector getIntrospector() { return introspector; } @@ -160,7 +179,7 @@ private PojoRuntimeIntrospector getIntrospector() { indexedTypeContextProvider.getByExactType( typeIdentifier ); if ( indexedTypeContextOptional.isPresent() ) { PojoIndexedTypeIndexingPlan delegate = indexedTypeContextOptional.get() - .createIndexingPlan( sessionContext, commitStrategy, refreshStrategy ); + .createIndexingPlan( sessionContext, this, commitStrategy, refreshStrategy ); indexedTypeDelegates.put( typeIdentifier, delegate ); return delegate; } @@ -169,7 +188,7 @@ private PojoRuntimeIntrospector getIntrospector() { containedTypeContextProvider.getByExactType( typeIdentifier ); if ( containedTypeContextOptional.isPresent() ) { PojoContainedTypeIndexingPlan delegate = containedTypeContextOptional.get() - .createIndexingPlan( sessionContext ); + .createIndexingPlan( sessionContext, this ); containedTypeDelegates.put( typeIdentifier, delegate ); return delegate; } @@ -187,7 +206,7 @@ private PojoRuntimeIntrospector getIntrospector() { indexedTypeContextProvider.getByExactType( typeIdentifier ); if ( indexedTypeManagerOptional.isPresent() ) { delegate = indexedTypeManagerOptional.get() - .createIndexingPlan( sessionContext, commitStrategy, refreshStrategy ); + .createIndexingPlan( sessionContext, this, commitStrategy, refreshStrategy ); indexedTypeDelegates.put( typeIdentifier, delegate ); return delegate; } @@ -197,22 +216,4 @@ private PojoRuntimeIntrospector getIntrospector() { + " but this entity type is not indexed directly." ); } - - private void updateBecauseOfContained(Object containingEntity) { - // Note this method won't work when using provided identifiers - // Fortunately, all platforms relying on provided identifiers (Infinispan) - // also disable reindexing of other entities on updates, - // so they won't ever call this method. - - PojoRawTypeIdentifier typeIdentifier = getIntrospector().detectEntityType( containingEntity ); - if ( typeIdentifier == null ) { - throw new AssertionFailure( - "Attempt to reindex entity " + containingEntity + " because a contained entity was modified," - + " but this entity type is not indexed directly." - ); - } - PojoIndexedTypeIndexingPlan delegate = getOrCreateIndexedDelegateForContainedUpdate( typeIdentifier ); - delegate.updateBecauseOfContained( containingEntity ); - } - } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkContainedTypeContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkContainedTypeContext.java index 00705b4928b..24c8de2eb95 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkContainedTypeContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkContainedTypeContext.java @@ -13,6 +13,7 @@ */ public interface PojoWorkContainedTypeContext extends PojoWorkTypeContext { - PojoContainedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext); + PojoContainedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext, + PojoIndexingPlanImpl root); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkIndexedTypeContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkIndexedTypeContext.java index bf7852f6453..7aee3c0f65c 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkIndexedTypeContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/work/impl/PojoWorkIndexedTypeContext.java @@ -34,6 +34,7 @@ PojoDocumentContributor toDocumentContributor(PojoWorkSessionContext sessi PojoPathFilter dirtySelfFilter(); PojoIndexedTypeIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContext, + PojoIndexingPlanImpl root, DocumentCommitStrategy commitStrategy, DocumentRefreshStrategy refreshStrategy); PojoTypeIndexer createIndexer(PojoWorkSessionContext sessionContext);