/*
* 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.backend.impl.lucene.works;
import org.hibernate.search.backend.AddLuceneWork;
import org.hibernate.search.backend.DeleteLuceneWork;
import org.hibernate.search.backend.FlushLuceneWork;
import org.hibernate.search.backend.IndexWorkVisitor;
import org.hibernate.search.backend.OptimizeLuceneWork;
import org.hibernate.search.backend.PurgeAllLuceneWork;
import org.hibernate.search.backend.UpdateLuceneWork;
import org.hibernate.search.backend.spi.DeleteByQueryLuceneWork;
import org.hibernate.search.store.Workspace;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* A {@link IndexWorkVisitor} which applies updates to the underlying Lucene index.
* <p>
* Implementation note: This {@link IndexWorkVisitor} implementation intentionally does not perform the actual logic
* within the individual visit methods themselves but rather returns a delegate class for that purpose. This is to avoid
* the need for the allocation of a parameter object with the required input data, instead a method with the required
* parameters is exposed on said delegate.
*
* @author Sanne Grinovero
* @author Gunnar Morling
*/
public class IndexUpdateVisitor implements IndexWorkVisitor<Void, LuceneWorkExecutor> {
private static final Log log = LoggerFactory.make();
private final AddWorkExecutor addExecutor;
private final DeleteWorkExecutor deleteExecutor;
private final UpdateWorkExecutor updateExecutor;
private final OptimizeWorkExecutor optimizeExecutor;
private final PurgeAllWorkExecutor purgeAllExecutor;
private final FlushWorkExecutor flushExecutor;
private final DeleteByQueryWorkExecutor deleteByQueryExecutor;
public IndexUpdateVisitor(Workspace workspace) {
this.addExecutor = new AddWorkExecutor( workspace );
if ( workspace.areSingleTermDeletesSafe() ) {
this.deleteExecutor = new DeleteExtWorkExecutor( workspace );
this.updateExecutor = new UpdateExtWorkExecutor( workspace, addExecutor );
}
else if ( workspace.isDeleteByTermEnforced() ) {
//TODO Cleanup: with upcoming enhancements of the DocumentBuilder we should be able
//to extrapolate some constant methods in there, and avoid needing so many different visitors.
//The difference with the visitors of the previous block is that these are not coupled to a
//specific type, allowing still dynamic discovery et al
this.deleteExecutor = new ByTermDeleteWorkExecutor( workspace );
this.updateExecutor = new ByTermUpdateWorkExecutor( workspace, addExecutor );
}
else {
this.deleteExecutor = new DeleteWorkExecutor( workspace );
this.updateExecutor = new UpdateWorkExecutor( deleteExecutor, addExecutor );
log.singleTermDeleteDisabled( workspace.getIndexName() );
}
this.purgeAllExecutor = new PurgeAllWorkExecutor( workspace );
this.optimizeExecutor = new OptimizeWorkExecutor( workspace );
this.flushExecutor = new FlushWorkExecutor( workspace );
this.deleteByQueryExecutor = new DeleteByQueryWorkExecutor( workspace );
}
@Override
public LuceneWorkExecutor visitAddWork(AddLuceneWork addLuceneWork, Void p) {
return addExecutor;
}
@Override
public LuceneWorkExecutor visitDeleteWork(DeleteLuceneWork deleteLuceneWork, Void p) {
return deleteExecutor;
}
@Override
public LuceneWorkExecutor visitOptimizeWork(OptimizeLuceneWork optimizeLuceneWork, Void p) {
return optimizeExecutor;
}
@Override
public LuceneWorkExecutor visitPurgeAllWork(PurgeAllLuceneWork purgeAllLuceneWork, Void p) {
return purgeAllExecutor;
}
@Override
public LuceneWorkExecutor visitUpdateWork(UpdateLuceneWork updateLuceneWork, Void p) {
return updateExecutor;
}
@Override
public LuceneWorkExecutor visitFlushWork(FlushLuceneWork flushLuceneWork, Void p) {
return flushExecutor;
}
@Override
public LuceneWorkExecutor visitDeleteByQueryWork(DeleteByQueryLuceneWork deleteByQueryLuceneWork, Void p) {
return deleteByQueryExecutor;
}
}