class MassIndexer {
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();
}
{
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);
void documentsAdded(long increment);
void documentsBuilt(int increment);
void entitiesLoaded(int increment);
void indexingCompleted(); }
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) {
}
}
interface IndexManagerImplementor {
CompletableFuture<?> optimize();
CompletableFuture<?> purge();
CompletableFuture<?> flush();
IndexWorkExecutor createWorkExecutor();
}
interface IndexWorkExecutor {
CompletableFuture<?> add(DocumentReferenceProvider documentReferenceProvider, DocumentContributor<D> documentContributor);
}