You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by md...@apache.org on 2021/12/07 15:49:52 UTC

[lucene-solr] branch branch_8_11 updated: SOLR-15833 Spatial types should work with exists query (#2624)

This is an automated email from the ASF dual-hosted git repository.

mdrob pushed a commit to branch branch_8_11
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8_11 by this push:
     new 187fc9c  SOLR-15833 Spatial types should work with exists query (#2624)
187fc9c is described below

commit 187fc9c1b0054d92f9c842cfe4b8d8cb2fbd5a4b
Author: Mike Drob <md...@apache.org>
AuthorDate: Tue Dec 7 09:49:27 2021 -0600

    SOLR-15833 Spatial types should work with exists query (#2624)
    
    Co-Authored-By: Houston Putman <ho...@apache.org>
---
 solr/CHANGES.txt                                           |  2 ++
 .../org/apache/solr/schema/AbstractSpatialFieldType.java   |  9 +++++++++
 .../org/apache/solr/schema/ExternalFileFieldSortTest.java  |  2 ++
 .../src/test/org/apache/solr/search/TestSolr4Spatial.java  |  5 +++++
 .../test/org/apache/solr/search/TestSolrQueryParser.java   | 14 +++++++-------
 5 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9c81dfb..b01727d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -37,6 +37,8 @@ Bug Fixes
 
 * SOLR-15199: Pass thru all command actions not explicitly handled by the bin/solr script, such as 'api', to the SolrCLI Java app (Timothy Potter)
 
+* SOLR-15833: Enable exists queries on spatial types. (Mike Drob, Houston Putman)
+
 ==================  8.11.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
diff --git a/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java b/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
index da21a53..2d1eaab 100644
--- a/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
+++ b/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
@@ -34,12 +34,14 @@ import com.google.common.cache.CacheBuilder;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.StoredField;
 import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.Term;
 import org.apache.lucene.queries.function.FunctionScoreQuery;
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.DoubleValuesSource;
 import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.SortField;
 import org.apache.lucene.spatial.SpatialStrategy;
@@ -336,6 +338,13 @@ public abstract class AbstractSpatialFieldType<T extends SpatialStrategy> extend
   }
 
   @Override
+  protected Query getSpecializedExistenceQuery(QParser parser, SchemaField field) {
+    PrefixQuery query = new PrefixQuery(new Term(field.getName(), ""));
+    query.setRewriteMethod(field.getType().getRewriteMethod(parser, field));
+    return query;
+  }
+
+  @Override
   public Query getFieldQuery(QParser parser, SchemaField field, String externalVal) {
     return getQueryFromSpatialArgs(parser, field, parseSpatialArgs(parser, externalVal));
   }
diff --git a/solr/core/src/test/org/apache/solr/schema/ExternalFileFieldSortTest.java b/solr/core/src/test/org/apache/solr/schema/ExternalFileFieldSortTest.java
index 632b413..ee56edb 100644
--- a/solr/core/src/test/org/apache/solr/schema/ExternalFileFieldSortTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/ExternalFileFieldSortTest.java
@@ -52,6 +52,8 @@ public class ExternalFileFieldSortTest extends SolrTestCaseJ4 {
         "//result/doc[position()=1]/str[.='3']",
         "//result/doc[position()=2]/str[.='1']",
         "//result/doc[position()=10]/str[.='8']");
+
+    assertQ("test exists", req("q", "*:*", "sort", "exists(eff) desc"));
   }
   
   @Test
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
index 7722664..dfc3d82 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial.java
@@ -172,6 +172,11 @@ public class TestSolr4Spatial extends SolrTestCaseJ4 {
     checkHits(fieldName, "0,0", 100, DistanceUtils.EARTH_MEAN_RADIUS_KM, 0);//doesn't error
   }
 
+  @Test
+  public void testExistsQuery() {
+    assertQ(req("q", fieldName + ":*", "fl", "id," + fieldName));
+  }
+
   private void checkHits(String fieldName, String pt, double distKM, double sphereRadius, int count, int ... docIds) throws ParseException {
     checkHits(fieldName, true, pt, distKM, sphereRadius, count, docIds);
   }
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
index c563981..21e0b34 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
@@ -1478,13 +1478,13 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
   public void testFieldExistsQueries() throws SyntaxError {
     SolrQueryRequest req = req();
     String[] fieldSuffix = new String[] {
-        "ti", "tf", "td", "tl", "tdt",
-        "pi", "pf", "pd", "pl", "pdt",
-        "i", "f", "d", "l", "dt", "s", "b",
-        "is", "fs", "ds", "ls", "dts", "ss", "bs",
-        "i_dv", "f_dv", "d_dv", "l_dv", "dt_dv", "s_dv", "b_dv",
-        "is_dv", "fs_dv", "ds_dv", "ls_dv", "dts_dv", "ss_dv", "bs_dv",
-        "i_dvo", "f_dvo", "d_dvo", "l_dvo", "dt_dvo",
+        "ti", "tf", "td", "tl", "tdt", // trie types
+        "pi", "pf", "pd", "pl", "pdt", // point types
+        "i", "f", "d", "l", "dt", "s", "b", // numeric types
+        "is", "fs", "ds", "ls", "dts", "ss", "bs", // multi-valued
+        "i_dv", "f_dv", "d_dv", "l_dv", "dt_dv", "s_dv", "b_dv", // numerics + docValues
+        "is_dv", "fs_dv", "ds_dv", "ls_dv", "dts_dv", "ss_dv", "bs_dv", // multi-docValues
+        "i_dvo", "f_dvo", "d_dvo", "l_dvo", "dt_dvo", // not indexed
         "t",
         "t_on", "b_norms", "s_norms", "dt_norms", "i_norms", "l_norms", "f_norms", "d_norms"
     };