Skip to content

Commit 23ac6d7

Browse files
authored
DATAES-952 - Optimize SearchPage implementation.
Original PR: #539
1 parent 9bc4bee commit 23ac6d7

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

src/main/java/org/springframework/data/elasticsearch/core/SearchHitSupport.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,5 +158,13 @@ public SearchPageImpl(SearchHits<T> searchHits, Pageable pageable) {
158158
public SearchHits<T> getSearchHits() {
159159
return searchHits;
160160
}
161+
162+
/*
163+
* return the same instance as in getSearchHits().getSearchHits()
164+
*/
165+
@Override
166+
public List<SearchHit<T>> getContent() {
167+
return searchHits.getSearchHits();
168+
}
161169
}
162170
}

src/main/java/org/springframework/data/elasticsearch/core/SearchHitsImpl.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919
import java.util.List;
2020

2121
import org.elasticsearch.search.aggregations.Aggregations;
22+
import org.springframework.data.util.Lazy;
2223
import org.springframework.lang.Nullable;
2324
import org.springframework.util.Assert;
2425

2526
/**
26-
* Basic implementation of {@link SearchScrollHits}
27+
* Basic implementation of {@link SearchScrollHits}
2728
*
2829
* @param <T> the result data class.
2930
* @author Peter-Josef Meisch
@@ -35,9 +36,10 @@ public class SearchHitsImpl<T> implements SearchScrollHits<T> {
3536
private final long totalHits;
3637
private final TotalHitsRelation totalHitsRelation;
3738
private final float maxScore;
38-
private final String scrollId;
39+
@Nullable private final String scrollId;
3940
private final List<? extends SearchHit<T>> searchHits;
40-
private final Aggregations aggregations;
41+
private final Lazy<List<SearchHit<T>>> unmodifiableSearchHits;
42+
@Nullable private final Aggregations aggregations;
4143

4244
/**
4345
* @param totalHits the number of total hits for the search
@@ -58,6 +60,7 @@ public SearchHitsImpl(long totalHits, TotalHitsRelation totalHitsRelation, float
5860
this.scrollId = scrollId;
5961
this.searchHits = searchHits;
6062
this.aggregations = aggregations;
63+
this.unmodifiableSearchHits = Lazy.of(() -> Collections.unmodifiableList(searchHits));
6164
}
6265

6366
// region getter
@@ -84,7 +87,7 @@ public String getScrollId() {
8487

8588
@Override
8689
public List<SearchHit<T>> getSearchHits() {
87-
return Collections.unmodifiableList(searchHits);
90+
return unmodifiableSearchHits.get();
8891
}
8992
// endregion
9093

src/main/java/org/springframework/data/elasticsearch/core/SearchScrollHits.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core;
1717

18+
import org.springframework.lang.Nullable;
19+
1820
/**
1921
* This interface is used to expose the current {@code scrollId} from the underlying scroll context.
2022
* <p>
2123
* Internal use only.
2224
*
2325
* @author Sascha Woo
26+
* @author Peter-Josef Meisch
2427
* @param <T>
2528
* @since 4.0
2629
*/
@@ -29,6 +32,7 @@ public interface SearchScrollHits<T> extends SearchHits<T> {
2932
/**
3033
* @return the scroll id
3134
*/
35+
@Nullable
3236
String getScrollId();
3337

3438
}

src/test/java/org/springframework/data/elasticsearch/core/SearchHitSupportTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,23 @@
1919
import static org.assertj.core.api.Assertions.*;
2020
import static org.mockito.Mockito.*;
2121

22+
import java.util.ArrayList;
2223
import java.util.Arrays;
2324
import java.util.Iterator;
25+
import java.util.List;
2426

2527
import org.elasticsearch.search.aggregations.Aggregations;
28+
import org.junit.jupiter.api.DisplayName;
2629
import org.junit.jupiter.api.Test;
30+
import org.springframework.data.domain.PageRequest;
2731
import org.springframework.data.util.CloseableIterator;
2832

2933
/**
3034
* @author Roman Puchkovskiy
35+
* @author Peter-Josef Meisch
3136
*/
3237
class SearchHitSupportTest {
38+
3339
@Test // DATAES-772
3440
void unwrapsSearchHitsIteratorToCloseableIteratorOfEntities() {
3541
TestStringSearchHitsIterator searchHitsIterator = new TestStringSearchHitsIterator();
@@ -38,6 +44,7 @@ void unwrapsSearchHitsIteratorToCloseableIteratorOfEntities() {
3844
CloseableIterator<String> unwrappedIterator = (CloseableIterator<String>) SearchHitSupport
3945
.unwrapSearchHits(searchHitsIterator);
4046

47+
// noinspection ConstantConditions
4148
assertThat(unwrappedIterator.next()).isEqualTo("one");
4249
assertThat(unwrappedIterator.next()).isEqualTo("two");
4350
assertThat(unwrappedIterator.hasNext()).isFalse();
@@ -47,6 +54,27 @@ void unwrapsSearchHitsIteratorToCloseableIteratorOfEntities() {
4754
assertThat(searchHitsIterator.closed).isTrue();
4855
}
4956

57+
@Test // DATAES-952
58+
@DisplayName("should return the same list instance in SearchHits and getContent")
59+
void shouldReturnTheSameListInstanceInSearchHitsAndGetContent() {
60+
61+
List<SearchHit<String>> hits = new ArrayList<>();
62+
hits.add(new SearchHit<>(null, null, 0, null, null, "one"));
63+
hits.add(new SearchHit<>(null, null, 0, null, null, "two"));
64+
hits.add(new SearchHit<>(null, null, 0, null, null, "three"));
65+
hits.add(new SearchHit<>(null, null, 0, null, null, "four"));
66+
hits.add(new SearchHit<>(null, null, 0, null, null, "five"));
67+
68+
SearchHits<String> originalSearchHits = new SearchHitsImpl<>(hits.size(), TotalHitsRelation.EQUAL_TO, 0, "scroll",
69+
hits, null);
70+
71+
SearchPage<String> searchPage = SearchHitSupport.searchPageFor(originalSearchHits, PageRequest.of(0, 3));
72+
SearchHits<String> searchHits = searchPage.getSearchHits();
73+
74+
assertThat(searchHits).isEqualTo(originalSearchHits);
75+
assertThat(searchHits.getSearchHits()).isSameAs(searchPage.getContent());
76+
}
77+
5078
private static class TestStringSearchHitsIterator implements SearchHitsIterator<String> {
5179
private final Iterator<String> iterator = Arrays.asList("one", "two").iterator();
5280
private boolean closed = false;
@@ -87,4 +115,5 @@ public SearchHit<String> next() {
87115
return new SearchHit<>("index", "id", 1.0f, new Object[0], emptyMap(), nextString);
88116
}
89117
}
118+
90119
}

0 commit comments

Comments
 (0)