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/12/14 11:17:05 UTC

[lucene-solr] branch branch_8x updated: LUCENE-9552: make sure we don't construct Illegal rectangles due to quantization (#2131)

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 85e73bd  LUCENE-9552: make sure we don't construct Illegal rectangles due to quantization (#2131)
85e73bd is described below

commit 85e73bd0fc7d8cc4e7280972c72d0b15506d05b4
Author: Ignacio Vera <iv...@apache.org>
AuthorDate: Mon Dec 14 12:15:54 2020 +0100

    LUCENE-9552: make sure we don't construct Illegal rectangles due to quantization (#2131)
---
 .../LatLonDocValuesPointInGeometryQuery.java       | 24 ++++++++++++++++++----
 .../document/LatLonPointInGeometryQuery.java       | 16 ++++++++++++++-
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesPointInGeometryQuery.java b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesPointInGeometryQuery.java
index 3d6f25b..04cb612 100644
--- a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesPointInGeometryQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesPointInGeometryQuery.java
@@ -104,12 +104,28 @@ public class LatLonDocValuesPointInGeometryQuery extends Query {
 
   @Override
   public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) throws IOException {
+    final Component2D tree = LatLonGeometry.create(geometries);
+
+    if (tree.getMinY() > tree.getMaxY()) {
+      // encodeLatitudeCeil may cause minY to be > maxY iff
+      // the delta between the longitude < the encoding resolution
+      return new ConstantScoreWeight(this, boost) {
+        @Override
+        public Scorer scorer(LeafReaderContext context) {
+          return null;
+        }
 
-    return new ConstantScoreWeight(this, boost) {
-
-      final Component2D tree = LatLonGeometry.create(geometries);
-      final GeoEncodingUtils.Component2DPredicate component2DPredicate = GeoEncodingUtils.createComponentPredicate(tree);
+        @Override
+        public boolean isCacheable(LeafReaderContext ctx) {
+          return false;
+        }
+      };
+    }
 
+    final GeoEncodingUtils.Component2DPredicate component2DPredicate = GeoEncodingUtils.createComponentPredicate(tree);
+    
+    return new ConstantScoreWeight(this, boost) {
+      
       @Override
       public Scorer scorer(LeafReaderContext context) throws IOException {
         final SortedNumericDocValues values = context.reader().getSortedNumericDocValues(field);
diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonPointInGeometryQuery.java b/lucene/core/src/java/org/apache/lucene/document/LatLonPointInGeometryQuery.java
index 53d2db5..d0c831e 100644
--- a/lucene/core/src/java/org/apache/lucene/document/LatLonPointInGeometryQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/document/LatLonPointInGeometryQuery.java
@@ -143,8 +143,22 @@ final class LatLonPointInGeometryQuery extends Query {
 
   @Override
   public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) throws IOException {
-
     final Component2D tree = LatLonGeometry.create(geometries);
+    if (tree.getMinY() > tree.getMaxY()) {
+      // encodeLatitudeCeil may cause minY to be > maxY iff
+      // the delta between the longitude < the encoding resolution
+      return new ConstantScoreWeight(this, boost) {
+        @Override
+        public Scorer scorer(LeafReaderContext context) {
+          return null;
+        }
+
+        @Override
+        public boolean isCacheable(LeafReaderContext ctx) {
+          return false;
+        }
+      };
+    }
     final GeoEncodingUtils.Component2DPredicate component2DPredicate = GeoEncodingUtils.createComponentPredicate(tree);
     // bounding box over all geometries, this can speed up tree intersection/cheaply improve approximation for complex multi-geometries
     final byte minLat[] = new byte[Integer.BYTES];