6262import org .springframework .data .elasticsearch .core .document .Document ;
6363import org .springframework .data .elasticsearch .core .document .DocumentAdapters ;
6464import org .springframework .data .elasticsearch .core .document .SearchDocument ;
65+ import org .springframework .data .elasticsearch .core .document .SearchDocumentResponse ;
6566import org .springframework .data .elasticsearch .core .event .ReactiveAfterConvertCallback ;
6667import org .springframework .data .elasticsearch .core .event .ReactiveAfterSaveCallback ;
6768import org .springframework .data .elasticsearch .core .event .ReactiveBeforeConvertCallback ;
@@ -296,7 +297,7 @@ public <T> Flux<T> multiGet(Query query, Class<T> clazz, IndexCoordinates index)
296297
297298 MultiGetRequest request = requestFactory .multiGetRequest (query , clazz , index );
298299 return Flux .from (execute (client -> client .multiGet (request ))) //
299- .concatMap (result -> callback .doWith (DocumentAdapters .from (result )));
300+ .concatMap (result -> callback .toEntity (DocumentAdapters .from (result )));
300301 }
301302
302303 @ Override
@@ -444,7 +445,7 @@ public <T> Mono<T> get(String id, Class<T> entityType, IndexCoordinates index) {
444445
445446 DocumentCallback <T > callback = new ReadDocumentCallback <>(converter , entityType , index );
446447
447- return doGet (id , index ).flatMap (it -> callback .doWith (DocumentAdapters .from (it )));
448+ return doGet (id , index ).flatMap (it -> callback .toEntity (DocumentAdapters .from (it )));
448449 }
449450
450451 private Mono <GetResult > doGet (String id , IndexCoordinates index ) {
@@ -656,14 +657,34 @@ protected <R extends WriteRequest<R>> R prepareWriteRequest(R request) {
656657 @ Override
657658 public <T > Flux <SearchHit <T >> search (Query query , Class <?> entityType , Class <T > resultType , IndexCoordinates index ) {
658659 SearchDocumentCallback <T > callback = new ReadSearchDocumentCallback <>(resultType , index );
659- return doFind (query , entityType , index ).concatMap (callback ::doWith );
660+ return doFind (query , entityType , index ).concatMap (callback ::toSearchHit );
660661 }
661662
662663 @ Override
663664 public <T > Flux <SearchHit <T >> search (Query query , Class <?> entityType , Class <T > returnType ) {
664665 return search (query , entityType , returnType , getIndexCoordinatesFor (entityType ));
665666 }
666667
668+ @ Override
669+ public <T > Mono <SearchPage <T >> searchForPage (Query query , Class <?> entityType , Class <T > resultType ) {
670+ return searchForPage (query , entityType , resultType , getIndexCoordinatesFor (entityType ));
671+ }
672+
673+ @ Override
674+ public <T > Mono <SearchPage <T >> searchForPage (Query query , Class <?> entityType , Class <T > resultType ,
675+ IndexCoordinates index ) {
676+
677+ SearchDocumentCallback <T > callback = new ReadSearchDocumentCallback <>(resultType , index );
678+
679+ return doFindForResponse (query , entityType , index ) //
680+ .flatMap (searchDocumentResponse -> Flux .fromIterable (searchDocumentResponse .getSearchDocuments ()) //
681+ .flatMap (callback ::toEntity ) //
682+ .collectList () //
683+ .map (entities -> SearchHitMapping .mappingFor (resultType , converter ) //
684+ .mapHits (searchDocumentResponse , entities ))) //
685+ .map (searchHits -> SearchHitSupport .searchPageFor (searchHits , query .getPageable ()));
686+ }
687+
667688 private Flux <SearchDocument > doFind (Query query , Class <?> clazz , IndexCoordinates index ) {
668689
669690 return Flux .defer (() -> {
@@ -678,6 +699,15 @@ private Flux<SearchDocument> doFind(Query query, Class<?> clazz, IndexCoordinate
678699 });
679700 }
680701
702+ private Mono <SearchDocumentResponse > doFindForResponse (Query query , Class <?> clazz , IndexCoordinates index ) {
703+
704+ return Mono .defer (() -> {
705+ SearchRequest request = requestFactory .searchRequest (query , clazz , index );
706+ request = prepareSearchRequest (request );
707+ return doFindForResponse (request );
708+ });
709+ }
710+
681711 @ Override
682712 public Flux <Aggregation > aggregate (Query query , Class <?> entityType ) {
683713 return aggregate (query , entityType , getIndexCoordinatesFor (entityType ));
@@ -748,6 +778,21 @@ protected Flux<SearchDocument> doFind(SearchRequest request) {
748778 .onErrorResume (NoSuchIndexException .class , it -> Mono .empty ());
749779 }
750780
781+ /**
782+ * Customization hook on the actual execution result {@link Mono}. <br />
783+ *
784+ * @param request the already prepared {@link SearchRequest} ready to be executed.
785+ * @return a {@link Mono} emitting the result of the operation converted to s {@link SearchDocumentResponse}.
786+ */
787+ protected Mono <SearchDocumentResponse > doFindForResponse (SearchRequest request ) {
788+
789+ if (QUERY_LOGGER .isDebugEnabled ()) {
790+ QUERY_LOGGER .debug ("Executing doFindForResponse: {}" , request );
791+ }
792+
793+ return Mono .from (execute (client1 -> client1 .searchForResponse (request ))).map (SearchDocumentResponse ::from );
794+ }
795+
751796 /**
752797 * Customization hook on the actual execution result {@link Publisher}. <br />
753798 *
@@ -935,7 +980,7 @@ protected <T> Mono<T> maybeCallAfterConvert(T entity, Document document, IndexCo
935980 protected interface DocumentCallback <T > {
936981
937982 @ NonNull
938- Mono <T > doWith (@ Nullable Document document );
983+ Mono <T > toEntity (@ Nullable Document document );
939984 }
940985
941986 protected class ReadDocumentCallback <T > implements DocumentCallback <T > {
@@ -953,7 +998,7 @@ public ReadDocumentCallback(EntityReader<? super T, Document> reader, Class<T> t
953998 }
954999
9551000 @ NonNull
956- public Mono <T > doWith (@ Nullable Document document ) {
1001+ public Mono <T > toEntity (@ Nullable Document document ) {
9571002 if (document == null ) {
9581003 return Mono .empty ();
9591004 }
@@ -966,7 +1011,10 @@ public Mono<T> doWith(@Nullable Document document) {
9661011 protected interface SearchDocumentCallback <T > {
9671012
9681013 @ NonNull
969- Mono <SearchHit <T >> doWith (@ NonNull SearchDocument response );
1014+ Mono <T > toEntity (@ NonNull SearchDocument response );
1015+
1016+ @ NonNull
1017+ Mono <SearchHit <T >> toSearchHit (@ NonNull SearchDocument response );
9701018 }
9711019
9721020 protected class ReadSearchDocumentCallback <T > implements SearchDocumentCallback <T > {
@@ -981,9 +1029,13 @@ public ReadSearchDocumentCallback(Class<T> type, IndexCoordinates index) {
9811029 }
9821030
9831031 @ Override
984- public Mono <SearchHit <T >> doWith (SearchDocument response ) {
985- return delegate .doWith (response )
986- .map (entity -> SearchHitMapping .mappingFor (type , converter ).mapHit (response , entity ));
1032+ public Mono <T > toEntity (SearchDocument response ) {
1033+ return delegate .toEntity (response );
1034+ }
1035+
1036+ @ Override
1037+ public Mono <SearchHit <T >> toSearchHit (SearchDocument response ) {
1038+ return toEntity (response ).map (entity -> SearchHitMapping .mappingFor (type , converter ).mapHit (response , entity ));
9871039 }
9881040 }
9891041
0 commit comments