public static IndexReader MaybeWrapReader(IndexReader r)
{
Random random = Random();
if (Rarely())
{
// TODO: remove this, and fix those tests to wrap before putting slow around:
bool wasOriginallyAtomic = r is AtomicReader;
for (int i = 0, c = random.Next(6) + 1; i < c; i++)
{
switch (random.Next(5))
{
case 0:
r = SlowCompositeReaderWrapper.Wrap(r);
break;
case 1:
// will create no FC insanity in atomic case, as ParallelAtomicReader has own cache key:
r = (r is AtomicReader) ? (IndexReader)new ParallelAtomicReader((AtomicReader)r) : new ParallelCompositeReader((CompositeReader)r);
break;
case 2:
// Häckidy-Hick-Hack: a standard MultiReader will cause FC insanity, so we use
// QueryUtils' reader with a fake cache key, so insanity checker cannot walk
// along our reader:
r = new FCInvisibleMultiReader(r);
break;
case 3:
AtomicReader ar = SlowCompositeReaderWrapper.Wrap(r);
IList<string> allFields = new List<string>();
foreach (FieldInfo fi in ar.FieldInfos)
{
allFields.Add(fi.Name);
}
allFields = CollectionsHelper.Shuffle(allFields);
int end = allFields.Count == 0 ? 0 : random.Next(allFields.Count);
HashSet<string> fields = new HashSet<string>(allFields.SubList(0, end));
// will create no FC insanity as ParallelAtomicReader has own cache key:
r = new ParallelAtomicReader(new FieldFilterAtomicReader(ar, fields, false), new FieldFilterAtomicReader(ar, fields, true));
break;
case 4:
// Häckidy-Hick-Hack: a standard Reader will cause FC insanity, so we use
// QueryUtils' reader with a fake cache key, so insanity checker cannot walk
// along our reader:
if (r is AtomicReader)
{
r = new AssertingAtomicReader((AtomicReader)r);
}
else if (r is DirectoryReader)
{
r = new AssertingDirectoryReader((DirectoryReader)r);
}
break;
default:
Assert.Fail("should not get here");
break;
}
}
if (wasOriginallyAtomic)
{
r = SlowCompositeReaderWrapper.Wrap(r);
}
else if ((r is CompositeReader) && !(r is FCInvisibleMultiReader))
{
// prevent cache insanity caused by e.g. ParallelCompositeReader, to fix we wrap one more time:
r = new FCInvisibleMultiReader(r);
}
if (VERBOSE)
{
Console.WriteLine("maybeWrapReader wrapped: " + r);
}
}
return r;
}