package com.silverforge.elasticsearchrawclient.elasticFacade.operations; import android.text.TextUtils; import com.silverforge.elasticsearchrawclient.R; import com.silverforge.elasticsearchrawclient.elasticFacade.OperationType; import com.silverforge.elasticsearchrawclient.elasticFacade.mappers.BulkResultParser; import com.silverforge.elasticsearchrawclient.elasticFacade.mappers.ElasticClientMapper; import com.silverforge.elasticsearchrawclient.model.BulkActionResult; import com.silverforge.elasticsearchrawclient.model.BulkResultItem; import com.silverforge.elasticsearchrawclient.model.BulkTuple; import com.silverforge.elasticsearchrawclient.model.ElasticSettings; import com.silverforge.elasticsearchrawclient.utils.StreamUtils; import com.silverforge.elasticsearchrawclient.utils.StringUtils; import com.silverforge.webconnector.definitions.Connectable; import com.silverforge.webconnector.model.InvokeStringResult; import java.util.ArrayList; import java.util.List; public class BulkOperations extends Operations { public BulkOperations(Connectable connector, ElasticSettings elasticSettings) { super(connector, elasticSettings); } public List<BulkActionResult> bulk(List<BulkTuple> bulkItems) { String createTemplate = StreamUtils.getRawContent(context, R.raw.create_action_template); String indexTemplate = StreamUtils.getRawContent(context, R.raw.index_action_template); String updateTemplate = StreamUtils.getRawContent(context, R.raw.update_action_template); String deleteTemplate = StreamUtils.getRawContent(context, R.raw.delete_action_template); StringBuilder bodyBuilder = new StringBuilder(); for (BulkTuple bulkItem : bulkItems) { prepareRequestBody(createTemplate, indexTemplate, updateTemplate, deleteTemplate, bodyBuilder, bulkItem); } // Execute bulk actions String bulkRequestBody = bodyBuilder.append(StringUtils.LINE_SEPARATOR).toString(); InvokeStringResult bulkResult = connector.post("/_bulk", bulkRequestBody); return prepareBulkActionResults(bulkItems, bulkResult); } private ArrayList<BulkActionResult> prepareBulkActionResults(List<BulkTuple> bulkItems, InvokeStringResult bulkResult) { List<BulkResultItem> bulkResultItemList = BulkResultParser.getResults(bulkResult.getResult()); ArrayList<BulkActionResult> retValue = new ArrayList<>(); for (int i = 0; i < bulkItems.size(); i++) { BulkTuple tuple = bulkItems.get(i); BulkResultItem resultItem = bulkResultItemList.get(i); BulkActionResult bulkActionResult = new BulkActionResult(resultItem.getOperation(), resultItem.getIndexName(), resultItem.getTypeName(), resultItem.getId(), resultItem.getVersion(), resultItem.getStatus(), resultItem.getFound(), tuple); retValue.add(bulkActionResult); } return retValue; } private void prepareRequestBody(String createTemplate, String indexTemplate, String updateTemplate, String deleteTemplate, StringBuilder bodyBuilder, BulkTuple bulkItem) { String indexName = ensureIndexName(bulkItem); String typeName = ensureTypeName(bulkItem); String documentId = bulkItem.getId(); String bulkItemEntityJson = ""; OperationType operationType = bulkItem.getOperationType(); switch (operationType) { case CREATE: bulkItemEntityJson = ElasticClientMapper.mapToJson(bulkItem.getEntity()); operationType.prepareTemplateForAction(createTemplate, bodyBuilder, indexName, typeName, documentId, bulkItemEntityJson); break; case DELETE: operationType.prepareTemplateForAction(deleteTemplate, bodyBuilder, indexName, typeName, documentId, bulkItemEntityJson); break; case UPDATE: bulkItemEntityJson = ElasticClientMapper.mapToJson(bulkItem.getEntity()); operationType.prepareTemplateForAction(updateTemplate, bodyBuilder, indexName, typeName, documentId, bulkItemEntityJson); break; case INDEX: bulkItemEntityJson = ElasticClientMapper.mapToJson(bulkItem.getEntity()); operationType.prepareTemplateForAction(indexTemplate, bodyBuilder, indexName, typeName, documentId, bulkItemEntityJson); break; } } private String ensureTypeName(BulkTuple bulkItem) { String typeName = bulkItem.getTypeName(); if (TextUtils.isEmpty(typeName)) { String[] types = elasticSettings.getTypes(); if (types != null && types.length > 0) typeName = types[0]; } return typeName; } private String ensureIndexName(BulkTuple bulkItem) { String indexName = bulkItem.getIndexName(); if (TextUtils.isEmpty(indexName)) { String[] indices = elasticSettings.getIndices(); if (indices != null && indices.length > 0) indexName = indices[0]; } return indexName; } }