mirror of https://github.com/apache/lucene.git
LUCENE-4055: don't modify FieldInfo during flush
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene4055@1340181 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b0ec623d46
commit
12f88eec3f
|
@ -23,7 +23,7 @@ import java.util.Map;
|
||||||
abstract class DocFieldConsumer {
|
abstract class DocFieldConsumer {
|
||||||
/** Called when DocumentsWriterPerThread decides to create a new
|
/** Called when DocumentsWriterPerThread decides to create a new
|
||||||
* segment */
|
* segment */
|
||||||
abstract void flush(Map<FieldInfo, DocFieldConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
abstract void flush(Map<String, DocFieldConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
||||||
|
|
||||||
/** Called when an aborting exception is hit */
|
/** Called when an aborting exception is hit */
|
||||||
abstract void abort();
|
abstract void abort();
|
||||||
|
|
|
@ -71,10 +71,10 @@ final class DocFieldProcessor extends DocConsumer {
|
||||||
@Override
|
@Override
|
||||||
public void flush(SegmentWriteState state) throws IOException {
|
public void flush(SegmentWriteState state) throws IOException {
|
||||||
|
|
||||||
Map<FieldInfo, DocFieldConsumerPerField> childFields = new HashMap<FieldInfo, DocFieldConsumerPerField>();
|
Map<String,DocFieldConsumerPerField> childFields = new HashMap<String,DocFieldConsumerPerField>();
|
||||||
Collection<DocFieldConsumerPerField> fields = fields();
|
Collection<DocFieldConsumerPerField> fields = fields();
|
||||||
for (DocFieldConsumerPerField f : fields) {
|
for (DocFieldConsumerPerField f : fields) {
|
||||||
childFields.put(f.getFieldInfo(), f);
|
childFields.put(f.getFieldInfo().name, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldsWriter.flush(state);
|
fieldsWriter.flush(state);
|
||||||
|
|
|
@ -39,12 +39,12 @@ final class DocInverter extends DocFieldConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void flush(Map<FieldInfo, DocFieldConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException {
|
void flush(Map<String, DocFieldConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException {
|
||||||
|
|
||||||
Map<FieldInfo, InvertedDocConsumerPerField> childFieldsToFlush = new HashMap<FieldInfo, InvertedDocConsumerPerField>();
|
Map<String, InvertedDocConsumerPerField> childFieldsToFlush = new HashMap<String, InvertedDocConsumerPerField>();
|
||||||
Map<FieldInfo, InvertedDocEndConsumerPerField> endChildFieldsToFlush = new HashMap<FieldInfo, InvertedDocEndConsumerPerField>();
|
Map<String, InvertedDocEndConsumerPerField> endChildFieldsToFlush = new HashMap<String, InvertedDocEndConsumerPerField>();
|
||||||
|
|
||||||
for (Map.Entry<FieldInfo, DocFieldConsumerPerField> fieldToFlush : fieldsToFlush.entrySet()) {
|
for (Map.Entry<String, DocFieldConsumerPerField> fieldToFlush : fieldsToFlush.entrySet()) {
|
||||||
DocInverterPerField perField = (DocInverterPerField) fieldToFlush.getValue();
|
DocInverterPerField perField = (DocInverterPerField) fieldToFlush.getValue();
|
||||||
childFieldsToFlush.put(fieldToFlush.getKey(), perField.consumer);
|
childFieldsToFlush.put(fieldToFlush.getKey(), perField.consumer);
|
||||||
endChildFieldsToFlush.put(fieldToFlush.getKey(), perField.endConsumer);
|
endChildFieldsToFlush.put(fieldToFlush.getKey(), perField.endConsumer);
|
||||||
|
|
|
@ -79,6 +79,12 @@ public final class FieldInfo {
|
||||||
} else { // for non-indexed fields, leave defaults
|
} else { // for non-indexed fields, leave defaults
|
||||||
this.storeTermVector = false;
|
this.storeTermVector = false;
|
||||||
this.storePayloads = false;
|
this.storePayloads = false;
|
||||||
|
// nocommit these trip ... which is spooky... means
|
||||||
|
// the FI we are cloning was in a bad state...
|
||||||
|
//assert !storeTermVector;
|
||||||
|
//assert !storePayloads;
|
||||||
|
//assert !omitNorms;
|
||||||
|
//assert normsType == null;
|
||||||
this.omitNorms = false;
|
this.omitNorms = false;
|
||||||
this.indexOptions = IndexOptions.DOCS_AND_FREQS_AND_POSITIONS;
|
this.indexOptions = IndexOptions.DOCS_AND_FREQS_AND_POSITIONS;
|
||||||
this.normType = null;
|
this.normType = null;
|
||||||
|
@ -155,7 +161,9 @@ public final class FieldInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
void setStorePayloads() {
|
void setStorePayloads() {
|
||||||
storePayloads = true;
|
if (indexed && indexOptions.compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0) {
|
||||||
|
storePayloads = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setNormValueType(Type type) {
|
void setNormValueType(Type type) {
|
||||||
|
|
|
@ -306,8 +306,12 @@ public class FieldInfos implements Iterable<FieldInfo> {
|
||||||
}
|
}
|
||||||
|
|
||||||
final FieldInfos finish() {
|
final FieldInfos finish() {
|
||||||
// nocommit: bogus we don't clone each FI
|
FieldInfo[] cloned = new FieldInfo[byName.size()];
|
||||||
return new FieldInfos(byName.values().toArray(new FieldInfo[byName.size()]));
|
int upto = 0;
|
||||||
|
for(FieldInfo fieldInfo : byName.values()) {
|
||||||
|
cloned[upto++] = fieldInfo.clone();
|
||||||
|
}
|
||||||
|
return new FieldInfos(cloned);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ final class FreqProxTermsWriter extends TermsHashConsumer {
|
||||||
// Other writers would presumably share alot of this...
|
// Other writers would presumably share alot of this...
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void flush(Map<FieldInfo, TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
public void flush(Map<String,TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
||||||
|
|
||||||
// Gather all FieldData's that have postings, across all
|
// Gather all FieldData's that have postings, across all
|
||||||
// ThreadStates
|
// ThreadStates
|
||||||
|
@ -80,15 +80,7 @@ final class FreqProxTermsWriter extends TermsHashConsumer {
|
||||||
final FieldInfo fieldInfo = allFields.get(fieldNumber).fieldInfo;
|
final FieldInfo fieldInfo = allFields.get(fieldNumber).fieldInfo;
|
||||||
|
|
||||||
final FreqProxTermsWriterPerField fieldWriter = allFields.get(fieldNumber);
|
final FreqProxTermsWriterPerField fieldWriter = allFields.get(fieldNumber);
|
||||||
|
|
||||||
// Aggregate the storePayload as seen by the same
|
|
||||||
// field across multiple threads
|
|
||||||
if (fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0) {
|
|
||||||
if (fieldWriter.hasPayloads) {
|
|
||||||
fieldInfo.setStorePayloads();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this field has postings then add them to the
|
// If this field has postings then add them to the
|
||||||
// segment
|
// segment
|
||||||
fieldWriter.flush(fieldInfo.name, consumer, state);
|
fieldWriter.flush(fieldInfo.name, consumer, state);
|
||||||
|
|
|
@ -68,7 +68,11 @@ final class FreqProxTermsWriterPerField extends TermsHashConsumerPerField implem
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void finish() {}
|
void finish() {
|
||||||
|
if (hasPayloads) {
|
||||||
|
fieldInfo.setStorePayloads();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean hasPayloads;
|
boolean hasPayloads;
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ abstract class InvertedDocConsumer {
|
||||||
abstract void abort();
|
abstract void abort();
|
||||||
|
|
||||||
/** Flush a new segment */
|
/** Flush a new segment */
|
||||||
abstract void flush(Map<FieldInfo, InvertedDocConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
abstract void flush(Map<String, InvertedDocConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
||||||
|
|
||||||
abstract InvertedDocConsumerPerField addField(DocInverterPerField docInverterPerField, FieldInfo fieldInfo);
|
abstract InvertedDocConsumerPerField addField(DocInverterPerField docInverterPerField, FieldInfo fieldInfo);
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ import java.io.IOException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
abstract class InvertedDocEndConsumer {
|
abstract class InvertedDocEndConsumer {
|
||||||
abstract void flush(Map<FieldInfo, InvertedDocEndConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
abstract void flush(Map<String, InvertedDocEndConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException;
|
||||||
abstract void abort();
|
abstract void abort();
|
||||||
abstract InvertedDocEndConsumerPerField addField(DocInverterPerField docInverterPerField, FieldInfo fieldInfo);
|
abstract InvertedDocEndConsumerPerField addField(DocInverterPerField docInverterPerField, FieldInfo fieldInfo);
|
||||||
abstract void startDocument() throws IOException;
|
abstract void startDocument() throws IOException;
|
||||||
|
|
|
@ -55,13 +55,13 @@ final class NormsConsumer extends InvertedDocEndConsumer {
|
||||||
/** Produce _X.nrm if any document had a field with norms
|
/** Produce _X.nrm if any document had a field with norms
|
||||||
* not disabled */
|
* not disabled */
|
||||||
@Override
|
@Override
|
||||||
public void flush(Map<FieldInfo,InvertedDocEndConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException {
|
public void flush(Map<String,InvertedDocEndConsumerPerField> fieldsToFlush, SegmentWriteState state) throws IOException {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
boolean anythingFlushed = false;
|
boolean anythingFlushed = false;
|
||||||
try {
|
try {
|
||||||
if (state.fieldInfos.hasNorms()) {
|
if (state.fieldInfos.hasNorms()) {
|
||||||
for (FieldInfo fi : state.fieldInfos) {
|
for (FieldInfo fi : state.fieldInfos) {
|
||||||
final NormsConsumerPerField toWrite = (NormsConsumerPerField) fieldsToFlush.get(fi);
|
final NormsConsumerPerField toWrite = (NormsConsumerPerField) fieldsToFlush.get(fi.name);
|
||||||
// we must check the final value of omitNorms for the fieldinfo, it could have
|
// we must check the final value of omitNorms for the fieldinfo, it could have
|
||||||
// changed for this field since the first time we added it.
|
// changed for this field since the first time we added it.
|
||||||
if (!fi.omitsNorms()) {
|
if (!fi.omitsNorms()) {
|
||||||
|
@ -71,7 +71,7 @@ final class NormsConsumer extends InvertedDocEndConsumer {
|
||||||
assert fi.getNormType() == type;
|
assert fi.getNormType() == type;
|
||||||
} else if (fi.isIndexed()) {
|
} else if (fi.isIndexed()) {
|
||||||
anythingFlushed = true;
|
anythingFlushed = true;
|
||||||
assert fi.getNormType() == null;
|
assert fi.getNormType() == null: "got " + fi.getNormType() + "; field=" + fi.name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,8 @@ final class SegmentMerger {
|
||||||
// NOTE: this is actually merging all the fieldinfos
|
// NOTE: this is actually merging all the fieldinfos
|
||||||
public void mergeDocValuesAndNormsFieldInfos() throws IOException {
|
public void mergeDocValuesAndNormsFieldInfos() throws IOException {
|
||||||
// mapping from all docvalues fields found to their promoted types
|
// mapping from all docvalues fields found to their promoted types
|
||||||
// this is because FieldInfos does not store the valueSize
|
// this is because FieldInfos does not store the
|
||||||
|
// valueSize
|
||||||
Map<FieldInfo,TypePromoter> docValuesTypes = new HashMap<FieldInfo,TypePromoter>();
|
Map<FieldInfo,TypePromoter> docValuesTypes = new HashMap<FieldInfo,TypePromoter>();
|
||||||
Map<FieldInfo,TypePromoter> normValuesTypes = new HashMap<FieldInfo,TypePromoter>();
|
Map<FieldInfo,TypePromoter> normValuesTypes = new HashMap<FieldInfo,TypePromoter>();
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ final class TermVectorsConsumer extends TermsHashConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void flush(Map<FieldInfo, TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
void flush(Map<String, TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
||||||
if (writer != null) {
|
if (writer != null) {
|
||||||
// At least one doc in this run had term vectors enabled
|
// At least one doc in this run had term vectors enabled
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -96,17 +96,17 @@ final class TermsHash extends InvertedDocConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void flush(Map<FieldInfo,InvertedDocConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
void flush(Map<String,InvertedDocConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException {
|
||||||
Map<FieldInfo,TermsHashConsumerPerField> childFields = new HashMap<FieldInfo,TermsHashConsumerPerField>();
|
Map<String,TermsHashConsumerPerField> childFields = new HashMap<String,TermsHashConsumerPerField>();
|
||||||
Map<FieldInfo,InvertedDocConsumerPerField> nextChildFields;
|
Map<String,InvertedDocConsumerPerField> nextChildFields;
|
||||||
|
|
||||||
if (nextTermsHash != null) {
|
if (nextTermsHash != null) {
|
||||||
nextChildFields = new HashMap<FieldInfo,InvertedDocConsumerPerField>();
|
nextChildFields = new HashMap<String,InvertedDocConsumerPerField>();
|
||||||
} else {
|
} else {
|
||||||
nextChildFields = null;
|
nextChildFields = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final Map.Entry<FieldInfo,InvertedDocConsumerPerField> entry : fieldsToFlush.entrySet()) {
|
for (final Map.Entry<String,InvertedDocConsumerPerField> entry : fieldsToFlush.entrySet()) {
|
||||||
TermsHashPerField perField = (TermsHashPerField) entry.getValue();
|
TermsHashPerField perField = (TermsHashPerField) entry.getValue();
|
||||||
childFields.put(entry.getKey(), perField.consumer);
|
childFields.put(entry.getKey(), perField.consumer);
|
||||||
if (nextTermsHash != null) {
|
if (nextTermsHash != null) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ import java.io.IOException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
abstract class TermsHashConsumer {
|
abstract class TermsHashConsumer {
|
||||||
abstract void flush(Map<FieldInfo, TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException;
|
abstract void flush(Map<String, TermsHashConsumerPerField> fieldsToFlush, final SegmentWriteState state) throws IOException;
|
||||||
abstract void abort();
|
abstract void abort();
|
||||||
abstract void startDocument() throws IOException;
|
abstract void startDocument() throws IOException;
|
||||||
abstract void finishDocument(TermsHash termsHash) throws IOException;
|
abstract void finishDocument(TermsHash termsHash) throws IOException;
|
||||||
|
|
Loading…
Reference in New Issue