From 66b2c016b009add5257c20c0e33bb338bf39447b Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Fri, 17 Dec 2010 16:16:39 +0000 Subject: [PATCH] LUCENE-2811: switch version numbers on trunk due to 3.x index format change; fix hasVectors check to work correctly when doc stores are compound file git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1050440 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/lucene/index/DocumentsWriter.java | 4 +--- .../org/apache/lucene/index/IndexWriter.java | 2 -- .../org/apache/lucene/index/SegmentInfo.java | 21 +++++++++++++++++- .../codecs/DefaultSegmentInfosWriter.java | 6 ++--- .../index/TestBackwardsCompatibility.java | 4 ++++ .../org/apache/lucene/index/index.31.cfs.zip | Bin 4291 -> 4874 bytes .../apache/lucene/index/index.31.nocfs.zip | Bin 6889 -> 9168 bytes 7 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java b/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java index 4389a7579b0..dffbe3bfe3b 100644 --- a/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java +++ b/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java @@ -727,13 +727,11 @@ final class DocumentsWriter { newSegment.setDocStoreOffset(docStoreOffset); } - boolean hasVectors = false; - if (closeDocStore) { closeDocStore(flushState, writer, deleter, newSegment, mergePolicy, segmentInfos); } - hasVectors |= flushState.hasVectors; + boolean hasVectors = flushState.hasVectors; if (numDocsInRAM > 0) { diff --git a/lucene/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/src/java/org/apache/lucene/index/IndexWriter.java index 245215530f2..61d9e9a7598 100644 --- a/lucene/src/java/org/apache/lucene/index/IndexWriter.java +++ b/lucene/src/java/org/apache/lucene/index/IndexWriter.java @@ -2719,8 +2719,6 @@ public class IndexWriter implements Closeable { // format as well: setMergeDocStoreIsCompoundFile(merge); - merge.info.setHasProx(merger.fieldInfos().hasProx()); - segmentInfos.subList(start, start + merge.segments.size()).clear(); assert !segmentInfos.contains(merge.info); segmentInfos.add(start, merge.info); diff --git a/lucene/src/java/org/apache/lucene/index/SegmentInfo.java b/lucene/src/java/org/apache/lucene/index/SegmentInfo.java index d88bba82e58..f1ec386ff80 100644 --- a/lucene/src/java/org/apache/lucene/index/SegmentInfo.java +++ b/lucene/src/java/org/apache/lucene/index/SegmentInfo.java @@ -116,6 +116,7 @@ public final class SegmentInfo { docStoreOffset = src.docStoreOffset; docStoreIsCompoundFile = src.docStoreIsCompoundFile; hasVectors = src.hasVectors; + hasProx = src.hasProx; if (src.normGen == null) { normGen = null; } else { @@ -194,12 +195,30 @@ public final class SegmentInfo { hasVectors = input.readByte() == 1; } else { final String storesSegment; + final String ext; + final boolean isCompoundFile; if (docStoreOffset != -1) { storesSegment = docStoreSegment; + isCompoundFile = docStoreIsCompoundFile; + ext = IndexFileNames.COMPOUND_FILE_STORE_EXTENSION; } else { storesSegment = name; + isCompoundFile = getUseCompoundFile(); + ext = IndexFileNames.COMPOUND_FILE_EXTENSION; + } + final Directory dirToTest; + if (isCompoundFile) { + dirToTest = new CompoundFileReader(dir, IndexFileNames.segmentFileName(storesSegment, "", ext)); + } else { + dirToTest = dir; + } + try { + hasVectors = dirToTest.fileExists(IndexFileNames.segmentFileName(storesSegment, "", IndexFileNames.VECTORS_INDEX_EXTENSION)); + } finally { + if (isCompoundFile) { + dirToTest.close(); + } } - hasVectors = dir.fileExists(IndexFileNames.segmentFileName(storesSegment, "", IndexFileNames.VECTORS_INDEX_EXTENSION)); } } diff --git a/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosWriter.java b/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosWriter.java index 3157feba7bd..ea402d9585f 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosWriter.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosWriter.java @@ -37,14 +37,14 @@ public class DefaultSegmentInfosWriter extends SegmentInfosWriter { /** Each segment records whether its postings are written * in the new flex format */ - public static final int FORMAT_4_0 = -10; + public static final int FORMAT_4_0 = -11; /** Each segment records whether it has term vectors */ - public static final int FORMAT_HAS_VECTORS = -11; + public static final int FORMAT_HAS_VECTORS = -10; /** This must always point to the most recent file format. * whenever you add a new format, make it 1 smaller (negative version logic)! */ - public static final int FORMAT_CURRENT = FORMAT_HAS_VECTORS; + public static final int FORMAT_CURRENT = FORMAT_4_0; /** This must always point to the first supported file format. */ public static final int FORMAT_MINIMUM = FORMAT_DIAGNOSTICS; diff --git a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java index 14a5a920f90..b017d97eb00 100644 --- a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java +++ b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java @@ -344,6 +344,10 @@ public class TestBackwardsCompatibility extends LuceneTestCase { f = d.getField("fie\u2C77ld"); assertEquals("field with non-ascii name", f.stringValue()); } + + TermFreqVector tfv = reader.getTermFreqVector(i, "utf8"); + assertNotNull("docID=" + i + " index=" + dirName, tfv); + assertTrue(tfv instanceof TermPositionVector); } else // Only ID 7 is deleted assertEquals(7, i); diff --git a/lucene/src/test/org/apache/lucene/index/index.31.cfs.zip b/lucene/src/test/org/apache/lucene/index/index.31.cfs.zip index c2cdb53bdbd2a6327046659e501a84bfd36547ad..02eac4579565dd46dfbfa2694d87b35d4c652ee7 100644 GIT binary patch literal 4874 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 LbdyK)q|v_tO5^Zk diff --git a/lucene/src/test/org/apache/lucene/index/index.31.nocfs.zip b/lucene/src/test/org/apache/lucene/index/index.31.nocfs.zip index fc05c754a1ff1c99ed1861a1c3d410cfa72ecc0e..47af2bfe3a1ec897e00cbfc5bd143d380851116c 100644 GIT binary patch literal 9168 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 literal 6889 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 bkBFc-W_ERX*%b+(0{*Q8H<>)}7XbJV6rOFO