Fixed
Details
Assignee
Fabio Massimo ErcoliFabio Massimo ErcoliReporter
Yoann RodièreYoann RodièreComponents
Sprint
NoneFix versions
Priority
Major
Details
Details
Assignee
Fabio Massimo Ercoli
Fabio Massimo ErcoliReporter
Yoann Rodière
Yoann RodièreComponents
Sprint
None
Fix versions
Priority
Created August 27, 2018 at 2:17 PM
Updated January 31, 2019 at 3:08 PM
Resolved December 10, 2018 at 10:48 AM
@Fabio Massimo Ercoli here is the code I wrote during our discussion.
class MassIndexer { // MassIndexer parameters/attributes boolean optimizeBefore = false; boolean purgeBefore = false; boolean optimizeAfter = false; Collection<Class<?>> rootEntityTypes = null; PojoMappingDelegate delegate = null;// = ... MappingWorkExecutor mappingWorkExecutor = delegate.createMappingWorkExecutor(); public void execute() { if ( purgeBefore ) { mappingWorkExecutor.purge( rootEntityTypes ).join(); } if ( optimizeBefore ) { mappingWorkExecutor.optimize( rootEntityTypes ).join(); } // Index // for each IdentifierConsumerDocumentProducer { List<?> entities = ...; indexingMonitor.entitiesLoaded( entities.size() ); SessionContext sessionContext; SessionWorkExecutor sessionWorkExecutor = delegate.createSessionWorkExecutor( sessionContext ); List<CompletableFuture<?>> completableFutures = new ArrayList<>( ); for ( Object entity : entities ) { CompletableFuture<?> entityIndexedFuture = sessionWorkExecutor.add( entity ); completableFutures.add( entityIndexedFuture ); } indexingMonitor.documentBuilt( entities.size() ); CompletableFuture.allOf( completableFutures.toArray( new CompletableFuture[0] ) ) .join(); indexingMonitor.documentAdded( entities.size() ); } mappingWorkExecutor.flush( rootEntityTypes ).join(); if ( optimizeAfter ) { mappingWorkExecutor.optimize( rootEntityTypes ).join(); } } } interface IndexingMonitor { void addToTotalCount(long increment); // Already taken care of void documentsAdded(long increment); // see above void documentsBuilt(int increment); // see above void entitiesLoaded(int increment); // see above void indexingCompleted(); // Already taken care of } interface PojoMappingDelegate { // ... MappingWorkExecutor createMappingWorkExecutor(); SessionWorkExecutor createSessionWorkExecutor(SessionContext ctx); } interface MappingWorkExecutor { CompletableFuture<?> optimize(Collection<Class<?>> types); CompletableFuture<?> purge(Collection<Class<?>> types); CompletableFuture<?> flush(Collection<Class<?>> types); } interface SessionWorkExecutor { CompletableFuture<?> add(Object id, Object entity); CompletableFuture<?> add(Object entity); } class SessionWorkExecutorImpl implements SessionWorkExecutor { Map<Class<?>, IndexWorkExecutor> indexWorkExecutor; CompletableFuture<?> add(Object id, Object entity) { // 1. retrieve and cache the appropriate IndexWorkExecutor (similarly to what we do with PojoTypeWorkPlans in PojoWorkPlan) // 2. add to index // see PojoWorkPlan.add and PojoTypeWorkPlan.add and IndexedEntityWorkPlan.sendWorkToDelegate, in particular, for implementation } } /// BACKEND SPIs // This interface already exists interface IndexManagerImplementor { // ... CompletableFuture<?> optimize(); CompletableFuture<?> purge(); CompletableFuture<?> flush(); IndexWorkExecutor createWorkExecutor(); } interface IndexWorkExecutor { CompletableFuture<?> add(DocumentReferenceProvider documentReferenceProvider, DocumentContributor<D> documentContributor); }