}
}
@Override
public void mutate(Map<String, Map<String, IndexMutation>> mutations, KeyInformation.IndexRetriever informations, TransactionHandle tx) throws StorageException {
BulkRequestBuilder brb = client.prepareBulk();
int bulkrequests = 0;
try {
for (Map.Entry<String, Map<String, IndexMutation>> stores : mutations.entrySet()) {
String storename = stores.getKey();
for (Map.Entry<String, IndexMutation> entry : stores.getValue().entrySet()) {
String docid = entry.getKey();
IndexMutation mutation = entry.getValue();
Preconditions.checkArgument(!(mutation.isNew() && mutation.isDeleted()));
Preconditions.checkArgument(!mutation.isNew() || !mutation.hasDeletions());
Preconditions.checkArgument(!mutation.isDeleted() || !mutation.hasAdditions());
//Deletions first
if (mutation.hasDeletions()) {
if (mutation.isDeleted()) {
log.trace("Deleting entire document {}", docid);
brb.add(new DeleteRequest(indexName, storename, docid));
bulkrequests++;
} else {
Set<String> deletions = Sets.newHashSet(mutation.getDeletions());
if (mutation.hasAdditions()) {
for (IndexEntry ie : mutation.getAdditions()) {
deletions.remove(ie.key);
}
}
if (!deletions.isEmpty()) {
//TODO make part of batch mutation if/when possible
StringBuilder script = new StringBuilder();
for (String key : deletions) {
script.append("ctx._source.remove(\"" + key + "\"); ");
}
log.trace("Deleting individual fields [{}] for document {}", deletions, docid);
client.prepareUpdate(indexName, storename, docid).setScript(script.toString()).execute().actionGet();
}
}
}
if (mutation.hasAdditions()) {
if (mutation.isNew()) { //Index
log.trace("Adding entire document {}", docid);
brb.add(new IndexRequest(indexName, storename, docid).source(getContent(mutation.getAdditions())));
bulkrequests++;
} else { //Update: TODO make part of batch mutation if/when possible
boolean needUpsert = !mutation.hasDeletions();
XContentBuilder builder = getContent(mutation.getAdditions());
UpdateRequestBuilder update = client.prepareUpdate(indexName, storename, docid).setDoc(builder);
if (needUpsert) update.setUpsert(builder);
log.trace("Updating document {} with upsert {}", docid, needUpsert);
update.execute().actionGet();
}
}
}
}
if (bulkrequests > 0) brb.execute().actionGet();
} catch (Exception e) {
throw convert(e);
}
}