diff --git a/server/src/internalClusterTest/java/org/opensearch/search/sort/FieldSortIT.java b/server/src/internalClusterTest/java/org/opensearch/search/sort/FieldSortIT.java index f77f5a682da25..ee08f9674ad0e 100644 --- a/server/src/internalClusterTest/java/org/opensearch/search/sort/FieldSortIT.java +++ b/server/src/internalClusterTest/java/org/opensearch/search/sort/FieldSortIT.java @@ -582,6 +582,8 @@ public void testIssue2991() throws InterruptedException { } public void testSimpleSorts() throws Exception { + final int docs = 50; + Random random = random(); assertAcked( prepareCreate("test").setMapping( @@ -623,9 +625,9 @@ public void testSimpleSorts() throws Exception { ) ); ensureGreen(); - BigInteger UNSIGNED_LONG_BASE = Numbers.MAX_UNSIGNED_LONG_VALUE.subtract(BigInteger.valueOf(100000)); + BigInteger UNSIGNED_LONG_BASE = Numbers.MAX_UNSIGNED_LONG_VALUE.subtract(BigInteger.valueOf(10000 * docs)); List builders = new ArrayList<>(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < docs; i++) { IndexRequestBuilder builder = client().prepareIndex("test") .setId(Integer.toString(i)) .setSource( @@ -660,13 +662,13 @@ public void testSimpleSorts() throws Exception { indexRandomForConcurrentSearch("test"); // STRING - int size = 1 + random.nextInt(10); + int size = 1 + random.nextInt(docs); SearchResponse searchResponse = client().prepareSearch() .setQuery(matchAllQuery()) .setSize(size) .addSort("str_value", SortOrder.ASC) .get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -675,70 +677,70 @@ public void testSimpleSorts() throws Exception { equalTo(new String(new char[] { (char) (97 + i), (char) (97 + i) })) ); } - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("str_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); assertThat( searchResponse.getHits().getAt(i).getSortValues()[0].toString(), - equalTo(new String(new char[] { (char) (97 + (9 - i)), (char) (97 + (9 - i)) })) + equalTo(new String(new char[] { (char) (97 + (docs - 1 - i)), (char) (97 + (docs - 1 - i)) })) ); } assertThat(searchResponse.toString(), not(containsString("error"))); // BYTE - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("byte_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).byteValue(), equalTo((byte) i)); } - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("byte_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).byteValue(), equalTo((byte) (9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).byteValue(), equalTo((byte) (docs - 1 - i))); } assertThat(searchResponse.toString(), not(containsString("error"))); // SHORT - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("short_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).shortValue(), equalTo((short) i)); } - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("short_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).shortValue(), equalTo((short) (9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).shortValue(), equalTo((short) (docs - 1 - i))); } assertThat(searchResponse.toString(), not(containsString("error"))); // INTEGER - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("integer_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -746,23 +748,23 @@ public void testSimpleSorts() throws Exception { } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("integer_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).intValue(), equalTo((9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).intValue(), equalTo((docs - 1 - i))); } assertThat(searchResponse.toString(), not(containsString("error"))); // LONG - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("long_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -770,23 +772,23 @@ public void testSimpleSorts() throws Exception { } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("long_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10L); - assertHitCount(searchResponse, 10); + + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).longValue(), equalTo((long) (9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).longValue(), equalTo((long) (docs - 1 - i))); } assertThat(searchResponse.toString(), not(containsString("error"))); // FLOAT - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("float_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10L); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -794,45 +796,48 @@ public void testSimpleSorts() throws Exception { } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("float_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).doubleValue(), closeTo(0.1d * (9 - i), 0.000001d)); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat( + ((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).doubleValue(), + closeTo(0.1d * (docs - 1 - i), 0.000001d) + ); } assertThat(searchResponse.toString(), not(containsString("error"))); // HALF_FLOAT - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("half_float_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10L); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("half_float_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); } assertThat(searchResponse.toString(), not(containsString("error"))); // DOUBLE - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("double_value", SortOrder.ASC).get(); - assertHitCount(searchResponse, 10L); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -840,27 +845,30 @@ public void testSimpleSorts() throws Exception { } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch().setQuery(matchAllQuery()).setSize(size).addSort("double_value", SortOrder.DESC).get(); - assertHitCount(searchResponse, 10L); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); - assertThat(((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).doubleValue(), closeTo(0.1d * (9 - i), 0.000001d)); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); + assertThat( + ((Number) searchResponse.getHits().getAt(i).getSortValues()[0]).doubleValue(), + closeTo(0.1d * (docs - 1 - i), 0.000001d) + ); } assertNoFailures(searchResponse); // UNSIGNED_LONG - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch() .setQuery(matchAllQuery()) .setSize(size) .addSort("unsigned_long_value", SortOrder.ASC) .get(); - assertHitCount(searchResponse, 10); + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(i))); @@ -871,20 +879,20 @@ public void testSimpleSorts() throws Exception { } assertThat(searchResponse.toString(), not(containsString("error"))); - size = 1 + random.nextInt(10); + size = 1 + random.nextInt(docs); searchResponse = client().prepareSearch() .setQuery(matchAllQuery()) .setSize(size) .addSort("unsigned_long_value", SortOrder.DESC) .get(); - assertHitCount(searchResponse, 10L); - assertHitCount(searchResponse, 10); + + assertHitCount(searchResponse, docs); assertThat(searchResponse.getHits().getHits().length, equalTo(size)); for (int i = 0; i < size; i++) { - assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(9 - i))); + assertThat(searchResponse.getHits().getAt(i).getId(), equalTo(Integer.toString(docs - 1 - i))); assertThat( ((Number) searchResponse.getHits().getAt(i).getSortValues()[0]), - equalTo(UNSIGNED_LONG_BASE.add(BigInteger.valueOf(10000 * (9 - i)))) + equalTo(UNSIGNED_LONG_BASE.add(BigInteger.valueOf(10000 * (docs - 1 - i)))) ); } diff --git a/server/src/main/java/org/opensearch/index/fielddata/AbstractNumericDocValues.java b/server/src/main/java/org/opensearch/index/fielddata/AbstractNumericDocValues.java index a2a70e280187a..3a2504ce92158 100644 --- a/server/src/main/java/org/opensearch/index/fielddata/AbstractNumericDocValues.java +++ b/server/src/main/java/org/opensearch/index/fielddata/AbstractNumericDocValues.java @@ -43,6 +43,9 @@ * aggregations, which only use {@link #advanceExact(int)} and * {@link #longValue()}. * + * In case when optimizations based on point values are used, the {@link #advance(int)} + * and, optionally, {@link #cost()} have to be implemented as well. + * * @opensearch.internal */ public abstract class AbstractNumericDocValues extends NumericDocValues {