You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2020/07/30 13:49:14 UTC

[lucene-solr] branch jira/SOLR-14608-export updated: SOLR-14608: More cleanups. Fix a bug in compareTo. Add SortDoc.equals() / hashCode().

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

ab pushed a commit to branch jira/SOLR-14608-export
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/jira/SOLR-14608-export by this push:
     new 8e9a7af  SOLR-14608: More cleanups. Fix a bug in compareTo. Add SortDoc.equals() / hashCode().
8e9a7af is described below

commit 8e9a7afddde80080150e3fd078005a8add29ac7f
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Thu Jul 30 15:48:28 2020 +0200

    SOLR-14608: More cleanups. Fix a bug in compareTo. Add SortDoc.equals() / hashCode().
---
 .../solr/handler/export/DoubleValueSortDoc.java    | 15 ++++++++++-
 .../apache/solr/handler/export/ExportWriter.java   | 31 +++++++++++++---------
 .../solr/handler/export/QuadValueSortDoc.java      | 10 ++++++-
 .../solr/handler/export/SingleValueSortDoc.java    | 11 +++++++-
 .../org/apache/solr/handler/export/SortDoc.java    | 18 ++++++++++++-
 .../org/apache/solr/handler/export/SortValue.java  | 20 +++++++-------
 .../solr/handler/export/TripleValueSortDoc.java    | 10 ++++++-
 7 files changed, 87 insertions(+), 28 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/export/DoubleValueSortDoc.java b/solr/core/src/java/org/apache/solr/handler/export/DoubleValueSortDoc.java
index 8bca043..bb510ec 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/DoubleValueSortDoc.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/DoubleValueSortDoc.java
@@ -25,6 +25,7 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
 
   protected SortValue value2;
 
+  @Override
   public SortValue getSortValue(String field) {
     if (value1.getField().equals(field)) {
       return value1;
@@ -34,6 +35,7 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     return null;
   }
 
+  @Override
   public void setNextReader(LeafReaderContext context) throws IOException {
     this.ord = context.ord;
     this.docBase = context.docBase;
@@ -41,6 +43,7 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     value2.setNextReader(context);
   }
 
+  @Override
   public void reset() {
     this.docId = -1;
     this.docBase = -1;
@@ -49,6 +52,7 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     value2.reset();
   }
 
+  @Override
   public void setValues(int docId) throws IOException {
     this.docId = docId;
     value1.setCurrentValue(docId);
@@ -62,6 +66,7 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     value2.toGlobalValue(doubleValueSortDoc.value2);
   }
 
+  @Override
   public void setValues(SortDoc sortDoc) {
     this.docId = sortDoc.docId;
     this.ord = sortDoc.ord;
@@ -75,10 +80,12 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     this.value2 = value2;
   }
 
+  @Override
   public SortDoc copy() {
     return new DoubleValueSortDoc(value1.copy(), value2.copy());
   }
 
+  @Override
   public boolean lessThan(Object o) {
     DoubleValueSortDoc sd = (DoubleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
@@ -98,11 +105,17 @@ class DoubleValueSortDoc extends SingleValueSortDoc {
     }
   }
 
+  @Override
   public int compareTo(SortDoc o) {
     DoubleValueSortDoc sd = (DoubleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
     if (comp == 0) {
-      return value2.compareTo(sd.value2);
+      comp = value2.compareTo(sd.value2);
+      if (comp == 0) {
+        return docId + docBase - sd.docId - sd.docBase;
+      } else {
+        return comp;
+      }
     } else {
       return comp;
     }
diff --git a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index 3954605..9ad0755 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -121,6 +121,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   final Timer writeOutputBufferTimer;
   final Timer writerWaitTimer;
   final Timer fillerWaitTimer;
+  final Timer topDocsTimer;
   final Timer totalTimer;
 
 
@@ -141,6 +142,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     writeOutputBufferTimer = solrMetricsContext.timer("writeOutputBuffer", metricsPath);
     writerWaitTimer = solrMetricsContext.timer("writerWait", metricsPath);
     fillerWaitTimer = solrMetricsContext.timer("fillerWait", metricsPath);
+    topDocsTimer = solrMetricsContext.timer("segTopDocs", metricsPath);
     totalTimer = solrMetricsContext.timer("totalTime", metricsPath);
   }
 
@@ -668,7 +670,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
       SegmentIterator[] segmentIterators = new SegmentIterator[leaves.size()];
       for (int i = 0; i < segmentIterators.length; i++) {
         SortQueue sortQueue = new SortQueue(sizes[i], sortDoc.copy());
-        segmentIterators[i] = new SegmentIterator(bits[i], leaves.get(i), sortQueue, sortDoc.copy());
+        segmentIterators[i] = new SegmentIterator(bits[i], leaves.get(i), sortQueue, sortDoc.copy(), topDocsTimer);
       }
 
       return new MergeIterator(segmentIterators, sortDoc);
@@ -679,26 +681,26 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
 
   private static class SegmentIterator {
 
-    private FixedBitSet bits;
-    private SortQueue queue;
-    private SortDoc sortDoc;
-    private SortDoc lastDoc;
+    private final FixedBitSet bits;
+    private final SortQueue queue;
+    private final SortDoc sortDoc;
+    private final LeafReaderContext context;
+    private final SortDoc[] outDocs;
+    private final Timer topDocsTimer;
+
     private SortDoc nextDoc;
-    private int ord;
-    private LeafReaderContext context;
-    private SortDoc[] outDocs;
     private int index;
 
 
-    public SegmentIterator(FixedBitSet bits, LeafReaderContext context, SortQueue sortQueue, SortDoc sortDoc) throws IOException {
+    public SegmentIterator(FixedBitSet bits, LeafReaderContext context, SortQueue sortQueue, SortDoc sortDoc,
+                           Timer topDocsTimer) throws IOException {
       this.bits = bits;
       this.queue = sortQueue;
       this.sortDoc = sortDoc;
-      this.lastDoc = sortDoc.copy();
       this.nextDoc = sortDoc.copy();
       this.context = context;
-      this.ord = context.ord;
       this.outDocs = new SortDoc[sortQueue.maxSize];
+      this.topDocsTimer = topDocsTimer;
       topDocs();
     }
 
@@ -732,6 +734,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     }
 
     private void topDocs() {
+      Timer.Context timerContext = topDocsTimer.time();
       try {
         queue.reset();
         SortDoc top = queue.top();
@@ -749,14 +752,16 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
         //Pop the queue and load up the array.
         index = -1;
 
-        while (true) {
-          SortDoc sortDoc = queue.pop();
+        SortDoc sortDoc;
+        while ((sortDoc = queue.pop()) != null) {
           if (sortDoc.docId > -1) {
             outDocs[++index] = sortDoc;
           }
         }
       } catch (Exception e) {
         e.printStackTrace();
+      } finally {
+        timerContext.stop();
       }
     }
   }
diff --git a/solr/core/src/java/org/apache/solr/handler/export/QuadValueSortDoc.java b/solr/core/src/java/org/apache/solr/handler/export/QuadValueSortDoc.java
index 38ecaf9..aa389f8 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/QuadValueSortDoc.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/QuadValueSortDoc.java
@@ -25,6 +25,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
 
   protected SortValue value4;
 
+  @Override
   public SortValue getSortValue(String field) {
     if (value1.getField().equals(field)) {
       return value1;
@@ -38,6 +39,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     return null;
   }
 
+  @Override
   public void setNextReader(LeafReaderContext context) throws IOException {
     this.ord = context.ord;
     this.docBase = context.docBase;
@@ -57,6 +59,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     value4.toGlobalValue(quadValueSortDoc.value4);
   }
 
+  @Override
   public void reset() {
     this.docId = -1;
     this.docBase = -1;
@@ -67,6 +70,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     value4.reset();
   }
 
+  @Override
   public void setValues(int docId) throws IOException {
     this.docId = docId;
     value1.setCurrentValue(docId);
@@ -75,6 +79,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     value4.setCurrentValue(docId);
   }
 
+  @Override
   public void setValues(SortDoc sortDoc) {
     this.docId = sortDoc.docId;
     this.ord = sortDoc.ord;
@@ -90,10 +95,12 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     this.value4 = value4;
   }
 
+  @Override
   public SortDoc copy() {
     return new QuadValueSortDoc(value1.copy(), value2.copy(), value3.copy(), value4.copy());
   }
 
+  @Override
   public boolean lessThan(Object o) {
 
     QuadValueSortDoc sd = (QuadValueSortDoc) o;
@@ -128,6 +135,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
     }
   }
 
+  @Override
   public int compareTo(SortDoc o) {
     QuadValueSortDoc sd = (QuadValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
@@ -138,7 +146,7 @@ class QuadValueSortDoc extends TripleValueSortDoc {
         if (comp == 0) {
           comp = value4.compareTo(sd.value4);
           if (comp == 0) {
-            return docId + docBase - sd.docId + sd.docBase;
+            return docId + docBase - sd.docId - sd.docBase;
           } else {
             return comp;
           }
diff --git a/solr/core/src/java/org/apache/solr/handler/export/SingleValueSortDoc.java b/solr/core/src/java/org/apache/solr/handler/export/SingleValueSortDoc.java
index 61f20b4..d502f97 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/SingleValueSortDoc.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/SingleValueSortDoc.java
@@ -25,6 +25,7 @@ class SingleValueSortDoc extends SortDoc {
 
   protected SortValue value1;
 
+  @Override
   public SortValue getSortValue(String field) {
     if (value1.getField().equals(field)) {
       return value1;
@@ -32,12 +33,14 @@ class SingleValueSortDoc extends SortDoc {
     return null;
   }
 
+  @Override
   public void setNextReader(LeafReaderContext context) throws IOException {
     this.ord = context.ord;
     this.docBase = context.docBase;
     value1.setNextReader(context);
   }
 
+  @Override
   public void reset() {
     this.docId = -1;
     this.docBase = -1;
@@ -45,11 +48,13 @@ class SingleValueSortDoc extends SortDoc {
     this.value1.reset();
   }
 
+  @Override
   public void setValues(int docId) throws IOException {
     this.docId = docId;
     value1.setCurrentValue(docId);
   }
 
+  @Override
   public void setValues(SortDoc sortDoc) {
     this.docId = sortDoc.docId;
     this.ord = sortDoc.ord;
@@ -62,15 +67,18 @@ class SingleValueSortDoc extends SortDoc {
     this.value1 = value1;
   }
 
+  @Override
   public void setGlobalValues(SortDoc previous) {
     SortValue previousValue = ((SingleValueSortDoc) previous).value1;
     value1.toGlobalValue(previousValue);
   }
 
+  @Override
   public SortDoc copy() {
     return new SingleValueSortDoc(value1.copy());
   }
 
+  @Override
   public boolean lessThan(Object o) {
     SingleValueSortDoc sd = (SingleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
@@ -83,11 +91,12 @@ class SingleValueSortDoc extends SortDoc {
     }
   }
 
+  @Override
   public int compareTo(SortDoc o) {
     SingleValueSortDoc sd = (SingleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
     if (comp == 0) {
-      return docId + docBase - sd.docId + sd.docBase;
+      return docId + docBase - sd.docId - sd.docBase;
     } else {
       return comp;
     }
diff --git a/solr/core/src/java/org/apache/solr/handler/export/SortDoc.java b/solr/core/src/java/org/apache/solr/handler/export/SortDoc.java
index 2bad3c8..d0022c7 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/SortDoc.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/SortDoc.java
@@ -18,6 +18,7 @@
 package org.apache.solr.handler.export;
 
 import java.io.IOException;
+import java.util.Objects;
 
 import org.apache.lucene.index.LeafReaderContext;
 
@@ -37,6 +38,20 @@ class SortDoc implements Comparable<SortDoc> {
 
   }
 
+  @Override
+  public boolean equals(Object obj) {
+    // subclasses are not equal
+    if (!obj.getClass().equals(getClass())) {
+      return false;
+    }
+    return compareTo((SortDoc) obj) == 0;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(docId, ord, docBase);
+  }
+
   public SortValue getSortValue(String field) {
     for (SortValue value : sortValues) {
       if (value.getField().equals(field)) {
@@ -112,6 +127,7 @@ class SortDoc implements Comparable<SortDoc> {
     return docId + docBase > sd.docId + sd.docBase; //index order
   }
 
+  @Override
   public int compareTo(SortDoc sd) {
     for (int i = 0; i < sortValues.length; i++) {
       int comp = sortValues[i].compareTo(sd.sortValues[i]);
@@ -119,7 +135,7 @@ class SortDoc implements Comparable<SortDoc> {
         return comp;
       }
     }
-    return 0;
+    return docId + docBase - sd.docId - sd.docBase;
   }
 
   public String toString() {
diff --git a/solr/core/src/java/org/apache/solr/handler/export/SortValue.java b/solr/core/src/java/org/apache/solr/handler/export/SortValue.java
index 93f342e..da42be0 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/SortValue.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/SortValue.java
@@ -21,19 +21,19 @@ import java.io.IOException;
 
 import org.apache.lucene.index.LeafReaderContext;
 
-public interface SortValue extends Comparable<SortValue> {
-  public void setCurrentValue(int docId) throws IOException;
-  public void setNextReader(LeafReaderContext context) throws IOException;
-  public void setCurrentValue(SortValue value);
-  public void toGlobalValue(SortValue previousValue);
-  public void reset();
-  public SortValue copy();
-  public Object getCurrentValue() throws IOException;
-  public String getField();
+interface SortValue extends Comparable<SortValue> {
+  void setCurrentValue(int docId) throws IOException;
+  void setNextReader(LeafReaderContext context) throws IOException;
+  void setCurrentValue(SortValue value);
+  void toGlobalValue(SortValue previousValue);
+  void reset();
+  SortValue copy();
+  Object getCurrentValue() throws IOException;
+  String getField();
 
   /**
    *
    * @return true if document has a value for the specified field
    */
-  public boolean isPresent();
+  boolean isPresent();
 }
\ No newline at end of file
diff --git a/solr/core/src/java/org/apache/solr/handler/export/TripleValueSortDoc.java b/solr/core/src/java/org/apache/solr/handler/export/TripleValueSortDoc.java
index bbcf230..9863183 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/TripleValueSortDoc.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/TripleValueSortDoc.java
@@ -25,6 +25,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
 
   protected SortValue value3;
 
+  @Override
   public SortValue getSortValue(String field) {
     if (value1.getField().equals(field)) {
       return value1;
@@ -36,6 +37,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     return null;
   }
 
+  @Override
   public void setNextReader(LeafReaderContext context) throws IOException {
     this.ord = context.ord;
     this.docBase = context.docBase;
@@ -44,6 +46,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     value3.setNextReader(context);
   }
 
+  @Override
   public void reset() {
     this.docId = -1;
     this.docBase = -1;
@@ -53,6 +56,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     value3.reset();
   }
 
+  @Override
   public void setValues(int docId) throws IOException {
     this.docId = docId;
     value1.setCurrentValue(docId);
@@ -68,6 +72,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     value3.toGlobalValue(tripleValueSortDoc.value3);
   }
 
+  @Override
   public void setValues(SortDoc sortDoc) {
     this.docId = sortDoc.docId;
     this.ord = sortDoc.ord;
@@ -82,10 +87,12 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     this.value3 = value3;
   }
 
+  @Override
   public SortDoc copy() {
     return new TripleValueSortDoc(value1.copy(), value2.copy(), value3.copy());
   }
 
+  @Override
   public boolean lessThan(Object o) {
     TripleValueSortDoc sd = (TripleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
@@ -112,6 +119,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
     }
   }
 
+  @Override
   public int compareTo(SortDoc o) {
     TripleValueSortDoc sd = (TripleValueSortDoc) o;
     int comp = value1.compareTo(sd.value1);
@@ -120,7 +128,7 @@ class TripleValueSortDoc extends DoubleValueSortDoc {
       if (comp == 0) {
         comp = value3.compareTo(sd.value3);
         if (comp == 0) {
-          return docId + docBase - sd.docId + sd.docBase;
+          return docId + docBase - sd.docId - sd.docBase;
         } else {
           return comp;
         }