LUCENE-4055: move 3.x codec specific stuff out of IW into Lucene3xCodec

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene4055@1342371 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael McCandless 2012-05-24 18:48:55 +00:00
parent 6278ae5dd2
commit 85f30fcc97
2 changed files with 38 additions and 22 deletions

View File

@ -18,6 +18,8 @@ package org.apache.lucene.codecs.lucene3x;
*/
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.apache.lucene.codecs.Codec;
import org.apache.lucene.codecs.DocValuesFormat;
@ -31,7 +33,9 @@ import org.apache.lucene.codecs.SegmentInfoFormat;
import org.apache.lucene.codecs.StoredFieldsFormat;
import org.apache.lucene.codecs.TermVectorsFormat;
import org.apache.lucene.codecs.lucene40.Lucene40LiveDocsFormat;
import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.PerDocWriteState;
import org.apache.lucene.index.SegmentInfo;
import org.apache.lucene.index.SegmentInfoPerCommit;
import org.apache.lucene.index.SegmentReadState;
import org.apache.lucene.store.Directory;
@ -123,4 +127,25 @@ public class Lucene3xCodec extends Codec {
public LiveDocsFormat liveDocsFormat() {
return liveDocsFormat;
}
/** Returns file names for shared doc stores, if any, else
* null. */
public static Set<String> getDocStoreFiles(SegmentInfo info) {
if (Lucene3xSegmentInfoFormat.getDocStoreOffset(info) != -1) {
final String dsName = Lucene3xSegmentInfoFormat.getDocStoreSegment(info);
Set<String> files = new HashSet<String>();
if (Lucene3xSegmentInfoFormat.getDocStoreIsCompoundFile(info)) {
files.add(IndexFileNames.segmentFileName(dsName, "", COMPOUND_FILE_STORE_EXTENSION));
} else {
files.add(IndexFileNames.segmentFileName(dsName, "", Lucene3xStoredFieldsReader.FIELDS_INDEX_EXTENSION));
files.add(IndexFileNames.segmentFileName(dsName, "", Lucene3xStoredFieldsReader.FIELDS_EXTENSION));
files.add(IndexFileNames.segmentFileName(dsName, "", Lucene3xTermVectorsReader.VECTORS_INDEX_EXTENSION));
files.add(IndexFileNames.segmentFileName(dsName, "", Lucene3xTermVectorsReader.VECTORS_FIELDS_EXTENSION));
files.add(IndexFileNames.segmentFileName(dsName, "", Lucene3xTermVectorsReader.VECTORS_DOCUMENTS_EXTENSION));
}
return files;
} else {
return null;
}
}
}

View File

@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.codecs.Codec;
import org.apache.lucene.codecs.lucene3x.Lucene3xCodec;
import org.apache.lucene.codecs.lucene3x.Lucene3xSegmentInfoFormat;
import org.apache.lucene.index.DocumentsWriterPerThread.FlushedSegment;
import org.apache.lucene.index.FieldInfos.FieldNumbers;
@ -2369,33 +2370,23 @@ public class IndexWriter implements Closeable, TwoPhaseCommit {
newDsName = segName;
}
Set<String> codecDocStoreFiles = new HashSet<String>();
final boolean hasSharedDocStore = Lucene3xSegmentInfoFormat.getDocStoreOffset(info.info) != -1;
Set<String> docStoreFiles3xOnly = Lucene3xCodec.getDocStoreFiles(info.info);
// copy the attributes map, we modify it for the preflex case
final Map<String,String> attributes;
if (docStoreFiles3xOnly != null) {
// only violate the codec this way if it's preflex &
// shares doc stores
// change docStoreSegment to newDsName
// copy the attributes map, we modify it below:
if (info.info.attributes() == null) {
attributes = new HashMap<String,String>();
} else {
attributes = new HashMap<String,String>(info.info.attributes());
}
if (hasSharedDocStore) {
// only violate the codec this way if it's preflex &
// shares doc stores
// nocommit what to do....
// cant we determine a file is a 3.x shared doc store file if hasSharedDocStore=true
// and the segment prefix != info.info.name instead of this stuff?
if (Lucene3xSegmentInfoFormat.getDocStoreIsCompoundFile(info.info)) {
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "cfx"));
} else {
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "fdt"));
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "fdx"));
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "tvx"));
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "tvf"));
codecDocStoreFiles.add(IndexFileNames.segmentFileName(dsName, "", "tvd"));
}
// change docStoreSegment to newDsName
attributes.put(Lucene3xSegmentInfoFormat.DS_NAME_KEY, newDsName);
} else {
attributes = info.info.attributes();
}
//System.out.println("copy seg=" + info.info.name + " version=" + info.info.getVersion());
@ -2412,7 +2403,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit {
// before writing SegmentInfo:
for (String file: info.files()) {
final String newFileName;
if (codecDocStoreFiles.contains(file)) {
if (docStoreFiles3xOnly != null && docStoreFiles3xOnly.contains(file)) {
newFileName = newDsName + IndexFileNames.stripSegmentName(file);
} else {
newFileName = segName + IndexFileNames.stripSegmentName(file);
@ -2438,7 +2429,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit {
for (String file: info.files()) {
final String newFileName;
if (codecDocStoreFiles.contains(file)) {
if (docStoreFiles3xOnly != null && docStoreFiles3xOnly.contains(file)) {
newFileName = newDsName + IndexFileNames.stripSegmentName(file);
if (dsFilesCopied.contains(newFileName)) {
continue;