* @return Returns an OperationBatch instance which is a listener to the last executed bulk operation. Returns NULL
* if there were no operations done on the method call.
*/
public OperationBatch executeRequests(Session session) {
boolean isNewSession = null == session;
PersistenceContextInterceptor persistenceInterceptor = null;
Map<IndexEntityKey, Object> toIndex = new LinkedHashMap<IndexEntityKey, Object>();
Set<IndexEntityKey> toDelete = new HashSet<IndexEntityKey>();
cleanOperationBatchList();
// Copy existing queue to ensure we are interfering with incoming requests.
synchronized (this) {
toIndex.putAll(indexRequests);
toDelete.addAll(deleteRequests);
indexRequests.clear();
deleteRequests.clear();
}
// If there are domain instances that are both in the index requests & delete requests list,
// they are directly deleted.
toIndex.keySet().removeAll(toDelete);
// If there is nothing in the queues, just stop here
if (toIndex.isEmpty() && toDelete.isEmpty()) {
return null;
}
BulkRequestBuilder bulkRequestBuilder = elasticSearchClient.prepareBulk();
//bulkRequestBuilder.setRefresh(true);
// Execute index requests
for (Map.Entry<IndexEntityKey, Object> entry : toIndex.entrySet()) {
SearchableClassMapping scm = elasticSearchContextHolder.getMappingContextByType(entry.getKey().getClazz());
if (isNewSession) {
persistenceInterceptor = createInterceptor();
session = SessionFactoryUtils.getSession(sessionFactory, true);
}
try {
Object entity = entry.getValue();
// If this not a transient instance, reattach it to the session
if (session.contains(entity)) {
session.lock(entity, LockMode.NONE);
LOG.debug("Reattached entity to session");
}
XContentBuilder json = toJSON(entity);
bulkRequestBuilder.add(
elasticSearchClient.prepareIndex()
.setIndex(scm.getIndexName())
.setType(scm.getElasticTypeName())
.setId(entry.getKey().getId()) // TODO : Composite key ?
.setSource(json)
);
if (LOG.isDebugEnabled()) {
try {
LOG.debug("Indexing " + entry.getKey().getClazz() + "(index:" + scm.getIndexName() + ",type:" + scm.getElasticTypeName() +
") of id " + entry.getKey().getId() + " and source " + json.string());
} catch (IOException e) {
}
}
} finally {
if (null != persistenceInterceptor) {
persistenceInterceptor.destroy();
}
}
}
// Execute delete requests