You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/11/20 15:16:26 UTC

[16/31] lucene-solr:jira/http2: LUCENE-8552: Optimize getMergedFieldInfos for zero or one segment

LUCENE-8552: Optimize getMergedFieldInfos for zero or one segment


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/db954252
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/db954252
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/db954252

Branch: refs/heads/jira/http2
Commit: db9542526ecc742234bff77d609a0f7071a78b46
Parents: cd61a92
Author: Christophe Bismuth <ch...@gmail.com>
Authored: Fri Nov 16 16:45:09 2018 -0500
Committer: David Smiley <ds...@apache.org>
Committed: Fri Nov 16 16:45:09 2018 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  7 ++-
 .../org/apache/lucene/index/FieldInfos.java     | 23 ++++++----
 .../org/apache/lucene/index/TestFieldInfos.java | 46 ++++++++++++++++++++
 3 files changed, 67 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db954252/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index ca87bfe..a0cfa71 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -212,11 +212,16 @@ New Features
   IndexWriterConfig#setIndexCreatedVersionMajor. This is an expert feature.
   (Adrien Grand)
 
-Improvements:
+Improvements
 
 * LUCENE-8463: TopFieldCollector can now early-terminates queries when sorting by SortField.DOC.
   (Christophe Bismuth via Jim Ferenczi)
 
+Optimizations
+
+* LUCENE-8552: FieldInfos.getMergedFieldInfos no longer does any merging if there is <= 1 segment.
+  (Christophe Bismuth via David Smiley)
+
 ======================= Lucene 7.6.0 =======================
 
 Build

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db954252/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java b/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
index 5cd9639..88f092a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
@@ -139,15 +139,22 @@ public class FieldInfos implements Iterable<FieldInfo> {
    *  will be unavailable.
    */
   public static FieldInfos getMergedFieldInfos(IndexReader reader) {
-    final String softDeletesField = reader.leaves().stream()
-        .map(l -> l.reader().getFieldInfos().getSoftDeletesField())
-        .filter(Objects::nonNull)
-        .findAny().orElse(null);
-    final Builder builder = new Builder(new FieldNumbers(softDeletesField));
-    for(final LeafReaderContext ctx : reader.leaves()) {
-      builder.add(ctx.reader().getFieldInfos());
+    final List<LeafReaderContext> leaves = reader.leaves();
+    if (leaves.isEmpty()) {
+      return FieldInfos.EMPTY;
+    } else if (leaves.size() == 1) {
+      return leaves.get(0).reader().getFieldInfos();
+    } else {
+      final String softDeletesField = leaves.stream()
+          .map(l -> l.reader().getFieldInfos().getSoftDeletesField())
+          .filter(Objects::nonNull)
+          .findAny().orElse(null);
+      final Builder builder = new Builder(new FieldNumbers(softDeletesField));
+      for (final LeafReaderContext ctx : leaves) {
+        builder.add(ctx.reader().getFieldInfos());
+      }
+      return builder.finish();
     }
-    return builder.finish();
   }
 
   /** Returns a set of names of fields that have a terms index.  The order is undefined. */

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db954252/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java b/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
index 308e11e..3fe5fa9 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
@@ -17,6 +17,7 @@
 package org.apache.lucene.index;
 
 
+import java.io.IOException;
 import java.util.Iterator;
 
 import org.apache.lucene.analysis.MockAnalyzer;
@@ -26,6 +27,9 @@ import org.apache.lucene.document.StringField;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.LuceneTestCase;
 
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.sameInstance;
+
 public class TestFieldInfos extends LuceneTestCase {
 
   public void testFieldInfos() throws Exception{
@@ -89,4 +93,46 @@ public class TestFieldInfos extends LuceneTestCase {
     dir.close();
   }
 
+  public void testMergedFieldInfos_empty() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
+
+    IndexReader reader = writer.getReader();
+    FieldInfos actual = FieldInfos.getMergedFieldInfos(reader);
+    FieldInfos expected = FieldInfos.EMPTY;
+
+    assertThat(actual, sameInstance(expected));
+
+    reader.close();
+    writer.close();
+    dir.close();
+  }
+
+  public void testMergedFieldInfos_singleLeaf() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
+
+    Document d1 = new Document();
+    d1.add(new StringField("f1", "v1", Field.Store.YES));
+    writer.addDocument(d1);
+    writer.commit();
+
+    Document d2 = new Document();
+    d2.add(new StringField("f2", "v2", Field.Store.YES));
+    writer.addDocument(d2);
+    writer.commit();
+
+    writer.forceMerge(1);
+
+    IndexReader reader = writer.getReader();
+    FieldInfos actual = FieldInfos.getMergedFieldInfos(reader);
+    FieldInfos expected = reader.leaves().get(0).reader().getFieldInfos();
+
+    assertThat(reader.leaves().size(), equalTo(1));
+    assertThat(actual, sameInstance(expected));
+
+    reader.close();
+    writer.close();
+    dir.close();
+  }
 }