diff --git a/src/main/antora/modules/ROOT/pages/elasticsearch/template.adoc b/src/main/antora/modules/ROOT/pages/elasticsearch/template.adoc index cf458c3b8..d5cbec5d0 100644 --- a/src/main/antora/modules/ROOT/pages/elasticsearch/template.adoc +++ b/src/main/antora/modules/ROOT/pages/elasticsearch/template.adoc @@ -81,7 +81,7 @@ When a document is retrieved with the methods of the `DocumentOperations` inter When searching with the methods of the `SearchOperations` interface, additional information is available for each entity, for example the _score_ or the _sortValues_ of the found entity. In order to return this information, each entity is wrapped in a `SearchHit` object that contains this entity-specific additional information. -These `SearchHit` objects themselves are returned within a `SearchHits` object which additionally contains informations about the whole search like the _maxScore_ or requested aggregations. +These `SearchHit` objects themselves are returned within a `SearchHits` object which additionally contains informations about the whole search like the _maxScore_ or requested aggregations or the execution duration it took to complete the request. The following classes and interfaces are now available: .SearchHit diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/DocumentAdapters.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/DocumentAdapters.java index 1b2dfadbb..871ad36d3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/DocumentAdapters.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/DocumentAdapters.java @@ -50,6 +50,7 @@ * * @author Peter-Josef Meisch * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.4 */ final class DocumentAdapters { @@ -74,7 +75,7 @@ public static SearchDocument from(Hit hit, JsonpMapper jsonpMapper) { Map innerHits = new LinkedHashMap<>(); hit.innerHits().forEach((name, innerHitsResult) -> { // noinspection ReturnOfNull - innerHits.put(name, SearchDocumentResponseBuilder.from(innerHitsResult.hits(), null, null, null, null, null, + innerHits.put(name, SearchDocumentResponseBuilder.from(innerHitsResult.hits(), null, null, null, 0, null, null, searchDocument -> null, jsonpMapper)); }); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java index 2ced82f2d..b3b0ca7ba 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java @@ -29,6 +29,7 @@ import co.elastic.clients.elasticsearch.core.search.TotalHits; import co.elastic.clients.json.JsonpMapper; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -56,6 +57,7 @@ * * @author Peter-Josef Meisch * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.4 */ class SearchDocumentResponseBuilder { @@ -83,8 +85,10 @@ public static SearchDocumentResponse from(ResponseBody response Map>> suggest = responseBody.suggest(); var pointInTimeId = responseBody.pitId(); var shards = responseBody.shards(); + var executionDurationInMillis = responseBody.took(); - return from(hitsMetadata, shards, scrollId, pointInTimeId, aggregations, suggest, entityCreator, jsonpMapper); + return from(hitsMetadata, shards, scrollId, pointInTimeId, executionDurationInMillis, aggregations, suggest, + entityCreator, jsonpMapper); } /** @@ -109,8 +113,10 @@ public static SearchDocumentResponse from(SearchTemplateResponse SearchDocumentResponse from(SearchTemplateResponse SearchDocumentResponse from(HitsMetadata hitsMetadata, @Nullable ShardStatistics shards, - @Nullable String scrollId, @Nullable String pointInTimeId, @Nullable Map aggregations, + @Nullable String scrollId, @Nullable String pointInTimeId, long executionDurationInMillis, @Nullable Map aggregations, Map>> suggestES, SearchDocumentResponse.EntityCreator entityCreator, JsonpMapper jsonpMapper) { @@ -151,6 +157,8 @@ public static SearchDocumentResponse from(HitsMetadata hitsMetadata, @Nul float maxScore = hitsMetadata.maxScore() != null ? hitsMetadata.maxScore().floatValue() : Float.NaN; + Duration executionDuration = Duration.ofMillis(executionDurationInMillis); + List searchDocuments = new ArrayList<>(); for (Hit hit : hitsMetadata.hits()) { searchDocuments.add(DocumentAdapters.from(hit, jsonpMapper)); @@ -163,7 +171,7 @@ public static SearchDocumentResponse from(HitsMetadata hitsMetadata, @Nul SearchShardStatistics shardStatistics = shards != null ? shardsFrom(shards) : null; - return new SearchDocumentResponse(totalHits, totalHitsRelation, maxScore, scrollId, pointInTimeId, searchDocuments, + return new SearchDocumentResponse(totalHits, totalHitsRelation, maxScore, executionDuration, scrollId, pointInTimeId, searchDocuments, aggregationsContainer, suggest, shardStatistics); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHits.java b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHits.java index d382cc0e7..e1b95eb54 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHits.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHits.java @@ -17,6 +17,8 @@ import reactor.core.publisher.Flux; +import java.time.Duration; + import org.springframework.data.elasticsearch.core.suggest.response.Suggest; import org.springframework.lang.Nullable; @@ -25,6 +27,7 @@ * * @param the result data class. * @author Peter-Josef Meisch + * @author Mohamed El Harrougui * @since 4.4 */ public interface ReactiveSearchHits { @@ -37,6 +40,11 @@ public interface ReactiveSearchHits { float getMaxScore(); + /** + * @return the execution duration it took to complete the request + */ + Duration getExecutionDuration(); + /** * @return the {@link SearchHit}s from the search result. */ diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHitsImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHitsImpl.java index 84c25d776..7ab10eaf3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHitsImpl.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveSearchHitsImpl.java @@ -17,11 +17,14 @@ import reactor.core.publisher.Flux; +import java.time.Duration; + import org.springframework.data.elasticsearch.core.suggest.response.Suggest; import org.springframework.lang.Nullable; /** * @author Peter-Josef Meisch + * @author Mohamed El Harrougui * @since 4.4 */ public class ReactiveSearchHitsImpl implements ReactiveSearchHits { @@ -58,6 +61,11 @@ public float getMaxScore() { return delegate.getMaxScore(); } + @Override + public Duration getExecutionDuration() { + return delegate.getExecutionDuration(); + } + @Override public boolean hasSearchHits() { return delegate.hasSearchHits(); diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java index 42fa2da49..8d9689ae3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.core; +import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -47,6 +48,7 @@ * @author Sascha Woo * @author Jakob Hoeper * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.0 */ public class SearchHitMapping { @@ -87,6 +89,7 @@ private SearchHitsImpl mapHitsFromResponse(SearchDocumentResponse searchDocum long totalHits = searchDocumentResponse.getTotalHits(); SearchShardStatistics shardStatistics = searchDocumentResponse.getSearchShardStatistics(); float maxScore = searchDocumentResponse.getMaxScore(); + Duration executionDuration = searchDocumentResponse.getExecutionDuration(); String scrollId = searchDocumentResponse.getScrollId(); String pointInTimeId = searchDocumentResponse.getPointInTimeId(); @@ -104,8 +107,8 @@ private SearchHitsImpl mapHitsFromResponse(SearchDocumentResponse searchDocum Suggest suggest = searchDocumentResponse.getSuggest(); mapHitsInCompletionSuggestion(suggest); - return new SearchHitsImpl<>(totalHits, totalHitsRelation, maxScore, scrollId, pointInTimeId, searchHits, - aggregations, suggest, shardStatistics); + return new SearchHitsImpl<>(totalHits, totalHitsRelation, maxScore, executionDuration, scrollId, pointInTimeId, + searchHits, aggregations, suggest, shardStatistics); } @SuppressWarnings("unchecked") @@ -238,6 +241,7 @@ private SearchHits mapInnerDocuments(SearchHits searchHits, C return new SearchHitsImpl<>(searchHits.getTotalHits(), searchHits.getTotalHitsRelation(), searchHits.getMaxScore(), + searchHits.getExecutionDuration(), scrollId, searchHits.getPointInTimeId(), convertedSearchHits, diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHits.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHits.java index 023775af8..363369a49 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHits.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHits.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.core; +import java.time.Duration; import java.util.Iterator; import java.util.List; @@ -28,6 +29,7 @@ * @param the result data class. * @author Sascha Woo * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.0 */ public interface SearchHits extends Streamable> { @@ -43,6 +45,11 @@ public interface SearchHits extends Streamable> { */ float getMaxScore(); + /** + * @return the execution duration it took to complete the request + */ + Duration getExecutionDuration(); + /** * @param index position in List. * @return the {@link SearchHit} at position {index} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsImpl.java index fda8e8a30..f8404b0e2 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsImpl.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsImpl.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.core; +import java.time.Duration; import java.util.Collections; import java.util.List; @@ -30,6 +31,7 @@ * @author Peter-Josef Meisch * @author Sascha Woo * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.0 */ public class SearchHitsImpl implements SearchScrollHits { @@ -37,6 +39,7 @@ public class SearchHitsImpl implements SearchScrollHits { private final long totalHits; private final TotalHitsRelation totalHitsRelation; private final float maxScore; + private final Duration executionDuration; @Nullable private final String scrollId; private final List> searchHits; private final Lazy>> unmodifiableSearchHits; @@ -49,12 +52,13 @@ public class SearchHitsImpl implements SearchScrollHits { * @param totalHits the number of total hits for the search * @param totalHitsRelation the relation {@see TotalHitsRelation}, must not be {@literal null} * @param maxScore the maximum score + * @param executionDuration the execution duration it took to complete the request * @param scrollId the scroll id if available * @param searchHits must not be {@literal null} * @param aggregations the aggregations if available */ - public SearchHitsImpl(long totalHits, TotalHitsRelation totalHitsRelation, float maxScore, @Nullable String scrollId, - @Nullable String pointInTimeId, List> searchHits, + public SearchHitsImpl(long totalHits, TotalHitsRelation totalHitsRelation, float maxScore, Duration executionDuration, + @Nullable String scrollId, @Nullable String pointInTimeId, List> searchHits, @Nullable AggregationsContainer aggregations, @Nullable Suggest suggest, @Nullable SearchShardStatistics searchShardStatistics) { @@ -63,6 +67,7 @@ public SearchHitsImpl(long totalHits, TotalHitsRelation totalHitsRelation, float this.totalHits = totalHits; this.totalHitsRelation = totalHitsRelation; this.maxScore = maxScore; + this.executionDuration = executionDuration; this.scrollId = scrollId; this.pointInTimeId = pointInTimeId; this.searchHits = searchHits; @@ -88,6 +93,11 @@ public float getMaxScore() { return maxScore; } + @Override + public Duration getExecutionDuration() { + return executionDuration; + } + @Override @Nullable public String getScrollId() { @@ -133,6 +143,7 @@ public String toString() { "totalHits=" + totalHits + // ", totalHitsRelation=" + totalHitsRelation + // ", maxScore=" + maxScore + // + ", executionDuration=" + executionDuration + // ", scrollId='" + scrollId + '\'' + // ", pointInTimeId='" + pointInTimeId + '\'' + // ", searchHits={" + searchHits.size() + " elements}" + // diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsIterator.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsIterator.java index 5246903f4..eb9c491b0 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsIterator.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitsIterator.java @@ -15,6 +15,8 @@ */ package org.springframework.data.elasticsearch.core; +import java.time.Duration; + import org.springframework.data.util.CloseableIterator; import org.springframework.lang.Nullable; @@ -23,6 +25,7 @@ * {@link java.util.stream.Stream}. * * @author Sascha Woo + * @author Mohamed El Harrougui * @param * @since 4.0 */ @@ -39,6 +42,11 @@ public interface SearchHitsIterator extends CloseableIterator> { */ float getMaxScore(); + /** + * @return the execution duration it took to complete the request + */ + Duration getExecutionDuration(); + /** * @return the number of total hits. */ diff --git a/src/main/java/org/springframework/data/elasticsearch/core/StreamQueries.java b/src/main/java/org/springframework/data/elasticsearch/core/StreamQueries.java index 5c9a04a56..953607c20 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/StreamQueries.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/StreamQueries.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.core; +import java.time.Duration; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; @@ -31,6 +32,7 @@ * * @author Mark Paluch * @author Sascha Woo + * @author Mohamed El Harrougui * @since 3.2 */ abstract class StreamQueries { @@ -56,6 +58,7 @@ static SearchHitsIterator streamResults(int maxCount, SearchScrollHits AggregationsContainer aggregations = searchHits.getAggregations(); float maxScore = searchHits.getMaxScore(); + Duration executionDuration = searchHits.getExecutionDuration(); long totalHits = searchHits.getTotalHits(); TotalHitsRelation totalHitsRelation = searchHits.getTotalHitsRelation(); @@ -86,6 +89,11 @@ public float getMaxScore() { return maxScore; } + @Override + public Duration getExecutionDuration() { + return executionDuration; + } + @Override public long getTotalHits() { return totalHits; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/document/SearchDocumentResponse.java b/src/main/java/org/springframework/data/elasticsearch/core/document/SearchDocumentResponse.java index 23e0898ac..9009bde01 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/document/SearchDocumentResponse.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/document/SearchDocumentResponse.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.core.document; +import java.time.Duration; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Function; @@ -29,6 +30,7 @@ * * @author Peter-Josef Meisch * @author Haibo Liu + * @author Mohamed El Harrougui * @since 4.0 */ public class SearchDocumentResponse { @@ -36,6 +38,7 @@ public class SearchDocumentResponse { private final long totalHits; private final String totalHitsRelation; private final float maxScore; + private final Duration executionDuration; @Nullable private final String scrollId; private final List searchDocuments; @Nullable private final AggregationsContainer aggregations; @@ -44,13 +47,14 @@ public class SearchDocumentResponse { @Nullable String pointInTimeId; @Nullable private final SearchShardStatistics searchShardStatistics; - public SearchDocumentResponse(long totalHits, String totalHitsRelation, float maxScore, @Nullable String scrollId, - @Nullable String pointInTimeId, List searchDocuments, + public SearchDocumentResponse(long totalHits, String totalHitsRelation, float maxScore, Duration executionDuration, + @Nullable String scrollId, @Nullable String pointInTimeId, List searchDocuments, @Nullable AggregationsContainer aggregationsContainer, @Nullable Suggest suggest, @Nullable SearchShardStatistics searchShardStatistics) { this.totalHits = totalHits; this.totalHitsRelation = totalHitsRelation; this.maxScore = maxScore; + this.executionDuration = executionDuration; this.scrollId = scrollId; this.pointInTimeId = pointInTimeId; this.searchDocuments = searchDocuments; @@ -71,6 +75,10 @@ public float getMaxScore() { return maxScore; } + public Duration getExecutionDuration() { + return executionDuration; + } + @Nullable public String getScrollId() { return scrollId; diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilderUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilderUnitTests.java index ee1469178..f5bbb1f7e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilderUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilderUnitTests.java @@ -44,6 +44,7 @@ * * @author Sébastien Comeau * @author Haibo Liu + * @author Mohamed El Harrougui * @since 5.2 */ class SearchDocumentResponseBuilderUnitTests { @@ -54,35 +55,21 @@ class SearchDocumentResponseBuilderUnitTests { void shouldGetPhraseSuggestion() throws JSONException { // arrange final var hitsMetadata = new HitsMetadata.Builder() - .total(total -> total - .value(0) - .relation(TotalHitsRelation.Eq)) - .hits(new ArrayList<>()) - .build(); - - final var suggestionTest = new Suggestion.Builder() - .phrase(phrase -> phrase - .text("National") - .offset(0) - .length(8) - .options(option -> option - .text("nations") - .highlighted("highlighted-nations") - .score(0.11480146) - .collateMatch(false)) - .options(option -> option - .text("national") - .highlighted("highlighted-national") - .score(0.08063514) - .collateMatch(false))) + .total(total -> total.value(0).relation(TotalHitsRelation.Eq)).hits(new ArrayList<>()).build(); + + final var suggestionTest = new Suggestion.Builder().phrase(phrase -> phrase.text("National").offset(0) + .length(8) + .options( + option -> option.text("nations").highlighted("highlighted-nations").score(0.11480146).collateMatch(false)) + .options(option -> option.text("national").highlighted("highlighted-national").score(0.08063514) + .collateMatch(false))) .build(); final var sortProperties = ImmutableMap.>> builder() - .put("suggestionTest", ImmutableList.of(suggestionTest)) - .build(); + .put("suggestionTest", ImmutableList.of(suggestionTest)).build(); // act - final var actual = SearchDocumentResponseBuilder.from(hitsMetadata, null, null, null, null, sortProperties, null, + final var actual = SearchDocumentResponseBuilder.from(hitsMetadata, null, null, null, 0, null, sortProperties, null, jsonpMapper); // assert @@ -122,35 +109,19 @@ void shouldGetPhraseSuggestion() throws JSONException { void shouldGetShardStatisticsInfo() { // arrange HitsMetadata hitsMetadata = new HitsMetadata.Builder() - .total(t -> t - .value(0) - .relation(TotalHitsRelation.Eq)) - .hits(new ArrayList<>()) - .build(); + .total(t -> t.value(0).relation(TotalHitsRelation.Eq)).hits(new ArrayList<>()).build(); - ShardStatistics shards = new ShardStatistics.Builder() - .total(15) - .successful(14) - .skipped(0) - .failed(1) - .failures(List.of( - ShardFailure.of(sfb -> sfb - .index("test-index") - .node("test-node") - .shard(1) - .reason(rb -> rb - .reason("this is a mock failure in shards") - .causedBy(cbb -> cbb.reason("inner reason") - .metadata(Map.of("hello", JsonData.of("world")))) - .type("reason-type") - - ) - .status("fail")))) - .build(); + ShardStatistics shards = new ShardStatistics.Builder().total(15).successful(14).skipped(0).failed(1) + .failures(List.of(ShardFailure.of(sfb -> sfb.index("test-index").node("test-node").shard(1) + .reason(rb -> rb.reason("this is a mock failure in shards") + .causedBy(cbb -> cbb.reason("inner reason").metadata(Map.of("hello", JsonData.of("world")))) + .type("reason-type") + + ).status("fail")))).build(); // act - SearchDocumentResponse response = SearchDocumentResponseBuilder.from(hitsMetadata, shards, null, null, - null, null, null, jsonpMapper); + SearchDocumentResponse response = SearchDocumentResponseBuilder.from(hitsMetadata, shards, null, null, 0, null, + null, null, jsonpMapper); // assert SearchShardStatistics shardStatistics = response.getSearchShardStatistics(); @@ -164,11 +135,9 @@ void shouldGetShardStatisticsInfo() { assertThat(failures.size()).isEqualTo(1); assertThat(failures).extracting(SearchShardStatistics.Failure::getIndex).containsExactly("test-index"); assertThat(failures).extracting(SearchShardStatistics.Failure::getElasticsearchErrorCause) - .extracting(ElasticsearchErrorCause::getReason) - .containsExactly("this is a mock failure in shards"); + .extracting(ElasticsearchErrorCause::getReason).containsExactly("this is a mock failure in shards"); assertThat(failures).extracting(SearchShardStatistics.Failure::getElasticsearchErrorCause) - .extracting(ElasticsearchErrorCause::getCausedBy) - .extracting(ElasticsearchErrorCause::getReason) + .extracting(ElasticsearchErrorCause::getCausedBy).extracting(ElasticsearchErrorCause::getReason) .containsExactly("inner reason"); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java index 4c5c5a77f..d10b5a91e 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java @@ -24,6 +24,7 @@ import static org.springframework.data.elasticsearch.utils.IdGenerator.*; import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; +import java.time.Duration; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -99,6 +100,7 @@ * @author scoobyzhang * @author Hamid Rahimi * @author Illia Ulianov + * @author Mohamed El Harrougui */ @SpringIntegrationTest public abstract class ElasticsearchIntegrationTests { @@ -1855,7 +1857,7 @@ public void shouldReturnDocumentAboveMinimalScoreGivenQuery() { protected abstract Query getBoolQueryWithWildcardsFirstMustSecondShouldAndMinScore(String firstField, String firstValue, String secondField, String secondValue, float minScore); - @Test // DATAES-462 + @Test // DATAES-462, #2986 public void shouldReturnScores() { List indexQueries = new ArrayList<>(); @@ -1872,6 +1874,7 @@ public void shouldReturnScores() { IndexCoordinates.of(indexNameProvider.indexName())); assertThat(searchHits.getMaxScore()).isGreaterThan(0f); + assertThat(searchHits.getExecutionDuration().toMillis()).isGreaterThan(0); assertThat(searchHits.getSearchHit(0).getScore()).isGreaterThan(0f); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/SearchHitSupportTest.java b/src/test/java/org/springframework/data/elasticsearch/core/SearchHitSupportTest.java index bedc20c8b..3dd7a35cc 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/SearchHitSupportTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/SearchHitSupportTest.java @@ -19,6 +19,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -33,6 +34,7 @@ * @author Roman Puchkovskiy * @author Peter-Josef Meisch * @author Haibo Liu + * @author Mohamed El Harrougui */ class SearchHitSupportTest { @@ -65,8 +67,8 @@ void shouldReturnTheSameListInstanceInSearchHitsAndGetContent() { hits.add(new SearchHit<>(null, null, null, 0, null, null, null, null, null, null, "four")); hits.add(new SearchHit<>(null, null, null, 0, null, null, null, null, null, null, "five")); - SearchHits originalSearchHits = new SearchHitsImpl<>(hits.size(), TotalHitsRelation.EQUAL_TO, 0, "scroll", - null, hits, null, null, null); + SearchHits originalSearchHits = new SearchHitsImpl<>(hits.size(), TotalHitsRelation.EQUAL_TO, 0, + Duration.ofMillis(1), "scroll", null, hits, null, null, null); SearchPage searchPage = SearchHitSupport.searchPageFor(originalSearchHits, PageRequest.of(0, 3)); SearchHits searchHits = searchPage.getSearchHits(); @@ -89,6 +91,11 @@ public float getMaxScore() { return 0; } + @Override + public Duration getExecutionDuration() { + return Duration.ofMillis(1); + } + @Override public long getTotalHits() { return 2; diff --git a/src/test/java/org/springframework/data/elasticsearch/core/StreamQueriesTest.java b/src/test/java/org/springframework/data/elasticsearch/core/StreamQueriesTest.java index 5b14e8c76..b9e6abfc8 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/StreamQueriesTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/StreamQueriesTest.java @@ -17,6 +17,7 @@ import static org.assertj.core.api.Assertions.*; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -32,6 +33,7 @@ * @author Sascha Woo * @author Peter-Josef Meisch * @author Haibo Liu + * @author Mohamed El Harrougui */ public class StreamQueriesTest { @@ -181,6 +183,7 @@ void shouldOnlyReturnRequestedCount() { } private SearchScrollHits newSearchScrollHits(List> hits, String scrollId) { - return new SearchHitsImpl<>(hits.size(), TotalHitsRelation.EQUAL_TO, 0, scrollId, null, hits, null, null, null); + return new SearchHitsImpl<>(hits.size(), TotalHitsRelation.EQUAL_TO, 0, Duration.ofMillis(1), scrollId, null, hits, + null, null, null); } }