diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 7e45c3bcdfd..dc17616213e 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -385,6 +385,8 @@ Other Changes * SOLR-8762: return child docs in DIH debug (Gopikannan Venugopalsamy via Mikhail Khludnev) +* SOLR-10501: Test sortMissing{First,Last} with points fields. (Steve Rowe) + ================== 6.6.0 ================== Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. diff --git a/solr/core/src/test-files/solr/collection1/conf/schema-point.xml b/solr/core/src/test-files/solr/collection1/conf/schema-point.xml index 8bf545a44d8..c024cb6d0a7 100644 --- a/solr/core/src/test-files/solr/collection1/conf/schema-point.xml +++ b/solr/core/src/test-files/solr/collection1/conf/schema-point.xml @@ -60,6 +60,18 @@ + + + + + + + + + + + + @@ -73,7 +85,19 @@ - + + + + + + + + + + + + + @@ -86,7 +110,19 @@ - + + + + + + + + + + + + + @@ -99,6 +135,18 @@ + + + + + + + + + + + + @@ -112,6 +160,18 @@ + + + + + + + + + + + + diff --git a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java index b93b260ed91..a1d2260207d 100644 --- a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java +++ b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java @@ -18,9 +18,11 @@ package org.apache.solr.schema; import java.io.IOException; import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashSet; @@ -29,6 +31,9 @@ import java.util.Locale; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.apache.lucene.document.Document; import org.apache.lucene.document.DoublePoint; @@ -71,6 +76,13 @@ import com.google.common.collect.ImmutableMap; */ public class TestPointFields extends SolrTestCaseJ4 { + private static final String[] FIELD_SUFFIXES = new String[] { + "", "_dv", "_mv", "_mv_dv", "_ni", "_ni_dv", "_ni_dv_ns", "_ni_dv_ns_mv", + "_ni_mv", "_ni_mv_dv", "_ni_ns", "_ni_ns_mv", "_dv_ns", "_ni_ns_dv", "_dv_ns_mv", + "_smf", "_dv_smf", "_mv_smf", "_mv_dv_smf", "_ni_dv_smf", "_ni_mv_dv_smf", + "_sml", "_dv_sml", "_mv_sml", "_mv_dv_sml", "_ni_dv_sml", "_ni_mv_dv_sml" + }; + @BeforeClass public static void beforeClass() throws Exception { initCore("solrconfig.xml","schema-point.xml"); @@ -126,30 +138,44 @@ public class TestPointFields extends SolrTestCaseJ4 { public void testIntPointFieldSortAndFunction() throws Exception { final SortedSet regexToTest = dynFieldRegexesForType(IntPointField.class); - final String[] sequential = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; + final List sequential = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + final List randomInts = getRandomInts(10, false); + final List randomIntsMissing = getRandomInts(10, true); for (String r : Arrays.asList("*_p_i", "*_p_i_dv", "*_p_i_dv_ns", "*_p_i_ni_dv", "*_p_i_ni_dv_ns", "*_p_i_ni_ns_dv")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSort(r.replace("*","number"), sequential); - // TODO: test some randomly generated (then sorted) arrays (with dups and/or missing values) - - doTestIntPointFunctionQuery(r.replace("*","number"), "int"); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomInts); + doTestIntPointFunctionQuery(field, "int"); + } + for (String r : Arrays.asList("*_p_i_smf", "*_p_i_dv_smf", "*_p_i_ni_dv_smf", + "*_p_i_sml", "*_p_i_dv_sml", "*_p_i_ni_dv_sml")) { + assertTrue(r, regexToTest.remove(r)); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomIntsMissing); + doTestIntPointFunctionQuery(field, "int"); } for (String r : Arrays.asList("*_p_i_ni", "*_p_i_ni_ns")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "w/o docValues", "42"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "w/o docValues", "42"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "w/o docValues", "42"); + doTestPointFieldFunctionQueryError(field, "w/o docValues", "42"); } for (String r : Arrays.asList("*_p_i_mv", "*_p_i_ni_mv", "*_p_i_ni_mv_dv", "*_p_i_ni_dv_ns_mv", - "*_p_i_ni_ns_mv", "*_p_i_dv_ns_mv", "*_p_i_mv_dv")) { + "*_p_i_ni_ns_mv", "*_p_i_dv_ns_mv", "*_p_i_mv_dv", + "*_p_i_mv_smf", "*_p_i_mv_dv_smf", "*_p_i_ni_mv_dv_smf", + "*_p_i_mv_sml", "*_p_i_mv_dv_sml", "*_p_i_ni_mv_dv_sml")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42"); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42", "666"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42", "666"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "multivalued", "42"); + doTestPointFieldSortError(field, "multivalued", "42", "666"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42", "666"); } assertEquals("Missing types in the test", Collections.emptySet(), regexToTest); @@ -209,7 +235,7 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testIntPointFieldMultiValuedFacetField() throws Exception { testPointFieldMultiValuedFacetField("number_p_i_mv", "number_p_i_mv_dv", getSequentialStringArrayWithInts(20)); - testPointFieldMultiValuedFacetField("number_p_i_mv", "number_p_i_mv_dv", getRandomStringArrayWithInts(20, false)); + testPointFieldMultiValuedFacetField("number_p_i_mv", "number_p_i_mv_dv", toStringArray(getRandomInts(20, false))); } @Test @@ -241,12 +267,78 @@ public class TestPointFields extends SolrTestCaseJ4 { testMultiValuedIntPointFieldsAtomicUpdates("number_p_i_ni_mv_dv", "int"); testMultiValuedIntPointFieldsAtomicUpdates("number_p_i_dv_ns_mv", "int"); } - + + private String[] toStringArray(List list) { + return list.stream().map(String::valueOf).collect(Collectors.toList()).toArray(new String[list.size()]); + } + + private class PosVal > { + int pos; + T val; + + PosVal(int pos, T val) { + this.pos = pos; + this.val = val; + } + } + + /** Primary sort by value, with nulls either first or last as specified, and then secondary sort by position. */ + private > + Comparator> getPosValComparator(final boolean ascending, final boolean nullsFirst) { + return (o1, o2) -> { + if (o1.val == null) { + if (o2.val == null) { + return ascending ? Integer.compare(o1.pos, o2.pos) : Integer.compare(o2.pos, o1.pos); + } else { + return nullsFirst ? -1 : 1; + } + } else if (o2.val == null) { + return nullsFirst ? 1 : -1; + } else { + return ascending ? o1.val.compareTo(o2.val) : o2.val.compareTo(o1.val); + } + }; + } + + /** + * Primary ascending sort by value, with missing values (represented as null) either first or last as specified, + * and then secondary ascending sort by position. + */ + private > String[] toAscendingStringArray(List list, boolean missingFirst) { + return toStringArray(toAscendingPosVals(list, missingFirst).stream().map(pv -> pv.val).collect(Collectors.toList())); + } + + /** + * Primary ascending sort by value, with missing values (represented as null) either first or last as specified, + * and then secondary ascending sort by position. + * + * @return a list of the (originally) positioned values sorted as described above. + */ + private > List> toAscendingPosVals(List list, boolean missingFirst) { + List> posVals = IntStream.range(0, list.size()) + .mapToObj(i -> new PosVal<>(i, list.get(i))).collect(Collectors.toList()); + posVals.sort(getPosValComparator(true, missingFirst)); + return posVals; + } + + /** + * Primary descending sort by value, with missing values (represented as null) either first or last as specified, + * and then secondary descending sort by position. + * + * @return a list of the (originally) positioned values sorted as described above. + */ + private > List> toDescendingPosVals(List list, boolean missingFirst) { + List> posVals = IntStream.range(0, list.size()) + .mapToObj(i -> new PosVal<>(i, list.get(i))).collect(Collectors.toList()); + posVals.sort(getPosValComparator(false, missingFirst)); + return posVals; + } + @Test public void testIntPointSetQuery() throws Exception { - doTestSetQueries("number_p_i", getRandomStringArrayWithInts(20, false), false); - doTestSetQueries("number_p_i_mv", getRandomStringArrayWithInts(20, false), true); - doTestSetQueries("number_p_i_ni_dv", getRandomStringArrayWithInts(20, false), false); + doTestSetQueries("number_p_i", toStringArray(getRandomInts(20, false)), false); + doTestSetQueries("number_p_i_mv", toStringArray(getRandomInts(20, false)), true); + doTestSetQueries("number_p_i_ni_dv", toStringArray(getRandomInts(20, false)), false); } // DoublePointField @@ -300,38 +392,48 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDoublePointFieldSortAndFunction() throws Exception { final SortedSet regexToTest = dynFieldRegexesForType(DoublePointField.class); - final String[] sequential = new String[]{"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0"}; - final String[] randstrs = getRandomStringArrayWithDoubles(10, true); + final List sequential = Arrays.asList("0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0"); + List randomDoubles = getRandomDoubles(10, false); + List randomDoublesMissing = getRandomDoubles(10, true); for (String r : Arrays.asList("*_p_d", "*_p_d_dv", "*_p_d_dv_ns", "*_p_d_ni_dv", "*_p_d_ni_dv_ns", "*_p_d_ni_ns_dv")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSort(r.replace("*","number"), sequential); - doTestPointFieldSort(r.replace("*","number"), randstrs); - // TODO: test some randomly generated (then sorted) arrays (with dups and/or missing values) + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomDoubles); + doTestFloatPointFunctionQuery(field, "double"); + } - doTestFloatPointFunctionQuery(r.replace("*","number"), "double"); + for (String r : Arrays.asList("*_p_d_smf", "*_p_d_dv_smf", "*_p_d_ni_dv_smf", + "*_p_d_sml", "*_p_d_dv_sml", "*_p_d_ni_dv_sml")) { + assertTrue(r, regexToTest.remove(r)); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomDoublesMissing); + doTestFloatPointFunctionQuery(field, "double"); } for (String r : Arrays.asList("*_p_d_ni", "*_p_d_ni_ns")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "w/o docValues", "42.34"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "w/o docValues", "42.34"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "w/o docValues", "42.34"); + doTestPointFieldFunctionQueryError(field, "w/o docValues", "42.34"); } for (String r : Arrays.asList("*_p_d_mv", "*_p_d_ni_mv", "*_p_d_ni_mv_dv", "*_p_d_ni_dv_ns_mv", - "*_p_d_ni_ns_mv", "*_p_d_dv_ns_mv", "*_p_d_mv_dv")) { + "*_p_d_ni_ns_mv", "*_p_d_dv_ns_mv", "*_p_d_mv_dv", + "*_p_d_mv_smf", "*_p_d_mv_dv_smf", "*_p_d_ni_mv_dv_smf", + "*_p_d_mv_sml", "*_p_d_mv_dv_sml", "*_p_d_ni_mv_dv_sml")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42.34"); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42.34", "66.6"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42.34"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42.34", "66.6"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "multivalued", "42.34"); + doTestPointFieldSortError(field, "multivalued", "42.34", "66.6"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42.34"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42.34", "66.6"); } assertEquals("Missing types in the test", Collections.emptySet(), regexToTest); - } @Test @@ -339,7 +441,7 @@ public class TestPointFields extends SolrTestCaseJ4 { testPointFieldFacetField("number_p_d", "number_p_d_dv", getSequentialStringArrayWithDoubles(10)); clearIndex(); assertU(commit()); - testPointFieldFacetField("number_p_d", "number_p_d_dv", getRandomStringArrayWithDoubles(10, false)); + testPointFieldFacetField("number_p_d", "number_p_d_dv", toStringArray(getRandomDoubles(10, false))); } @Test @@ -357,14 +459,14 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDoublePointFieldMultiValuedExactQuery() throws Exception { - testPointFieldMultiValuedExactQuery("number_p_d_mv", getRandomStringArrayWithDoubles(20, false)); - testPointFieldMultiValuedExactQuery("number_p_d_ni_mv_dv", getRandomStringArrayWithDoubles(20, false)); + testPointFieldMultiValuedExactQuery("number_p_d_mv", toStringArray(getRandomDoubles(20, false))); + testPointFieldMultiValuedExactQuery("number_p_d_ni_mv_dv", toStringArray(getRandomDoubles(20, false))); } @Test public void testDoublePointFieldMultiValuedNonSearchableExactQuery() throws Exception { - testPointFieldMultiValuedExactQuery("number_p_d_ni_mv", getRandomStringArrayWithDoubles(20, false), false); - testPointFieldMultiValuedExactQuery("number_p_d_ni_ns_mv", getRandomStringArrayWithDoubles(20, false), false); + testPointFieldMultiValuedExactQuery("number_p_d_ni_mv", toStringArray(getRandomDoubles(20, false)), false); + testPointFieldMultiValuedExactQuery("number_p_d_ni_ns_mv", toStringArray(getRandomDoubles(20, false)), false); } @Test @@ -384,7 +486,7 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDoublePointFieldMultiValuedFacetField() throws Exception { testPointFieldMultiValuedFacetField("number_p_d_mv", "number_p_d_mv_dv", getSequentialStringArrayWithDoubles(20)); - testPointFieldMultiValuedFacetField("number_p_d_mv", "number_p_d_mv_dv", getRandomStringArrayWithDoubles(20, false)); + testPointFieldMultiValuedFacetField("number_p_d_mv", "number_p_d_mv_dv", toStringArray(getRandomDoubles(20, false))); } @Test @@ -395,7 +497,7 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDoublePointMultiValuedFunctionQuery() throws Exception { testPointMultiValuedFunctionQuery("number_p_d_mv", "number_p_d_mv_dv", "double", getSequentialStringArrayWithDoubles(20)); - testPointMultiValuedFunctionQuery("number_p_d_mv", "number_p_d_mv_dv", "double", getRandomStringArrayWithFloats(20, true)); + testPointMultiValuedFunctionQuery("number_p_d_mv", "number_p_d_mv_dv", "double", toAscendingStringArray(getRandomFloats(20, false), true)); } @Test @@ -460,9 +562,9 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDoublePointSetQuery() throws Exception { - doTestSetQueries("number_p_d", getRandomStringArrayWithDoubles(20, false), false); - doTestSetQueries("number_p_d_mv", getRandomStringArrayWithDoubles(20, false), true); - doTestSetQueries("number_p_d_ni_dv", getRandomStringArrayWithDoubles(20, false), false); + doTestSetQueries("number_p_d", toStringArray(getRandomDoubles(20, false)), false); + doTestSetQueries("number_p_d_mv", toStringArray(getRandomDoubles(20, false)), true); + doTestSetQueries("number_p_d_ni_dv", toStringArray(getRandomDoubles(20, false)), false); } // Float @@ -514,38 +616,48 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testFloatPointFieldSortAndFunction() throws Exception { final SortedSet regexToTest = dynFieldRegexesForType(FloatPointField.class); - final String[] sequential = new String[]{"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0"}; - final String[] randstrs = getRandomStringArrayWithFloats(10, true); + final List sequential = Arrays.asList("0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0"); + final List randomFloats = getRandomFloats(10, false); + final List randomFloatsMissing = getRandomFloats(10, true); - for (String r : Arrays.asList("*_p_f", "*_p_f_dv", "*_p_f_dv_ns", "*_p_f_ni_dv", + for (String r : Arrays.asList("*_p_f", "*_p_f_dv", "*_p_f_dv_ns", "*_p_f_ni_dv", "*_p_f_ni_dv_ns", "*_p_f_ni_ns_dv")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSort(r.replace("*","number"), sequential); - doTestPointFieldSort(r.replace("*","number"), randstrs); - // TODO: test some randomly generated (then sorted) arrays (with dups and/or missing values) + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomFloats); - doTestFloatPointFunctionQuery(r.replace("*","number"), "float"); + doTestFloatPointFunctionQuery(field, "float"); + } + for (String r : Arrays.asList("*_p_f_smf", "*_p_f_dv_smf", "*_p_f_ni_dv_smf", + "*_p_f_sml", "*_p_f_dv_sml", "*_p_f_ni_dv_sml")) { + assertTrue(r, regexToTest.remove(r)); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomFloatsMissing); + doTestFloatPointFunctionQuery(field, "float"); } for (String r : Arrays.asList("*_p_f_ni", "*_p_f_ni_ns")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "w/o docValues", "42.34"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "w/o docValues", "42.34"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "w/o docValues", "42.34"); + doTestPointFieldFunctionQueryError(field, "w/o docValues", "42.34"); } for (String r : Arrays.asList("*_p_f_mv", "*_p_f_ni_mv", "*_p_f_ni_mv_dv", "*_p_f_ni_dv_ns_mv", - "*_p_f_ni_ns_mv", "*_p_f_dv_ns_mv", "*_p_f_mv_dv")) { + "*_p_f_ni_ns_mv", "*_p_f_dv_ns_mv", "*_p_f_mv_dv", + "*_p_f_mv_smf", "*_p_f_mv_dv_smf", "*_p_f_ni_mv_dv_smf", + "*_p_f_mv_sml", "*_p_f_mv_dv_sml", "*_p_f_ni_mv_dv_sml")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42.34"); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "42.34", "66.6"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42.34"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "42.34", "66.6"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "multivalued", "42.34"); + doTestPointFieldSortError(field, "multivalued", "42.34", "66.6"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42.34"); + doTestPointFieldFunctionQueryError(field, "multivalued", "42.34", "66.6"); } assertEquals("Missing types in the test", Collections.emptySet(), regexToTest); - } @Test @@ -553,7 +665,7 @@ public class TestPointFields extends SolrTestCaseJ4 { testPointFieldFacetField("number_p_f", "number_p_f_dv", getSequentialStringArrayWithDoubles(10)); clearIndex(); assertU(commit()); - testPointFieldFacetField("number_p_f", "number_p_f_dv", getRandomStringArrayWithFloats(10, false)); + testPointFieldFacetField("number_p_f", "number_p_f_dv", toStringArray(getRandomFloats(10, false))); } @Test @@ -571,14 +683,14 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testFloatPointFieldMultiValuedExactQuery() throws Exception { - testPointFieldMultiValuedExactQuery("number_p_f_mv", getRandomStringArrayWithFloats(20, false)); - testPointFieldMultiValuedExactQuery("number_p_f_ni_mv_dv", getRandomStringArrayWithFloats(20, false)); + testPointFieldMultiValuedExactQuery("number_p_f_mv", toStringArray(getRandomFloats(20, false))); + testPointFieldMultiValuedExactQuery("number_p_f_ni_mv_dv", toStringArray(getRandomFloats(20, false))); } @Test public void testFloatPointFieldMultiValuedNonSearchableExactQuery() throws Exception { - testPointFieldMultiValuedExactQuery("number_p_f_ni_mv", getRandomStringArrayWithFloats(20, false), false); - testPointFieldMultiValuedExactQuery("number_p_f_ni_ns_mv", getRandomStringArrayWithFloats(20, false), false); + testPointFieldMultiValuedExactQuery("number_p_f_ni_mv", toStringArray(getRandomFloats(20, false)), false); + testPointFieldMultiValuedExactQuery("number_p_f_ni_ns_mv", toStringArray(getRandomFloats(20, false)), false); } @Test @@ -603,13 +715,13 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testFloatPointFieldMultiValuedFacetField() throws Exception { testPointFieldMultiValuedFacetField("number_p_f_mv", "number_p_f_mv_dv", getSequentialStringArrayWithDoubles(20)); - testPointFieldMultiValuedFacetField("number_p_f_mv", "number_p_f_mv_dv", getRandomStringArrayWithFloats(20, false)); + testPointFieldMultiValuedFacetField("number_p_f_mv", "number_p_f_mv_dv", toStringArray(getRandomFloats(20, false))); } @Test public void testFloatPointMultiValuedFunctionQuery() throws Exception { testPointMultiValuedFunctionQuery("number_p_f_mv", "number_p_f_mv_dv", "float", getSequentialStringArrayWithDoubles(20)); - testPointMultiValuedFunctionQuery("number_p_f_mv", "number_p_f_mv_dv", "float", getRandomStringArrayWithFloats(20, true)); + testPointMultiValuedFunctionQuery("number_p_f_mv", "number_p_f_mv_dv", "float", toAscendingStringArray(getRandomFloats(20, false), true)); } @@ -635,9 +747,9 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testFloatPointSetQuery() throws Exception { - doTestSetQueries("number_p_f", getRandomStringArrayWithFloats(20, false), false); - doTestSetQueries("number_p_f_mv", getRandomStringArrayWithFloats(20, false), true); - doTestSetQueries("number_p_f_ni_dv", getRandomStringArrayWithFloats(20, false), false); + doTestSetQueries("number_p_f", toStringArray(getRandomFloats(20, false)), false); + doTestSetQueries("number_p_f_mv", toStringArray(getRandomFloats(20, false)), true); + doTestSetQueries("number_p_f_ni_dv", toStringArray(getRandomFloats(20, false)), false); } @Test @@ -689,36 +801,50 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testLongPointFieldSortAndFunction() throws Exception { final SortedSet regexToTest = dynFieldRegexesForType(LongPointField.class); - final String[] vals = new String[]{ String.valueOf(Integer.MIN_VALUE), - "1", "2", "3", "4", "5", "6", "7", - String.valueOf(Integer.MAX_VALUE), String.valueOf(Long.MAX_VALUE)}; + final List vals = Arrays.asList((long)Integer.MIN_VALUE, + 1L, 2L, 3L, 4L, 5L, 6L, 7L, + (long)Integer.MAX_VALUE, Long.MAX_VALUE); + final List randomLongs = getRandomLongs(10, false); + final List randomLongsMissing = getRandomLongs(10, true); for (String r : Arrays.asList("*_p_l", "*_p_l_dv", "*_p_l_dv_ns", "*_p_l_ni_dv", "*_p_l_ni_dv_ns", "*_p_l_ni_ns_dv")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSort(r.replace("*","number"), vals); - // TODO: test some randomly generated (then sorted) arrays (with dups and/or missing values) - - doTestIntPointFunctionQuery(r.replace("*","number"), "long"); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, vals); + doTestPointFieldSort(field, randomLongs); + doTestIntPointFunctionQuery(field, "long"); } - + + for (String r : Arrays.asList("*_p_l_smf", "*_p_l_dv_smf", "*_p_l_ni_dv_smf", + "*_p_l_sml", "*_p_l_dv_sml", "*_p_l_ni_dv_sml")) { + assertTrue(r, regexToTest.remove(r)); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, vals); + doTestPointFieldSort(field, randomLongsMissing); + doTestIntPointFunctionQuery(field, "long"); + } + for (String r : Arrays.asList("*_p_l_ni", "*_p_l_ni_ns")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "w/o docValues", "4234"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "w/o docValues", "4234"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "w/o docValues", "4234"); + doTestPointFieldFunctionQueryError(field, "w/o docValues", "4234"); } for (String r : Arrays.asList("*_p_l_mv", "*_p_l_ni_mv", "*_p_l_ni_mv_dv", "*_p_l_ni_dv_ns_mv", - "*_p_l_ni_ns_mv", "*_p_l_dv_ns_mv", "*_p_l_mv_dv")) { + "*_p_l_ni_ns_mv", "*_p_l_dv_ns_mv", "*_p_l_mv_dv", + "*_p_l_mv_smf", "*_p_l_mv_dv_smf", "*_p_l_ni_mv_dv_smf", + "*_p_l_mv_sml", "*_p_l_mv_dv_sml", "*_p_l_ni_mv_dv_sml")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "4234"); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "4234", "66666666"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "4234"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "4234", "66666666"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "multivalued", "4234"); + doTestPointFieldSortError(field, "multivalued", "4234", "66666666"); + doTestPointFieldFunctionQueryError(field, "multivalued", "4234"); + doTestPointFieldFunctionQueryError(field, "multivalued", "4234", "66666666"); } assertEquals("Missing types in the test", Collections.emptySet(), regexToTest); - } @Test @@ -726,7 +852,7 @@ public class TestPointFields extends SolrTestCaseJ4 { testPointFieldFacetField("number_p_l", "number_p_l_dv", getSequentialStringArrayWithInts(10)); clearIndex(); assertU(commit()); - testPointFieldFacetField("number_p_l", "number_p_l_dv", getRandomStringArrayWithLongs(10, true)); + testPointFieldFacetField("number_p_l", "number_p_l_dv", toStringArray(getRandomLongs(10, false))); } @Test @@ -771,7 +897,7 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testLongPointFieldMultiValuedFacetField() throws Exception { testPointFieldMultiValuedFacetField("number_p_l_mv", "number_p_l_mv_dv", getSequentialStringArrayWithInts(20)); - testPointFieldMultiValuedFacetField("number_p_l_mv", "number_p_l_mv_dv", getRandomStringArrayWithLongs(20, false)); + testPointFieldMultiValuedFacetField("number_p_l_mv", "number_p_l_mv_dv", toStringArray(getRandomLongs(20, false))); } @Test @@ -806,9 +932,9 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testLongPointSetQuery() throws Exception { - doTestSetQueries("number_p_l", getRandomStringArrayWithLongs(20, false), false); - doTestSetQueries("number_p_l_mv", getRandomStringArrayWithLongs(20, false), true); - doTestSetQueries("number_p_l_ni_dv", getRandomStringArrayWithLongs(20, false), false); + doTestSetQueries("number_p_l", toStringArray(getRandomLongs(20, false)), false); + doTestSetQueries("number_p_l_mv", toStringArray(getRandomLongs(20, false)), true); + doTestSetQueries("number_p_l_ni_dv", toStringArray(getRandomLongs(20, false)), false); } @Test @@ -862,37 +988,48 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDatePointFieldSortAndFunction() throws Exception { final SortedSet regexToTest = dynFieldRegexesForType(DatePointField.class); - final String[] sequential = getSequentialStringArrayWithDates(10); + final List sequential = Arrays.asList(getSequentialStringArrayWithDates(10)); + final List randomDates = getRandomInstants(10, false); + final List randomDatesMissing = getRandomInstants(10, true); for (String r : Arrays.asList("*_p_dt", "*_p_dt_dv", "*_p_dt_dv_ns", "*_p_dt_ni_dv", "*_p_dt_ni_dv_ns", "*_p_dt_ni_ns_dv")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSort(r.replace("*","number"), sequential); - // TODO: test some randomly generated (then sorted) arrays (with dups and/or missing values) - - doTestDatePointFunctionQuery(r.replace("*","number"), "date"); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomDates); + doTestDatePointFunctionQuery(field, "date"); + } + for (String r : Arrays.asList("*_p_dt_smf", "*_p_dt_dv_smf", "*_p_dt_ni_dv_smf", + "*_p_dt_sml", "*_p_dt_dv_sml", "*_p_dt_ni_dv_sml")) { + assertTrue(r, regexToTest.remove(r)); + String field = r.replace("*", "number"); + doTestPointFieldSort(field, sequential); + doTestPointFieldSort(field, randomDatesMissing); + doTestDatePointFunctionQuery(field, "date"); } for (String r : Arrays.asList("*_p_dt_ni", "*_p_dt_ni_ns")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "w/o docValues", "1995-12-31T23:59:59Z"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "w/o docValues", "1995-12-31T23:59:59Z"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "w/o docValues", "1995-12-31T23:59:59Z"); + doTestPointFieldFunctionQueryError(field, "w/o docValues", "1995-12-31T23:59:59Z"); } for (String r : Arrays.asList("*_p_dt_mv", "*_p_dt_ni_mv", "*_p_dt_ni_mv_dv", "*_p_dt_ni_dv_ns_mv", - "*_p_dt_ni_ns_mv", "*_p_dt_dv_ns_mv", "*_p_dt_mv_dv")) { + "*_p_dt_ni_ns_mv", "*_p_dt_dv_ns_mv", "*_p_dt_mv_dv", + "*_p_dt_mv_smf", "*_p_dt_mv_dv_smf", "*_p_dt_ni_mv_dv_smf", + "*_p_dt_mv_sml", "*_p_dt_mv_dv_sml", "*_p_dt_ni_mv_dv_sml")) { assertTrue(r, regexToTest.remove(r)); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "1995-12-31T23:59:59Z"); - doTestPointFieldSortError(r.replace("*","number"), "multivalued", "1995-12-31T23:59:59Z", "2000-12-31T23:59:59Z"); - - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "1995-12-31T23:59:59Z"); - doTestPointFieldFunctionQueryError(r.replace("*","number"), "multivalued", "1995-12-31T23:59:59Z", "2000-12-31T23:59:59Z"); + String field = r.replace("*", "number"); + doTestPointFieldSortError(field, "multivalued", "1995-12-31T23:59:59Z"); + doTestPointFieldSortError(field, "multivalued", "1995-12-31T23:59:59Z", "2000-12-31T23:59:59Z"); + doTestPointFieldFunctionQueryError(field, "multivalued", "1995-12-31T23:59:59Z"); + doTestPointFieldFunctionQueryError(field, "multivalued", "1995-12-31T23:59:59Z", "2000-12-31T23:59:59Z"); } assertEquals("Missing types in the test", Collections.emptySet(), regexToTest); - } @Test @@ -942,7 +1079,7 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDatePointFieldMultiValuedFacetField() throws Exception { testPointFieldMultiValuedFacetField("number_p_dt_mv", "number_p_dt_mv_dv", getSequentialStringArrayWithDates(20)); - testPointFieldMultiValuedFacetField("number_p_dt_mv", "number_p_dt_mv_dv", getRandomStringArrayWithDates(20, false)); + testPointFieldMultiValuedFacetField("number_p_dt_mv", "number_p_dt_mv_dv", toStringArray(getRandomInstants(20, false))); } @Test @@ -977,9 +1114,9 @@ public class TestPointFields extends SolrTestCaseJ4 { @Test public void testDatePointSetQuery() throws Exception { - doTestSetQueries("number_p_dt", getRandomStringArrayWithDates(20, false), false); - doTestSetQueries("number_p_dt_mv", getRandomStringArrayWithDates(20, false), true); - doTestSetQueries("number_p_dt_ni_dv", getRandomStringArrayWithDates(20, false), false); + doTestSetQueries("number_p_dt", toStringArray(getRandomInstants(20, false)), false); + doTestSetQueries("number_p_dt_mv", toStringArray(getRandomInstants(20, false)), true); + doTestSetQueries("number_p_dt_ni_dv", toStringArray(getRandomInstants(20, false)), false); } @@ -1012,15 +1149,14 @@ public class TestPointFields extends SolrTestCaseJ4 { public void testInternals() throws IOException { String[] types = new String[]{"i", "l", "f", "d"}; - String[] suffixes = new String[]{"", "_dv", "_mv", "_mv_dv", "_ni", "_ni_dv", "_ni_dv_ns", "_ni_dv_ns_mv", "_ni_mv", "_ni_mv_dv", "_ni_ns", "_ni_ns_mv", "_dv_ns", "_ni_ns_dv", "_dv_ns_mv"}; Set typesTested = new HashSet<>(); for (String type:types) { - for (String suffix:suffixes) { + for (String suffix:FIELD_SUFFIXES) { doTestInternals("number_p_" + type + suffix, getSequentialStringArrayWithInts(10)); typesTested.add("*_p_" + type + suffix); } } - for (String suffix:suffixes) { + for (String suffix:FIELD_SUFFIXES) { doTestInternals("number_p_dt" + suffix, getSequentialStringArrayWithDates(10)); typesTested.add("*_p_dt" + suffix); } @@ -1047,50 +1183,39 @@ public class TestPointFields extends SolrTestCaseJ4 { return typesToTest; } - private String[] getRandomStringArrayWithDoubles(int length, boolean sorted) { - Set set; - if (sorted) { - set = new TreeSet<>(); - } else { - set = new HashSet<>(); - } - while (set.size() < length) { - double f = random().nextDouble() * (Double.MAX_VALUE/2); - if (random().nextBoolean()) { - f = f * -1; + private List getRandomList(int length, boolean missingVals, Supplier randomVal) { + List list = new ArrayList<>(length); + for (int i = 0 ; i < length ; ++i) { + T val = null; + // Sometimes leave val as null when we're producing missing values + if (missingVals == false || usually()) { + val = randomVal.get(); } - set.add(f); + list.add(val); } - String[] stringArr = new String[length]; - int i = 0; - for (double val:set) { - stringArr[i] = String.valueOf(val); - i++; - } - return stringArr; + return list; } - - private String[] getRandomStringArrayWithFloats(int length, boolean sorted) { - Set set; - if (sorted) { - set = new TreeSet<>(); - } else { - set = new HashSet<>(); - } - while (set.size() < length) { - float f = random().nextFloat() * (Float.MAX_VALUE/2); - if (random().nextBoolean()) { - f = f * -1; - } - set.add(f); - } - String[] stringArr = new String[length]; - int i = 0; - for (float val:set) { - stringArr[i] = String.valueOf(val); - i++; - } - return stringArr; + + private List getRandomDoubles(int length, boolean missingVals) { + return getRandomList(length, missingVals, + () -> random().nextDouble() * Double.MAX_VALUE * (random().nextBoolean() ? 1.D : -1.D)); + } + + private List getRandomFloats(int length, boolean missingVals) { + return getRandomList(length, missingVals, + () -> random().nextFloat() * Float.MAX_VALUE * (random().nextBoolean() ? 1.f : -1.f)); + } + + private List getRandomInts(int length, boolean missingVals) { + return getRandomList(length, missingVals, () -> random().nextInt()); + } + + private List getRandomLongs(int length, boolean missingVals){ + return getRandomList(length, missingVals, () -> random().nextLong()); + } + + private List getRandomInstants(int length, boolean missingVals){ + return getRandomList(length, missingVals, () -> Instant.ofEpochMilli(random().nextLong())); } private String[] getSequentialStringArrayWithInts(int length) { @@ -1117,74 +1242,7 @@ public class TestPointFields extends SolrTestCaseJ4 { } return arr; } - - private String[] getRandomStringArrayWithInts(int length, boolean sorted) { - Set set; - if (sorted) { - set = new TreeSet<>(); - } else { - set = new HashSet<>(); - } - while (set.size() < length) { - int number = random().nextInt(100); - if (random().nextBoolean()) { - number = number * -1; - } - set.add(number); - } - String[] stringArr = new String[length]; - int i = 0; - for (int val:set) { - stringArr[i] = String.valueOf(val); - i++; - } - return stringArr; - } - - private String[] getRandomStringArrayWithLongs(int length, boolean sorted) { - Set set; - if (sorted) { - set = new TreeSet<>(); - } else { - set = new HashSet<>(); - } - while (set.size() < length) { - long number = random().nextLong(); - if (random().nextBoolean()) { - number = number * -1; - } - set.add(number); - } - String[] stringArr = new String[length]; - int i = 0; - for (long val:set) { - stringArr[i] = String.valueOf(val); - i++; - } - return stringArr; - } - private String[] getRandomStringArrayWithDates(int length, boolean sorted) { - assert length < 60; - Set set; - if (sorted) { - set = new TreeSet<>(); - } else { - set = new HashSet<>(); - } - while (set.size() < length) { - int number = random().nextInt(60); - set.add(number); - } - String[] stringArr = new String[length]; - int i = 0; - for (int val:set) { - stringArr[i] = String.format(Locale.ROOT, "1995-12-11T19:59:%02dZ", val); - i++; - } - return stringArr; - } - private void doTestFieldNotIndexed(String field, String[] values) throws IOException { assert values.length == 10; // test preconditions @@ -1379,9 +1437,9 @@ public class TestPointFields extends SolrTestCaseJ4 { String[] arr; if (testLong) { - arr = getRandomStringArrayWithLongs(100, true); + arr = toAscendingStringArray(getRandomLongs(100, false), true); } else { - arr = getRandomStringArrayWithInts(100, true); + arr = toAscendingStringArray(getRandomInts(100, false), true); } for (int i = 0; i < arr.length; i++) { assertU(adoc("id", String.valueOf(i), fieldName, arr[i])); @@ -1423,14 +1481,6 @@ public class TestPointFields extends SolrTestCaseJ4 { "//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int[@name='" + numbers[2] + "'][.='1']", "//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int[@name='" + numbers[3] + "'][.='1']"); -// assertU(commit()); -// assertQ(req("q", "id:0", "fl", "id, " + docValuesField, "facet", "true", "facet.field", docValuesField, "facet.mincount", "0"), -// "//*[@numFound='1']", -// "//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int[@name='" + numbers[0] + "'][.='1']", -// "//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int[@name='" + numbers[1] + "'][.='0']", -// "//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int[@name='" + numbers[2] + "'][.='0']", -// "count(//lst[@name='facet_counts']/lst[@name='facet_fields']/lst[@name='" + docValuesField +"']/int))==10"); - assertFalse(h.getCore().getLatestSchema().getField(nonDocValuesField).hasDocValues()); assertTrue(h.getCore().getLatestSchema().getField(nonDocValuesField).getType() instanceof PointField); assertQEx("Expecting Exception", @@ -1875,13 +1925,6 @@ public class TestPointFields extends SolrTestCaseJ4 { assertTrue(h.getCore().getLatestSchema().getField(docValuesField).getType() instanceof PointField); String function = "field(" + docValuesField + ", min)"; -// assertQ(req("q", "*:*", "fl", "id, " + function), -// "//*[@numFound='10']", -// "//result/doc[1]/" + type + "[@name='" + function + "'][.='" + numbers[0] + "']", -// "//result/doc[2]/" + type + "[@name='" + function + "'][.='" + numbers[1] + "']", -// "//result/doc[3]/" + type + "[@name='" + function + "'][.='" + numbers[2] + "']", -// "//result/doc[10]/" + type + "[@name='" + function + "'][.='" + numbers[9] + "']"); - assertQ(req("q", "*:*", "fl", "id, " + docValuesField, "sort", function + " desc"), "//*[@numFound='10']", "//result/doc[1]/str[@name='id'][.='9']", @@ -2063,27 +2106,32 @@ public class TestPointFields extends SolrTestCaseJ4 { * @param field name of field to sort on * @param values list of values in ascending order */ - private void doTestPointFieldSort(String field, String... values) throws Exception { - assert values != null && 2 <= values.length; - - // TODO: need to add sort missing coverage... - // - // idea: accept "null" as possible value for sort missing tests ? - // - // need to account for possibility that multiple nulls will be in non deterministic order - // always using secondary sort on id seems prudent ... handles any "dups" in values[] + private > void doTestPointFieldSort(String field, List values) throws Exception { + assert values != null && 2 <= values.size(); + + final List docs = new ArrayList<>(values.size()); + final String[] ascXpathChecks = new String[values.size() + 1]; + final String[] descXpathChecks = new String[values.size() + 1]; + ascXpathChecks[values.size()] = "//*[@numFound='" + values.size() + "']"; + descXpathChecks[values.size()] = "//*[@numFound='" + values.size() + "']"; - final List docs = new ArrayList<>(values.length); - final String[] ascXpathChecks = new String[values.length + 1]; - final String[] descXpathChecks = new String[values.length + 1]; - ascXpathChecks[values.length] = "//*[@numFound='" + values.length + "']"; - descXpathChecks[values.length] = "//*[@numFound='" + values.length + "']"; + boolean missingFirst = field.endsWith("_sml") == false; - for (int i = values.length-1; i >= 0; i--) { - docs.add(sdoc("id", String.valueOf(i), field, String.valueOf(values[i]))); + List> ascendingPosVals = toAscendingPosVals(values, missingFirst); + for (int i = ascendingPosVals.size() - 1 ; i >= 0 ; --i) { + T value = ascendingPosVals.get(i).val; + if (value == null) { + docs.add(sdoc("id", String.valueOf(i))); // null => missing value + } else { + docs.add(sdoc("id", String.valueOf(i), field, String.valueOf(value))); + } // reminder: xpath array indexes start at 1 ascXpathChecks[i]= "//result/doc["+ (1 + i)+"]/str[@name='id'][.='"+i+"']"; - descXpathChecks[i]= "//result/doc["+ (values.length - i) +"]/str[@name='id'][.='"+i+"']"; + } + List> descendingPosVals = toDescendingPosVals + (ascendingPosVals.stream().map(pv->pv.val).collect(Collectors.toList()), missingFirst); + for (int i = descendingPosVals.size() - 1 ; i >= 0 ; --i) { + descXpathChecks[i]= "//result/doc[" + (i + 1) + "]/str[@name='id'][.='" + descendingPosVals.get(i).pos + "']"; } // ensure doc add order doesn't affect results @@ -2093,11 +2141,10 @@ public class TestPointFields extends SolrTestCaseJ4 { } assertU(commit()); - assertQ(req("q", "*:*", "fl", "id", "sort", field + " asc"), + assertQ(req("q", "*:*", "fl", "id, " + field, "sort", field + " asc, id asc"), ascXpathChecks); - assertQ(req("q", "*:*", "fl", "id", "sort", field + " desc"), + assertQ(req("q", "*:*", "fl", "id, " + field, "sort", field + " desc, id desc"), descXpathChecks); - clearIndex(); assertU(commit()); @@ -2200,9 +2247,9 @@ public class TestPointFields extends SolrTestCaseJ4 { String[] arr; if (testDouble) { - arr = getRandomStringArrayWithDoubles(10, true); + arr = toAscendingStringArray(getRandomDoubles(10, false), true); } else { - arr = getRandomStringArrayWithFloats(10, true); + arr = toAscendingStringArray(getRandomFloats(10, false), true); } for (int i = 0; i < arr.length; i++) { assertU(adoc("id", String.valueOf(i), fieldName, arr[i])); @@ -2316,7 +2363,7 @@ public class TestPointFields extends SolrTestCaseJ4 { StringBuilder builder = new StringBuilder(fieldName + ":("); for (int i = 0; i < numTerms; i++) { if (sf.getType().getNumberType() == NumberType.DATE) { - builder.append(String.valueOf(values[i]).replace(":", "\\:") + ' '); + builder.append(values[i].replaceAll("(:|^[-+])", "\\\\$1") + ' '); } else { builder.append(String.valueOf(values[i]).replace("-", "\\-") + ' '); } @@ -2327,7 +2374,7 @@ public class TestPointFields extends SolrTestCaseJ4 { "//*[@numFound='" + numTerms + "']", "//*[@name='parsed_filter_queries']/str[.='(" + getSetQueryToString(fieldName, values, numTerms) + ")']"); } else { - // Won't use PointInSetQuery if the fiels is not indexed, but should match the same docs + // Won't use PointInSetQuery if the field is not indexed, but should match the same docs assertQ(req(CommonParams.DEBUG, CommonParams.QUERY, "q", "*:*", "fq", builder.toString(), "fl", "id," + fieldName), "//*[@numFound='" + numTerms + "']"); } @@ -2990,7 +3037,6 @@ public class TestPointFields extends SolrTestCaseJ4 { public void testWhiteboxCreateFields() throws Exception { String[] typeNames = new String[]{"i", "l", "f", "d", "dt"}; - String[] suffixes = new String[]{"", "_dv", "_mv", "_mv_dv", "_ni", "_ni_dv", "_ni_dv_ns", "_ni_dv_ns_mv", "_ni_mv", "_ni_mv_dv", "_ni_ns", "_ni_ns_mv", "_dv_ns", "_ni_ns_dv", "_dv_ns_mv"}; Class[] expectedClasses = new Class[]{IntPoint.class, LongPoint.class, FloatPoint.class, DoublePoint.class, LongPoint.class}; Date dateToTest = new Date(); @@ -3004,7 +3050,7 @@ public class TestPointFields extends SolrTestCaseJ4 { Set typesTested = new HashSet<>(); for (int i = 0; i < typeNames.length; i++) { - for (String suffix:suffixes) { + for (String suffix:FIELD_SUFFIXES) { doWhiteboxCreateFields("whitebox_p_" + typeNames[i] + suffix, expectedClasses[i], values[i]); typesTested.add("*_p_" + typeNames[i] + suffix); }