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 2020/09/04 14:46:13 UTC

[lucene-solr] branch master updated: LUCENE-9451 Sort.rewrite does not always return this when unchanged (#1731)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6c94ca9  LUCENE-9451 Sort.rewrite does not always return this when unchanged (#1731)
6c94ca9 is described below

commit 6c94ca9cb33795cdc29797ff2d17f1869813d3f9
Author: Mike Drob <md...@apache.org>
AuthorDate: Fri Sep 4 09:46:03 2020 -0500

    LUCENE-9451 Sort.rewrite does not always return this when unchanged (#1731)
---
 .../apache/lucene/search/DoubleValuesSource.java   | 11 ++++++----
 .../org/apache/lucene/search/LongValuesSource.java |  6 +++++-
 .../src/java/org/apache/lucene/search/Sort.java    |  2 +-
 .../lucene/search/TestDoubleValuesSource.java      |  5 +++++
 .../apache/lucene/search/TestLongValuesSource.java |  6 ++++++
 .../test/org/apache/lucene/search/TestSort.java    | 24 +++++++++++++++++++---
 6 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java b/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
index 106069d..1c69edf 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
@@ -275,12 +275,12 @@ public abstract class DoubleValuesSource implements SegmentCacheable {
       this.value = value;
       this.doubleValues = new DoubleValues() {
         @Override
-        public double doubleValue() throws IOException {
+        public double doubleValue() {
           return value;
         }
 
         @Override
-        public boolean advanceExact(int doc) throws IOException {
+        public boolean advanceExact(int doc) {
           return true;
         }
       };
@@ -456,13 +456,16 @@ public abstract class DoubleValuesSource implements SegmentCacheable {
 
     @Override
     public SortField rewrite(IndexSearcher searcher) throws IOException {
-      DoubleValuesSortField rewritten = new DoubleValuesSortField(producer.rewrite(searcher), reverse);
+      DoubleValuesSource rewrittenSource = producer.rewrite(searcher);
+      if (rewrittenSource == producer) {
+        return this;
+      }
+      DoubleValuesSortField rewritten = new DoubleValuesSortField(rewrittenSource, reverse);
       if (missingValue != null) {
         rewritten.setMissingValue(missingValue);
       }
       return rewritten;
     }
-
   }
 
   private static class DoubleValuesHolder {
diff --git a/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java b/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
index 1eafc22..54f8f19 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
@@ -305,7 +305,11 @@ public abstract class LongValuesSource implements SegmentCacheable {
 
     @Override
     public SortField rewrite(IndexSearcher searcher) throws IOException {
-      LongValuesSortField rewritten = new LongValuesSortField(producer.rewrite(searcher), reverse);
+      LongValuesSource rewrittenSource = producer.rewrite(searcher);
+      if (producer == rewrittenSource) {
+        return this;
+      }
+      LongValuesSortField rewritten = new LongValuesSortField(rewrittenSource, reverse);
       if (missingValue != null) {
         rewritten.setMissingValue(missingValue);
       }
diff --git a/lucene/core/src/java/org/apache/lucene/search/Sort.java b/lucene/core/src/java/org/apache/lucene/search/Sort.java
index 3af6fa4..f09fcc9 100644
--- a/lucene/core/src/java/org/apache/lucene/search/Sort.java
+++ b/lucene/core/src/java/org/apache/lucene/search/Sort.java
@@ -182,7 +182,7 @@ public class Sort {
       }
     }
 
-    return (changed) ? new Sort(rewrittenSortFields) : this;
+    return changed ? new Sort(rewrittenSortFields) : this;
   }
 
   @Override
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
index 77cebbf..c9ab80d 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
@@ -284,6 +284,11 @@ public class TestDoubleValuesSource extends LuceneTestCase {
     doTestQueryDoubleValuesSources(approximatingQuery);
   }
 
+  public void testRewriteSame() throws IOException {
+    SortField doubleField = DoubleValuesSource.constant(1.0).getSortField(false);
+    assertSame(doubleField, doubleField.rewrite(searcher));
+  }
+
   private void doTestQueryDoubleValuesSources(Query q) throws Exception {
     DoubleValuesSource vs = DoubleValuesSource.fromQuery(q).rewrite(searcher);
     searcher.search(q, new SimpleCollector() {
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java b/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
index 6380b73..fd96f65 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
@@ -17,6 +17,7 @@
 
 package org.apache.lucene.search;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 
@@ -129,6 +130,11 @@ public class TestLongValuesSource extends LuceneTestCase {
     }
   }
 
+  public void testRewriteSame() throws IOException {
+    SortField longField = LongValuesSource.constant(1L).getSortField(false);
+    assertSame(longField, longField.rewrite(searcher));
+  }
+
   Sort randomSort() throws Exception {
     boolean reversed = random().nextBoolean();
     SortField fields[] = new SortField[] {
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSort.java b/lucene/core/src/test/org/apache/lucene/search/TestSort.java
index d37c98dd..787705a 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSort.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSort.java
@@ -56,9 +56,9 @@ public class TestSort extends LuceneTestCase {
   }
 
   private void assertDifferent(Sort a, Sort b) {
-    assertFalse(a.equals(b));
-    assertFalse(b.equals(a));
-    assertFalse(a.hashCode() == b.hashCode());
+    assertNotEquals(a, b);
+    assertNotEquals(b, a);
+    assertNotEquals(a.hashCode(), b.hashCode());
   }
 
   public void testEquals() {
@@ -878,4 +878,22 @@ public class TestSort extends LuceneTestCase {
     ir.close();
     dir.close();
   }
+
+  public void testRewrite() throws IOException {
+    try (Directory dir = newDirectory()) {
+      RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+      IndexSearcher searcher = newSearcher(writer.getReader());
+      writer.close();
+
+      LongValuesSource longSource = LongValuesSource.constant(1L);
+      Sort sort = new Sort(longSource.getSortField(false));
+
+      assertSame(sort, sort.rewrite(searcher));
+
+      DoubleValuesSource doubleSource = DoubleValuesSource.constant(1.0);
+      sort = new Sort(doubleSource.getSortField(false));
+
+      assertSame(sort, sort.rewrite(searcher));
+    }
+  }
 }