public Lucene3xFields(Directory dir, FieldInfos fieldInfos, SegmentInfo info, IOContext context, int indexDivisor)
{
Si = info;
// NOTE: we must always load terms index, even for
// "sequential" scan during merging, because what is
// sequential to merger may not be to TermInfosReader
// since we do the surrogates dance:
if (indexDivisor < 0)
{
indexDivisor = -indexDivisor;
}
bool success = false;
try
{
TermInfosReader r = new TermInfosReader(dir, info.Name, fieldInfos, context, indexDivisor);
if (indexDivisor == -1)
{
TisNoIndex = r;
}
else
{
TisNoIndex = null;
Tis = r;
}
this.Context = context;
this.FieldInfos = fieldInfos;
// make sure that all index files have been read or are kept open
// so that if an index update removes them we'll still have them
FreqStream = dir.OpenInput(IndexFileNames.SegmentFileName(info.Name, "", Lucene3xPostingsFormat.FREQ_EXTENSION), context);
bool anyProx = false;
foreach (FieldInfo fi in fieldInfos)
{
if (fi.Indexed)
{
Fields[fi.Name] = fi;
PreTerms_[fi.Name] = new PreTerms(this, fi);
if (fi.FieldIndexOptions == FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS)
{
anyProx = true;
}
}
}
if (anyProx)
{
ProxStream = dir.OpenInput(IndexFileNames.SegmentFileName(info.Name, "", Lucene3xPostingsFormat.PROX_EXTENSION), context);
}
else
{
ProxStream = null;
}
success = true;
}
finally
{
// With lock-less commits, it's entirely possible (and
// fine) to hit a FileNotFound exception above. In
// this case, we want to explicitly close any subset
// of things that were opened so that we don't have to
// wait for a GC to do so.
if (!success)
{
Dispose();
}
}
this.Dir = dir;
}