You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by iv...@apache.org on 2020/11/25 07:46:59 UTC

[lucene-solr] branch branch_8x updated: LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query (#2093)

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

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


The following commit(s) were added to refs/heads/branch_8x by this push:
     new b8239d2  LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query (#2093)
b8239d2 is described below

commit b8239d2f799a668548d10a75ce8be3e652fef804
Author: Ignacio Vera <iv...@apache.org>
AuthorDate: Wed Nov 25 08:40:38 2020 +0100

    LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query (#2093)
---
 lucene/CHANGES.txt                                 |  2 ++
 .../org/apache/lucene/document/LatLonShape.java    |  3 ++-
 .../java/org/apache/lucene/document/XYShape.java   |  3 ++-
 .../apache/lucene/document/TestLatLonShape.java    | 28 ++++++++++++++++++++++
 .../org/apache/lucene/document/TestXYShape.java    | 28 ++++++++++++++++++++++
 5 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index cebafc7..cd5117d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -52,6 +52,8 @@ Bug Fixes
 
 * LUCENE-9595: Make Component2D#withinPoint implementations consistent with ShapeQuery logic.
   (Ignacio Vera)   
+
+* LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query. (Ignacio Vera)  
   
 Other
 ---------------------
diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java b/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
index 134b7d9..5e442dd 100644
--- a/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
+++ b/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
@@ -32,6 +32,7 @@ import org.apache.lucene.geo.Tessellator;
 import org.apache.lucene.index.PointValues; // javadoc
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.search.Query;
 
 import static org.apache.lucene.geo.GeoEncodingUtils.encodeLatitude;
@@ -170,7 +171,7 @@ public class LatLonShape {
         builder.add(new LatLonShapeQuery(field, QueryRelation.CONTAINS, geometry), BooleanClause.Occur.MUST);
       }
     }
-    return builder.build();
+    return new ConstantScoreQuery(builder.build());
   }
 
 }
diff --git a/lucene/core/src/java/org/apache/lucene/document/XYShape.java b/lucene/core/src/java/org/apache/lucene/document/XYShape.java
index 7eb8403..fa24a78 100644
--- a/lucene/core/src/java/org/apache/lucene/document/XYShape.java
+++ b/lucene/core/src/java/org/apache/lucene/document/XYShape.java
@@ -31,6 +31,7 @@ import org.apache.lucene.geo.XYLine;
 import org.apache.lucene.geo.XYPolygon;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.search.Query;
 
 import static org.apache.lucene.geo.XYEncodingUtils.encode;
@@ -132,7 +133,7 @@ public class XYShape {
       for (int i = 0; i < xyGeometries.length; i++) {
         builder.add(newGeometryQuery(field, queryRelation, xyGeometries[i]), BooleanClause.Occur.MUST);
       }
-      return builder.build();
+      return new ConstantScoreQuery(builder.build());
     }
     return new XYShapeQuery(field, queryRelation, xyGeometries);
   }
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java b/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
index 9773ffb..a712ac6 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
@@ -25,6 +25,7 @@ import org.apache.lucene.geo.GeoTestUtil;
 import org.apache.lucene.geo.GeoUtils;
 import org.apache.lucene.geo.LatLonGeometry;
 import org.apache.lucene.geo.Line;
+import org.apache.lucene.geo.Point;
 import org.apache.lucene.geo.Polygon;
 import org.apache.lucene.geo.Rectangle;
 import org.apache.lucene.geo.Tessellator;
@@ -36,6 +37,7 @@ import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.SerialMergeScheduler;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
@@ -829,6 +831,32 @@ public class TestLatLonShape extends LuceneTestCase {
     IOUtils.close(r, dir);
   }
 
+  public void testContainsWrappingBooleanQuery() throws Exception {
+
+    double[] lats = new double[] {-30, -30, 30, 30, -30};
+    double[] lons = new double[] {-30, 30, 30, -30, -30};
+    Polygon polygon = new Polygon(lats, lons);
+
+    Directory dir = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+    Document document = new Document();
+    addPolygonsToDoc(FIELDNAME, document, polygon);
+    writer.addDocument(document);
+
+    //// search
+    IndexReader r = writer.getReader();
+    writer.close();
+    IndexSearcher s = newSearcher(r);
+
+    LatLonGeometry[] geometries = new LatLonGeometry[] { new Rectangle(0, 1, 0, 1), new Point(4, 4) };
+    // geometries within the polygon
+    Query q = LatLonShape.newGeometryQuery(FIELDNAME, QueryRelation.CONTAINS, geometries);
+    TopDocs topDocs = s.search(q, 1);
+    assertEquals(1, topDocs.scoreDocs.length);
+    assertEquals(1.0, topDocs.scoreDocs[0].score, 0.0);
+    IOUtils.close(r, dir);
+  }
+
   public void testContainsIndexedGeometryCollection() throws Exception {
     Directory dir = newDirectory();
     RandomIndexWriter w = new RandomIndexWriter(random(), dir);
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java b/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
index 3a90977..2bf27fe 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
@@ -25,12 +25,14 @@ import org.apache.lucene.geo.Tessellator;
 import org.apache.lucene.geo.XYCircle;
 import org.apache.lucene.geo.XYGeometry;
 import org.apache.lucene.geo.XYLine;
+import org.apache.lucene.geo.XYPoint;
 import org.apache.lucene.geo.XYPolygon;
 import org.apache.lucene.geo.XYRectangle;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
@@ -202,6 +204,32 @@ public class TestXYShape extends LuceneTestCase {
     IOUtils.close(r, dir);
   }
 
+  public void testContainsWrappingBooleanQuery() throws Exception {
+
+    float[] ys = new float[] {-30, -30, 30, 30, -30};
+    float[] xs = new float[] {-30, 30, 30, -30, -30};
+    XYPolygon polygon = new XYPolygon(xs, ys);
+
+    Directory dir = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+    Document document = new Document();
+    addPolygonsToDoc(FIELDNAME, document, polygon);
+    writer.addDocument(document);
+
+    //// search
+    IndexReader r = writer.getReader();
+    writer.close();
+    IndexSearcher s = newSearcher(r);
+
+    XYGeometry[] geometries = new XYGeometry[] { new XYRectangle(0, 1, 0, 1), new XYPoint(4, 4) };
+    // geometries within the polygon
+    Query q = XYShape.newGeometryQuery(FIELDNAME, QueryRelation.CONTAINS, geometries);
+    TopDocs topDocs = s.search(q, 1);
+    assertEquals(1, topDocs.scoreDocs.length);
+    assertEquals(1.0, topDocs.scoreDocs[0].score, 0.0);
+    IOUtils.close(r, dir);
+  }
+
   public void testContainsIndexedGeometryCollection() throws Exception {
     Directory dir = newDirectory();
     RandomIndexWriter w = new RandomIndexWriter(random(), dir);