15
15
*/
16
16
package org .springframework .data .elasticsearch .core ;
17
17
18
- import static org .apache .commons .collections .CollectionUtils .isNotEmpty ;
19
- import static org .apache .commons .lang .StringUtils .*;
20
- import static org .elasticsearch .action .search .SearchType .*;
21
- import static org .elasticsearch .client .Requests .*;
22
- import static org .elasticsearch .cluster .metadata .AliasAction .Type .*;
23
- import static org .elasticsearch .common .collect .Sets .*;
24
- import static org .elasticsearch .index .VersionType .*;
25
- import static org .springframework .data .elasticsearch .core .MappingBuilder .*;
26
-
27
- import java .io .BufferedReader ;
28
- import java .io .IOException ;
29
- import java .io .InputStreamReader ;
30
- import java .lang .reflect .Method ;
31
- import java .util .*;
32
-
33
18
import org .apache .commons .collections .CollectionUtils ;
34
19
import org .elasticsearch .action .ListenableActionFuture ;
35
20
import org .elasticsearch .action .admin .cluster .state .ClusterStateRequest ;
95
80
import org .springframework .data .mapping .PersistentProperty ;
96
81
import org .springframework .util .Assert ;
97
82
83
+ import java .io .BufferedReader ;
84
+ import java .io .IOException ;
85
+ import java .io .InputStreamReader ;
86
+ import java .lang .reflect .Method ;
87
+ import java .util .*;
88
+
89
+ import static org .apache .commons .collections .CollectionUtils .isNotEmpty ;
90
+ import static org .apache .commons .lang .StringUtils .isBlank ;
91
+ import static org .apache .commons .lang .StringUtils .isNotBlank ;
92
+ import static org .elasticsearch .action .search .SearchType .SCAN ;
93
+ import static org .elasticsearch .client .Requests .indicesExistsRequest ;
94
+ import static org .elasticsearch .client .Requests .refreshRequest ;
95
+ import static org .elasticsearch .cluster .metadata .AliasAction .Type .ADD ;
96
+ import static org .elasticsearch .common .collect .Sets .newHashSet ;
97
+ import static org .elasticsearch .index .VersionType .EXTERNAL ;
98
+ import static org .springframework .data .elasticsearch .core .MappingBuilder .buildMapping ;
99
+
98
100
/**
99
101
* ElasticsearchTemplate
100
102
*
@@ -447,23 +449,35 @@ public String index(IndexQuery query) {
447
449
448
450
@ Override
449
451
public UpdateResponse update (UpdateQuery query ) {
452
+ return this .prepareUpdate (query ).execute ().actionGet ();
453
+ }
454
+
455
+ private UpdateRequestBuilder prepareUpdate (UpdateQuery query ) {
450
456
String indexName = isNotBlank (query .getIndexName ()) ? query .getIndexName () : getPersistentEntityFor (query .getClazz ()).getIndexName ();
451
457
String type = isNotBlank (query .getType ()) ? query .getType () : getPersistentEntityFor (query .getClazz ()).getIndexType ();
452
458
Assert .notNull (indexName , "No index defined for Query" );
453
459
Assert .notNull (type , "No type define for Query" );
454
460
Assert .notNull (query .getId (), "No Id define for Query" );
455
461
Assert .notNull (query .getUpdateRequest (), "No IndexRequest define for Query" );
456
462
UpdateRequestBuilder updateRequestBuilder = client .prepareUpdate (indexName , type , query .getId ());
457
- if (query .DoUpsert ()) {
458
- updateRequestBuilder .setDocAsUpsert (true )
459
- .setDoc (query .getUpdateRequest ().doc ())
463
+
464
+ if (query .getUpdateRequest ().script () == null ) {
465
+ // doc
466
+ if (query .DoUpsert ()) {
467
+ updateRequestBuilder .setDocAsUpsert (true )
468
+ .setDoc (query .getUpdateRequest ().doc ());
469
+ } else {
470
+ updateRequestBuilder .setDoc (query .getUpdateRequest ().doc ());
471
+ }
472
+ } else {
473
+ // or script
474
+ updateRequestBuilder
460
475
.setScript (query .getUpdateRequest ().script (), query .getUpdateRequest ().scriptType ())
461
476
.setScriptParams (query .getUpdateRequest ().scriptParams ())
462
477
.setScriptLang (query .getUpdateRequest ().scriptLang ());
463
- } else {
464
- updateRequestBuilder .setDoc (query .getUpdateRequest ().doc ());
465
478
}
466
- return updateRequestBuilder .execute ().actionGet ();
479
+
480
+ return updateRequestBuilder ;
467
481
}
468
482
469
483
@ Override
@@ -486,6 +500,26 @@ public void bulkIndex(List<IndexQuery> queries) {
486
500
}
487
501
}
488
502
503
+ @ Override
504
+ public void bulkUpdate (List <UpdateQuery > queries ) {
505
+ BulkRequestBuilder bulkRequest = client .prepareBulk ();
506
+ for (UpdateQuery query : queries ) {
507
+ bulkRequest .add (prepareUpdate (query ));
508
+ }
509
+ BulkResponse bulkResponse = bulkRequest .execute ().actionGet ();
510
+ if (bulkResponse .hasFailures ()) {
511
+ Map <String , String > failedDocuments = new HashMap <String , String >();
512
+ for (BulkItemResponse item : bulkResponse .getItems ()) {
513
+ if (item .isFailed ())
514
+ failedDocuments .put (item .getId (), item .getFailureMessage ());
515
+ }
516
+ throw new ElasticsearchException (
517
+ "Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages ["
518
+ + failedDocuments + "]" , failedDocuments
519
+ );
520
+ }
521
+ }
522
+
489
523
@ Override
490
524
public <T > boolean indexExists (Class <T > clazz ) {
491
525
return indexExists (getPersistentEntityFor (clazz ).getIndexName ());
0 commit comments