|
10 | 10 | package org.opensearch.dataprepper.plugins.sink.opensearch; |
11 | 11 |
|
12 | 12 | import com.google.common.annotations.VisibleForTesting; |
13 | | -import com.fasterxml.jackson.databind.JsonNode; |
14 | 13 | import com.fasterxml.jackson.databind.ObjectMapper; |
15 | 14 | import io.micrometer.core.instrument.Counter; |
16 | 15 | import io.micrometer.core.instrument.DistributionSummary; |
|
21 | 20 | import org.opensearch.client.opensearch._types.VersionType; |
22 | 21 | import org.opensearch.client.opensearch.core.BulkRequest; |
23 | 22 | import org.opensearch.client.opensearch.core.bulk.BulkOperation; |
24 | | -import org.opensearch.client.opensearch.core.bulk.CreateOperation; |
25 | | -import org.opensearch.client.opensearch.core.bulk.DeleteOperation; |
26 | | -import org.opensearch.client.opensearch.core.bulk.IndexOperation; |
27 | | -import org.opensearch.client.opensearch.core.bulk.UpdateOperation; |
28 | 23 | import org.opensearch.client.transport.TransportOptions; |
29 | 24 | import org.opensearch.common.unit.ByteSizeUnit; |
30 | 25 | import org.opensearch.dataprepper.aws.api.AwsCredentialsSupplier; |
@@ -140,6 +135,7 @@ public class OpenSearchSink extends AbstractSink<Record<Event>> { |
140 | 135 | private final String action; |
141 | 136 | private final List<ActionConfiguration> actions; |
142 | 137 | private final ScriptManager scriptManager; |
| 138 | + private final BulkOperationFactory bulkOperationFactory; |
143 | 139 | private final String documentRootKey; |
144 | 140 | private String configuredIndexAlias; |
145 | 141 | private final ReentrantLock lock; |
@@ -221,6 +217,7 @@ public OpenSearchSink(final PluginSetting pluginSetting, |
221 | 217 | this.lastFlushTimeMap = new ConcurrentHashMap<>(); |
222 | 218 | this.pluginConfigObservable = pluginConfigObservable; |
223 | 219 | this.objectMapper = new ObjectMapper(); |
| 220 | + this.bulkOperationFactory = new BulkOperationFactory(versionType, scriptManager, objectMapper, isUsingDocumentFilters()); |
224 | 221 | this.queryExecutorService = openSearchSinkConfig.getIndexConfiguration().getQueryTerm() != null ? |
225 | 222 | Executors.newSingleThreadExecutor(BackgroundThreadFactory.defaultExecutorThreadFactory("existing-document-query-manager")) : null; |
226 | 223 |
|
@@ -344,96 +341,6 @@ public boolean isReady() { |
344 | 341 | return initialized; |
345 | 342 | } |
346 | 343 |
|
347 | | - BulkOperation getBulkOperationForAction(final String action, |
348 | | - final SerializedJson document, |
349 | | - final Long version, |
350 | | - final String indexName, |
351 | | - final JsonNode jsonNode) { |
352 | | - BulkOperation bulkOperation; |
353 | | - final Optional<String> docId = document.getDocumentId(); |
354 | | - final Optional<String> routing = document.getRoutingField(); |
355 | | - final Optional<String> pipeline = document.getPipelineField(); |
356 | | - |
357 | | - if (StringUtils.equals(action, OpenSearchBulkActions.CREATE.toString())) { |
358 | | - final CreateOperation.Builder<Object> createOperationBuilder = |
359 | | - new CreateOperation.Builder<>() |
360 | | - .index(indexName) |
361 | | - .document(document); |
362 | | - docId.ifPresent(createOperationBuilder::id); |
363 | | - routing.ifPresent(createOperationBuilder::routing); |
364 | | - pipeline.ifPresent(createOperationBuilder::pipeline); |
365 | | - |
366 | | - bulkOperation = new BulkOperation.Builder() |
367 | | - .create(createOperationBuilder.build()) |
368 | | - .build(); |
369 | | - return bulkOperation; |
370 | | - } |
371 | | - if (StringUtils.equals(action, OpenSearchBulkActions.UPDATE.toString()) || |
372 | | - StringUtils.equals(action, OpenSearchBulkActions.UPSERT.toString())) { |
373 | | - |
374 | | - JsonNode filteredJsonNode = jsonNode; |
375 | | - try { |
376 | | - if (isUsingDocumentFilters()) { |
377 | | - filteredJsonNode = objectMapper.reader().readTree(document.getSerializedJson()); |
378 | | - } |
379 | | - } catch (final IOException e) { |
380 | | - throw new RuntimeException( |
381 | | - String.format("An exception occurred while deserializing a document for the %s action: %s", action, e.getMessage())); |
382 | | - } |
383 | | - |
384 | | - |
385 | | - final boolean isUpsert = StringUtils.equals(action.toLowerCase(), OpenSearchBulkActions.UPSERT.toString()); |
386 | | - final UpdateOperation.Builder<Object> updateOperationBuilder = new UpdateOperation.Builder<>() |
387 | | - .index(indexName) |
388 | | - .versionType(versionType) |
389 | | - .version(version); |
390 | | - |
391 | | - if (scriptManager.isScriptEnabled()) { |
392 | | - updateOperationBuilder.script(scriptManager.buildScript(jsonNode, document.getResolvedScriptParameters().orElse(null))); |
393 | | - updateOperationBuilder.upsert(filteredJsonNode); |
394 | | - updateOperationBuilder.scriptedUpsert(true); |
395 | | - } else if (isUpsert) { |
396 | | - updateOperationBuilder.document(filteredJsonNode).upsert(filteredJsonNode); |
397 | | - } else { |
398 | | - updateOperationBuilder.document(filteredJsonNode); |
399 | | - } |
400 | | - |
401 | | - docId.ifPresent(updateOperationBuilder::id); |
402 | | - routing.ifPresent(updateOperationBuilder::routing); |
403 | | - bulkOperation = new BulkOperation.Builder() |
404 | | - .update(updateOperationBuilder.build()) |
405 | | - .build(); |
406 | | - return bulkOperation; |
407 | | - } |
408 | | - if (StringUtils.equals(action, OpenSearchBulkActions.DELETE.toString())) { |
409 | | - final DeleteOperation.Builder deleteOperationBuilder = |
410 | | - new DeleteOperation.Builder().index(indexName); |
411 | | - docId.ifPresent(deleteOperationBuilder::id); |
412 | | - routing.ifPresent(deleteOperationBuilder::routing); |
413 | | - bulkOperation = new BulkOperation.Builder() |
414 | | - .delete(deleteOperationBuilder |
415 | | - .versionType(versionType) |
416 | | - .version(version) |
417 | | - .build()) |
418 | | - .build(); |
419 | | - return bulkOperation; |
420 | | - } |
421 | | - // Default to "index" |
422 | | - final IndexOperation.Builder<Object> indexOperationBuilder = |
423 | | - new IndexOperation.Builder<>() |
424 | | - .index(indexName) |
425 | | - .document(document) |
426 | | - .version(version) |
427 | | - .versionType(versionType); |
428 | | - docId.ifPresent(indexOperationBuilder::id); |
429 | | - routing.ifPresent(indexOperationBuilder::routing); |
430 | | - pipeline.ifPresent(indexOperationBuilder::pipeline); |
431 | | - bulkOperation = new BulkOperation.Builder() |
432 | | - .index(indexOperationBuilder.build()) |
433 | | - .build(); |
434 | | - return bulkOperation; |
435 | | - } |
436 | | - |
437 | 344 | @Override |
438 | 345 | public void doOutput(final Collection<Record<Event>> records) { |
439 | 346 | final long threadId = Thread.currentThread().getId(); |
@@ -541,7 +448,7 @@ public void doOutput(final Collection<Record<Event>> records) { |
541 | 448 | BulkOperation bulkOperation; |
542 | 449 |
|
543 | 450 | try { |
544 | | - bulkOperation = getBulkOperationForAction(eventAction, document, version, indexName, event.getJsonNode()); |
| 451 | + bulkOperation = bulkOperationFactory.create(eventAction, document, version, indexName, event.getJsonNode()); |
545 | 452 | } catch (final Exception e) { |
546 | 453 | LOG.error("An exception occurred while constructing the bulk operation for a document: ", e); |
547 | 454 | logFailureForDlqObjects(List.of(createDlqObjectFromEvent(event, indexName, e.getMessage())), e); |
|
0 commit comments