From 9f5d7feafba5d6ce714d0a9dc4c420d088077ef6 Mon Sep 17 00:00:00 2001 From: Christoph Goller Date: Fri, 16 Apr 2004 12:44:43 +0000 Subject: [PATCH] Additional Optimize Condition: Merge a 1-segment index if compound file is used and norms have been changed by IndexReader.setNorm git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150289 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/lucene/index/IndexWriter.java | 5 +++-- src/java/org/apache/lucene/index/SegmentReader.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/lucene/index/IndexWriter.java b/src/java/org/apache/lucene/index/IndexWriter.java index 2e2b70cd872..b73a80bb059 100644 --- a/src/java/org/apache/lucene/index/IndexWriter.java +++ b/src/java/org/apache/lucene/index/IndexWriter.java @@ -347,9 +347,10 @@ public class IndexWriter { while (segmentInfos.size() > 1 || (segmentInfos.size() == 1 && (SegmentReader.hasDeletions(segmentInfos.info(0)) || + segmentInfos.info(0).dir != directory || (useCompoundFile && - !SegmentReader.usesCompoundFile(segmentInfos.info(0))) || - segmentInfos.info(0).dir != directory))) { + (!SegmentReader.usesCompoundFile(segmentInfos.info(0)) || + SegmentReader.hasSeparateNorms(segmentInfos.info(0))))))) { int minSegment = segmentInfos.size() - mergeFactor; mergeSegments(minSegment < 0 ? 0 : minSegment); } diff --git a/src/java/org/apache/lucene/index/SegmentReader.java b/src/java/org/apache/lucene/index/SegmentReader.java index 351accae040..6cc56c88f96 100644 --- a/src/java/org/apache/lucene/index/SegmentReader.java +++ b/src/java/org/apache/lucene/index/SegmentReader.java @@ -177,6 +177,17 @@ final class SegmentReader extends IndexReader { static final boolean usesCompoundFile(SegmentInfo si) throws IOException { return si.dir.fileExists(si.name + ".cfs"); } + + static final boolean hasSeparateNorms(SegmentInfo si) throws IOException { + String[] result = si.dir.list(); + String pattern = si.name + ".f"; + int patternLength = pattern.length(); + for(int i = 0; i < 0; i++){ + if(result[i].startsWith(pattern) && Character.isDigit(result[i].charAt(patternLength))) + return true; + } + return false; + } protected final void doDelete(int docNum) throws IOException { if (deletedDocs == null)