package org.infinispan.query.indexmanager;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.indexes.spi.IndexManager;
import org.infinispan.query.backend.KeyTransformationHandler;
import org.infinispan.query.impl.ModuleCommandIds;
import org.infinispan.util.ByteString;
import org.infinispan.util.concurrent.CompletableFutures;
/**
* Custom RPC command containing an index update request for the
* Master IndexManager of a specific cache & index.
*
* @author Sanne Grinovero
*/
public class IndexUpdateCommand extends AbstractUpdateCommand {
public static final byte COMMAND_ID = ModuleCommandIds.UPDATE_INDEX;
public IndexUpdateCommand(ByteString cacheName) {
super(cacheName);
}
@Override
public CompletableFuture<Object> invokeAsync() throws Throwable {
if (queryInterceptor.isStopping()) {
throw log.cacheIsStoppingNoCommandAllowed(cacheName.toString());
}
IndexManager indexManager = searchFactory.getIndexManager(indexName);
if (indexManager == null) {
throw new SearchException("Unknown index referenced : " + indexName);
}
List<LuceneWork> luceneWorks = indexManager.getSerializer().toLuceneWorks(this.serializedModel);
KeyTransformationHandler handler = queryInterceptor.getKeyTransformationHandler();
List<LuceneWork> workToApply = LuceneWorkConverter.transformKeysToString(luceneWorks, handler);//idInString field is not serialized, we need to extract it from the key object
indexManager.performOperations(workToApply, null);
return CompletableFutures.completedNull(); //Return value to be ignored
}
@Override
public byte getCommandId() {
return COMMAND_ID;
}
}