From 98e53288459452bb82f4a4a115cb24c5fb5fb179 Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Wed, 18 Jan 2012 17:57:05 +0000 Subject: [PATCH] LUCENE-3576: add surrogates shuffle for 3.x term vectors, test surrogates in TestBackwardsCompatibility git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1232974 13f79535-47bb-0310-9956-ffa450edef68 --- .../lucene/codecs/TermVectorsWriter.java | 5 + .../lucene3x/Lucene3xTermVectorsReader.java | 183 ++++++++++-------- .../lucene40/Lucene40TermVectorsWriter.java | 6 + .../SimpleTextTermVectorsWriter.java | 6 + .../index/TermVectorsConsumerPerField.java | 4 +- .../preflexrw/PreFlexRWTermVectorsFormat.java | 31 +++ .../preflexrw/PreFlexRWTermVectorsWriter.java | 7 +- .../index/TestBackwardsCompatibility.java | 11 ++ .../lucene/index/index.36.surrogates.zip | Bin 0 -> 40680 bytes 9 files changed, 173 insertions(+), 80 deletions(-) create mode 100644 lucene/src/test/org/apache/lucene/index/index.36.surrogates.zip diff --git a/lucene/src/java/org/apache/lucene/codecs/TermVectorsWriter.java b/lucene/src/java/org/apache/lucene/codecs/TermVectorsWriter.java index 7d6086f6163..e22e1740d0a 100644 --- a/lucene/src/java/org/apache/lucene/codecs/TermVectorsWriter.java +++ b/lucene/src/java/org/apache/lucene/codecs/TermVectorsWriter.java @@ -19,6 +19,7 @@ package org.apache.lucene.codecs; import java.io.Closeable; import java.io.IOException; +import java.util.Comparator; import org.apache.lucene.index.DocsAndPositionsEnum; import org.apache.lucene.index.DocsEnum; @@ -273,4 +274,8 @@ public abstract class TermVectorsWriter implements Closeable { assert termCount == numTerms; } } + + /** Return the BytesRef Comparator used to sort terms + * before feeding to this API. */ + public abstract Comparator getComparator() throws IOException; } diff --git a/lucene/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java b/lucene/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java index 55b9a5c66c2..25dd1f27a0d 100644 --- a/lucene/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java +++ b/lucene/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java @@ -18,6 +18,7 @@ package org.apache.lucene.codecs.lucene3x; */ import java.io.IOException; +import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; @@ -265,11 +266,13 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { private class TVTerms extends Terms { private final int numTerms; private final long tvfFPStart; + private final boolean unicodeSortOrder; public TVTerms(long tvfFP) throws IOException { tvf.seek(tvfFP); numTerms = tvf.readVInt(); tvfFPStart = tvf.getFilePointer(); + unicodeSortOrder = sortTermsByUnicode(); } @Override @@ -283,7 +286,7 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { } else { termsEnum = new TVTermsEnum(); } - termsEnum.reset(numTerms, tvfFPStart); + termsEnum.reset(numTerms, tvfFPStart, unicodeSortOrder); return termsEnum; } @@ -310,27 +313,32 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { @Override public Comparator getComparator() { - // TODO: really indexer hardwires - // this...? I guess codec could buffer and re-sort... - return BytesRef.getUTF8SortedAsUnicodeComparator(); + if (unicodeSortOrder) { + return BytesRef.getUTF8SortedAsUnicodeComparator(); + } else { + return BytesRef.getUTF8SortedAsUTF16Comparator(); + } } } + static class TermAndPostings { + BytesRef term; + int freq; + int[] positions; + int[] startOffsets; + int[] endOffsets; + } + private class TVTermsEnum extends TermsEnum { + private boolean unicodeSortOrder; private final IndexInput origTVF; private final IndexInput tvf; private int numTerms; - private int nextTerm; - private int freq; - private BytesRef lastTerm = new BytesRef(); - private BytesRef term = new BytesRef(); + private int currentTerm; private boolean storePositions; private boolean storeOffsets; - private long tvfFP; - - private int[] positions; - private int[] startOffsets; - private int[] endOffsets; + + private TermAndPostings[] termAndPostings; // NOTE: tvf is pre-positioned by caller public TVTermsEnum() throws IOException { @@ -342,37 +350,81 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { return tvf == origTVF; } - public void reset(int numTerms, long tvfFPStart) throws IOException { + public void reset(int numTerms, long tvfFPStart, boolean unicodeSortOrder) throws IOException { this.numTerms = numTerms; - nextTerm = 0; + currentTerm = -1; tvf.seek(tvfFPStart); final byte bits = tvf.readByte(); storePositions = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0; storeOffsets = (bits & STORE_OFFSET_WITH_TERMVECTOR) != 0; - tvfFP = 1+tvfFPStart; - positions = null; - startOffsets = null; - endOffsets = null; + this.unicodeSortOrder = unicodeSortOrder; + readVectors(); + if (unicodeSortOrder) { + Arrays.sort(termAndPostings, new Comparator() { + public int compare(TermAndPostings left, TermAndPostings right) { + return left.term.compareTo(right.term); + } + }); + } + } + + private void readVectors() throws IOException { + termAndPostings = new TermAndPostings[numTerms]; + BytesRef lastTerm = new BytesRef(); + for (int i = 0; i < numTerms; i++) { + TermAndPostings t = new TermAndPostings(); + BytesRef term = new BytesRef(); + term.copyBytes(lastTerm); + final int start = tvf.readVInt(); + final int deltaLen = tvf.readVInt(); + term.length = start + deltaLen; + term.grow(term.length); + tvf.readBytes(term.bytes, start, deltaLen); + t.term = term; + int freq = tvf.readVInt(); + t.freq = freq; + + if (storePositions) { + int positions[] = new int[freq]; + int pos = 0; + for(int posUpto=0;posUpto comparator = getComparator(); + for (int i = 0; i < numTerms; i++) { + int cmp = comparator.compare(text, termAndPostings[i].term); if (cmp < 0) { + currentTerm = i; return SeekStatus.NOT_FOUND; } else if (cmp == 0) { + currentTerm = i; return SeekStatus.FOUND; } } - + currentTerm = termAndPostings.length; return SeekStatus.END; } @@ -383,47 +435,15 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { @Override public BytesRef next() throws IOException { - if (nextTerm >= numTerms) { + if (++currentTerm >= numTerms) { return null; } - term.copyBytes(lastTerm); - final int start = tvf.readVInt(); - final int deltaLen = tvf.readVInt(); - term.length = start + deltaLen; - term.grow(term.length); - tvf.readBytes(term.bytes, start, deltaLen); - freq = tvf.readVInt(); - - if (storePositions) { - // TODO: we could maybe reuse last array, if we can - // somehow be careful about consumer never using two - // D&PEnums at once... - positions = new int[freq]; - int pos = 0; - for(int posUpto=0;posUpto getComparator() { - // TODO: really indexer hardwires - // this...? I guess codec could buffer and re-sort... - return BytesRef.getUTF8SortedAsUnicodeComparator(); + if (unicodeSortOrder) { + return BytesRef.getUTF8SortedAsUnicodeComparator(); + } else { + return BytesRef.getUTF8SortedAsUTF16Comparator(); + } } } @@ -518,9 +540,9 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { } } - public void reset(Bits liveDocs, int freq) { + public void reset(Bits liveDocs, TermAndPostings termAndPostings) { this.liveDocs = liveDocs; - this.freq = freq; + this.freq = termAndPostings.freq; this.doc = -1; didNext = false; } @@ -569,11 +591,11 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { } } - public void reset(Bits liveDocs, int[] positions, int[] startOffsets, int[] endOffsets) { + public void reset(Bits liveDocs, TermAndPostings termAndPostings) { this.liveDocs = liveDocs; - this.positions = positions; - this.startOffsets = startOffsets; - this.endOffsets = endOffsets; + this.positions = termAndPostings.positions; + this.startOffsets = termAndPostings.startOffsets; + this.endOffsets = termAndPostings.endOffsets; this.doc = -1; didNext = false; nextPos = 0; @@ -668,5 +690,14 @@ public class Lucene3xTermVectorsReader extends TermVectorsReader { } } } + + // If this returns, we do the surrogates shuffle so that the + // terms are sorted by unicode sort order. This should be + // true when segments are used for "normal" searching; + // it's only false during testing, to create a pre-flex + // index, using the test-only PreFlexRW. + protected boolean sortTermsByUnicode() { + return true; + } } diff --git a/lucene/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsWriter.java b/lucene/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsWriter.java index 0ccb62efac5..fc002ceebd6 100644 --- a/lucene/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsWriter.java +++ b/lucene/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsWriter.java @@ -18,6 +18,7 @@ package org.apache.lucene.codecs.lucene40; */ import java.io.IOException; +import java.util.Comparator; import org.apache.lucene.codecs.TermVectorsReader; import org.apache.lucene.codecs.TermVectorsWriter; @@ -365,4 +366,9 @@ public final class Lucene40TermVectorsWriter extends TermVectorsWriter { IOUtils.close(tvx, tvd, tvf); tvx = tvd = tvf = null; } + + @Override + public Comparator getComparator() throws IOException { + return BytesRef.getUTF8SortedAsUnicodeComparator(); + } } diff --git a/lucene/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsWriter.java b/lucene/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsWriter.java index 7257ac1622d..cabb56a08aa 100644 --- a/lucene/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsWriter.java +++ b/lucene/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsWriter.java @@ -18,6 +18,7 @@ package org.apache.lucene.codecs.simpletext; */ import java.io.IOException; +import java.util.Comparator; import org.apache.lucene.codecs.TermVectorsWriter; import org.apache.lucene.index.FieldInfo; @@ -170,6 +171,11 @@ public class SimpleTextTermVectorsWriter extends TermVectorsWriter { } } + @Override + public Comparator getComparator() throws IOException { + return BytesRef.getUTF8SortedAsUnicodeComparator(); + } + private void write(String s) throws IOException { SimpleTextUtil.write(out, s, scratch); } diff --git a/lucene/src/java/org/apache/lucene/index/TermVectorsConsumerPerField.java b/lucene/src/java/org/apache/lucene/index/TermVectorsConsumerPerField.java index 7aa131ba9ec..729839105cf 100644 --- a/lucene/src/java/org/apache/lucene/index/TermVectorsConsumerPerField.java +++ b/lucene/src/java/org/apache/lucene/index/TermVectorsConsumerPerField.java @@ -118,9 +118,7 @@ final class TermVectorsConsumerPerField extends TermsHashConsumerPerField { TermVectorsPostingsArray postings = (TermVectorsPostingsArray) termsHashPerField.postingsArray; final TermVectorsWriter tv = termsWriter.writer; - // TODO: we may want to make this sort in same order - // as Codec's terms dict? - final int[] termIDs = termsHashPerField.sortPostings(BytesRef.getUTF8SortedAsUnicodeComparator()); + final int[] termIDs = termsHashPerField.sortPostings(tv.getComparator()); tv.startField(fieldInfo, numPostings, doVectorPositions, doVectorOffsets); diff --git a/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsFormat.java b/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsFormat.java index d78e0a99d9b..8646f97c158 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsFormat.java +++ b/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsFormat.java @@ -19,10 +19,15 @@ package org.apache.lucene.codecs.preflexrw; import java.io.IOException; +import org.apache.lucene.codecs.TermVectorsReader; import org.apache.lucene.codecs.TermVectorsWriter; import org.apache.lucene.codecs.lucene3x.Lucene3xTermVectorsFormat; +import org.apache.lucene.codecs.lucene3x.Lucene3xTermVectorsReader; +import org.apache.lucene.index.FieldInfos; +import org.apache.lucene.index.SegmentInfo; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; +import org.apache.lucene.util.LuceneTestCase; public class PreFlexRWTermVectorsFormat extends Lucene3xTermVectorsFormat { @@ -30,4 +35,30 @@ public class PreFlexRWTermVectorsFormat extends Lucene3xTermVectorsFormat { public TermVectorsWriter vectorsWriter(Directory directory, String segment, IOContext context) throws IOException { return new PreFlexRWTermVectorsWriter(directory, segment, context); } + + @Override + public TermVectorsReader vectorsReader(Directory directory, SegmentInfo segmentInfo, FieldInfos fieldInfos, IOContext context) throws IOException { + return new Lucene3xTermVectorsReader(directory, segmentInfo, fieldInfos, context) { + @Override + protected boolean sortTermsByUnicode() { + // We carefully peek into stack track above us: if + // we are part of a "merge", we must sort by UTF16: + boolean unicodeSortOrder = true; + + StackTraceElement[] trace = new Exception().getStackTrace(); + for (int i = 0; i < trace.length; i++) { + //System.out.println(trace[i].getClassName()); + if ("merge".equals(trace[i].getMethodName())) { + unicodeSortOrder = false; + if (LuceneTestCase.VERBOSE) { + System.out.println("NOTE: PreFlexRW codec: forcing legacy UTF16 vector term sort order"); + } + break; + } + } + + return unicodeSortOrder; + } + }; + } } diff --git a/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsWriter.java b/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsWriter.java index bf30f4178ce..1bb97d32b87 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsWriter.java +++ b/lucene/src/test-framework/java/org/apache/lucene/codecs/preflexrw/PreFlexRWTermVectorsWriter.java @@ -18,6 +18,7 @@ package org.apache.lucene.codecs.preflexrw; */ import java.io.IOException; +import java.util.Comparator; import org.apache.lucene.codecs.TermVectorsWriter; import org.apache.lucene.codecs.lucene3x.Lucene3xTermVectorsReader; @@ -32,7 +33,6 @@ import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.IOUtils; import org.apache.lucene.util.StringHelper; -// TODO: surrogates dance! public final class PreFlexRWTermVectorsWriter extends TermVectorsWriter { private final Directory directory; private final String segment; @@ -213,4 +213,9 @@ public final class PreFlexRWTermVectorsWriter extends TermVectorsWriter { IOUtils.close(tvx, tvd, tvf); tvx = tvd = tvf = null; } + + @Override + public Comparator getComparator() throws IOException { + return BytesRef.getUTF8SortedAsUTF16Comparator(); + } } diff --git a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java index 78933575ea8..6def7697165 100644 --- a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java +++ b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java @@ -734,5 +734,16 @@ public class TestBackwardsCompatibility extends LuceneTestCase { dir.close(); } } + + public static final String surrogatesIndexName = "index.36.surrogates.zip"; + + public void testSurrogates() throws Exception { + File oldIndexDir = _TestUtil.getTempDir("surrogates"); + _TestUtil.unzip(getDataFile(surrogatesIndexName), oldIndexDir); + Directory dir = newFSDirectory(oldIndexDir); + // TODO: more tests + _TestUtil.checkIndex(dir); + dir.close(); + } } diff --git a/lucene/src/test/org/apache/lucene/index/index.36.surrogates.zip b/lucene/src/test/org/apache/lucene/index/index.36.surrogates.zip new file mode 100644 index 0000000000000000000000000000000000000000..6bd7f2027d18a1dfb4445dfea6d3d8f681f84402 GIT binary patch literal 40680 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ⅆMEJGquC7ufo00<3R+ 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 BA`Som literal 0 HcmV?d00001