39
39
import org .elasticsearch .index .query .QueryBuilder ;
40
40
import org .elasticsearch .index .query .QueryBuilders ;
41
41
import org .elasticsearch .search .SearchHit ;
42
- import org .elasticsearch .search .facet .Facet ;
43
42
import org .elasticsearch .search .facet .FacetBuilder ;
44
43
import org .elasticsearch .search .highlight .HighlightBuilder ;
45
44
import org .elasticsearch .search .sort .SortOrder ;
46
45
import org .springframework .data .domain .Page ;
47
- import org .springframework .data .domain .Pageable ;
48
46
import org .springframework .data .domain .Sort ;
49
47
import org .springframework .data .elasticsearch .ElasticsearchException ;
50
48
import org .springframework .data .elasticsearch .annotations .Document ;
51
49
import org .springframework .data .elasticsearch .core .convert .ElasticsearchConverter ;
52
50
import org .springframework .data .elasticsearch .core .convert .MappingElasticsearchConverter ;
53
- import org .springframework .data .elasticsearch .core .facet .FacetMapper ;
54
51
import org .springframework .data .elasticsearch .core .facet .FacetRequest ;
55
- import org .springframework .data .elasticsearch .core .facet .FacetResult ;
56
52
import org .springframework .data .elasticsearch .core .mapping .ElasticsearchPersistentEntity ;
57
53
import org .springframework .data .elasticsearch .core .mapping .SimpleElasticsearchMappingContext ;
58
54
import org .springframework .data .elasticsearch .core .query .*;
@@ -86,25 +82,29 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
86
82
87
83
private Client client ;
88
84
private ElasticsearchConverter elasticsearchConverter ;
89
- private EntityMapper entityMapper ;
85
+ private ResultsMapper resultsMapper ;
90
86
91
87
public ElasticsearchTemplate (Client client ) {
92
88
this (client , null , null );
93
89
}
94
90
95
91
public ElasticsearchTemplate (Client client , EntityMapper entityMapper ) {
96
- this (client , null , entityMapper );
92
+ this (client , null , new DefaultResultMapper (entityMapper ));
93
+ }
94
+
95
+ public ElasticsearchTemplate (Client client , ResultsMapper resultsMapper ) {
96
+ this (client , null , resultsMapper );
97
97
}
98
98
99
99
public ElasticsearchTemplate (Client client , ElasticsearchConverter elasticsearchConverter ) {
100
100
this (client , elasticsearchConverter , null );
101
101
}
102
102
103
- public ElasticsearchTemplate (Client client , ElasticsearchConverter elasticsearchConverter , EntityMapper entityMapper ) {
103
+ public ElasticsearchTemplate (Client client , ElasticsearchConverter elasticsearchConverter , ResultsMapper resultsMapper ) {
104
104
this .client = client ;
105
- this .entityMapper = (entityMapper == null ) ? new DefaultEntityMapper () : entityMapper ;
106
105
this .elasticsearchConverter = (elasticsearchConverter == null ) ? new MappingElasticsearchConverter (
107
106
new SimpleElasticsearchMappingContext ()) : elasticsearchConverter ;
107
+ this .resultsMapper = (resultsMapper == null ) ? new DefaultResultMapper () : resultsMapper ;
108
108
}
109
109
110
110
@ Override
@@ -134,11 +134,16 @@ public ElasticsearchConverter getElasticsearchConverter() {
134
134
135
135
@ Override
136
136
public <T > T queryForObject (GetQuery query , Class <T > clazz ) {
137
+ return queryForObject (query , clazz , resultsMapper );
138
+ }
139
+
140
+ @ Override
141
+ public <T > T queryForObject (GetQuery query , Class <T > clazz , GetResultMapper mapper ) {
137
142
ElasticsearchPersistentEntity <T > persistentEntity = getPersistentEntityFor (clazz );
138
143
GetResponse response = client
139
144
.prepareGet (persistentEntity .getIndexName (), persistentEntity .getIndexType (), query .getId ()).execute ()
140
145
.actionGet ();
141
- return mapResult (response . getSourceAsString () , clazz );
146
+ return mapper . mapResult (response , clazz );
142
147
}
143
148
144
149
@ Override
@@ -157,14 +162,13 @@ public <T> T queryForObject(StringQuery query, Class<T> clazz) {
157
162
158
163
@ Override
159
164
public <T > FacetedPage <T > queryForPage (SearchQuery query , Class <T > clazz ) {
160
- SearchResponse response = doSearch (prepareSearch (query , clazz ), query );
161
- return mapResults (response , clazz , query .getPageable ());
165
+ return queryForPage (query , clazz , resultsMapper );
162
166
}
163
167
164
168
@ Override
165
- public <T > FacetedPage <T > queryForPage (SearchQuery query , ResultsMapper <T > resultsMapper ) {
166
- SearchResponse response = doSearch (prepareSearch (query ), query );
167
- return resultsMapper .mapResults (response );
169
+ public <T > FacetedPage <T > queryForPage (SearchQuery query , Class <T > clazz , SearchResultMapper mapper ) {
170
+ SearchResponse response = doSearch (prepareSearch (query , clazz ), query );
171
+ return mapper .mapResults (response , clazz , query . getPageable () );
168
172
}
169
173
170
174
@ Override
@@ -209,13 +213,18 @@ public <T> Page<T> queryForPage(CriteriaQuery criteriaQuery, Class<T> clazz) {
209
213
210
214
SearchResponse response = searchRequestBuilder
211
215
.execute ().actionGet ();
212
- return mapResults (response , clazz , criteriaQuery .getPageable ());
216
+ return resultsMapper . mapResults (response , clazz , criteriaQuery .getPageable ());
213
217
}
214
218
215
219
@ Override
216
220
public <T > FacetedPage <T > queryForPage (StringQuery query , Class <T > clazz ) {
221
+ return queryForPage (query , clazz , resultsMapper );
222
+ }
223
+
224
+ @ Override
225
+ public <T > FacetedPage <T > queryForPage (StringQuery query , Class <T > clazz , SearchResultMapper mapper ) {
217
226
SearchResponse response = prepareSearch (query , clazz ).setQuery (query .getSource ()).execute ().actionGet ();
218
- return mapResults (response , clazz , query .getPageable ());
227
+ return mapper . mapResults (response , clazz , query .getPageable ());
219
228
}
220
229
221
230
@ Override
@@ -349,10 +358,10 @@ public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noF
349
358
}
350
359
351
360
@ Override
352
- public <T > Page <T > scroll (String scrollId , long scrollTimeInMillis , ResultsMapper <T > resultsMapper ) {
361
+ public <T > Page <T > scroll (String scrollId , long scrollTimeInMillis , Class <T > clazz ) {
353
362
SearchResponse response = client .prepareSearchScroll (scrollId )
354
363
.setScroll (TimeValue .timeValueMillis (scrollTimeInMillis )).execute ().actionGet ();
355
- return resultsMapper .mapResults (response );
364
+ return resultsMapper .mapResults (response , clazz , null );
356
365
}
357
366
358
367
@ Override
@@ -415,7 +424,7 @@ public <T> Page<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz) {
415
424
}
416
425
417
426
SearchResponse response = requestBuilder .execute ().actionGet ();
418
- return mapResults (response , clazz , query .getPageable ());
427
+ return resultsMapper . mapResults (response , clazz , query .getPageable ());
419
428
}
420
429
421
430
private SearchResponse doSearch (SearchRequestBuilder searchRequest , SearchQuery searchQuery ) {
@@ -513,7 +522,7 @@ private IndexRequestBuilder prepareIndex(IndexQuery query) {
513
522
: query .getType ();
514
523
515
524
IndexRequestBuilder indexRequestBuilder = client .prepareIndex (indexName , type , query .getId ()).setSource (
516
- entityMapper .mapToString (query .getObject ()));
525
+ resultsMapper . getEntityMapper () .mapToString (query .getObject ()));
517
526
518
527
if (query .getVersion () != null ) {
519
528
indexRequestBuilder .setVersion (query .getVersion ());
@@ -549,33 +558,6 @@ private String[] retrieveTypeFromPersistentEntity(Class clazz) {
549
558
return new String []{getPersistentEntityFor (clazz ).getIndexType ()};
550
559
}
551
560
552
- private <T > FacetedPage <T > mapResults (SearchResponse response , final Class <T > elementType , final Pageable pageable ) {
553
- ResultsMapper <T > resultsMapper = new ResultsMapper <T >() {
554
- @ Override
555
- public FacetedPage <T > mapResults (SearchResponse response ) {
556
- long totalHits = response .getHits ().totalHits ();
557
- List <T > results = new ArrayList <T >();
558
- for (SearchHit hit : response .getHits ()) {
559
- if (hit != null ) {
560
- results .add (mapResult (hit .sourceAsString (), elementType ));
561
- }
562
- }
563
- List <FacetResult > facets = new ArrayList <FacetResult >();
564
- if (response .getFacets () != null ) {
565
- for (Facet facet : response .getFacets ()) {
566
- FacetResult facetResult = FacetMapper .parse (facet );
567
- if (facetResult != null ) {
568
- facets .add (facetResult );
569
- }
570
- }
571
- }
572
-
573
- return new FacetedPageImpl <T >(results , pageable , totalHits , facets );
574
- }
575
- };
576
- return resultsMapper .mapResults (response );
577
- }
578
-
579
561
private List <String > extractIds (SearchResponse response ) {
580
562
List <String > ids = new ArrayList <String >();
581
563
for (SearchHit hit : response .getHits ()) {
@@ -586,24 +568,13 @@ private List<String> extractIds(SearchResponse response) {
586
568
return ids ;
587
569
}
588
570
589
- private <T > T mapResult (String source , Class <T > clazz ) {
590
- if (isBlank (source )) {
591
- return null ;
592
- }
593
- try {
594
- return entityMapper .mapToObject (source , clazz );
595
- } catch (IOException e ) {
596
- throw new ElasticsearchException ("failed to map source [ " + source + "] to class " + clazz .getSimpleName (), e );
597
- }
598
- }
599
-
600
571
private static String [] toArray (List <String > values ) {
601
572
String [] valuesAsArray = new String [values .size ()];
602
573
return values .toArray (valuesAsArray );
603
574
604
575
}
605
576
606
- protected EntityMapper getEntityMapper () {
607
- return entityMapper ;
577
+ protected ResultsMapper getResultsMapper () {
578
+ return resultsMapper ;
608
579
}
609
580
}
0 commit comments