blob: f71d824e111bb4cbf57af5eb785f9e185b6cc703 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using Lucene.Net.Search;
using Lucene.Net.Util;
using Lucene.Net.Util.Automaton;
using System;
using System.Collections.Generic;
namespace Lucene.Net.Index
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// Wraps a <see cref="Index.Fields"/> but with additional asserts
/// </summary>
public class AssertingFields : FilterAtomicReader.FilterFields
{
public AssertingFields(Fields input)
: base(input)
{ }
public override IEnumerator<string> GetEnumerator()
{
IEnumerator<string> iterator = base.GetEnumerator();
if (Debugging.AssertsEnabled) Debugging.Assert(iterator != null);
return iterator;
}
public override Terms GetTerms(string field)
{
Terms terms = base.GetTerms(field);
return terms == null ? null : new AssertingTerms(terms);
}
}
/// <summary>
/// Wraps a <see cref="Terms"/> but with additional asserts
/// </summary>
public class AssertingTerms : FilterAtomicReader.FilterTerms
{
public AssertingTerms(Terms input)
: base(input)
{ }
public override TermsEnum Intersect(CompiledAutomaton automaton, BytesRef bytes)
{
TermsEnum termsEnum = m_input.Intersect(automaton, bytes);
if (Debugging.AssertsEnabled) Debugging.Assert(termsEnum != null);
if (Debugging.AssertsEnabled) Debugging.Assert(bytes == null || bytes.IsValid());
return new AssertingAtomicReader.AssertingTermsEnum(termsEnum);
}
public override TermsEnum GetEnumerator()
{
var termsEnum = base.GetEnumerator();
if (Debugging.AssertsEnabled) Debugging.Assert(termsEnum != null);
return new AssertingAtomicReader.AssertingTermsEnum(termsEnum);
}
public override TermsEnum GetEnumerator(TermsEnum reuse)
{
// TODO: should we give this thing a random to be super-evil,
// and randomly *not* unwrap?
if (!(reuse is null) && reuse is AssertingAtomicReader.AssertingTermsEnum reusable)
{
reuse = reusable.m_input;
}
TermsEnum termsEnum = base.GetEnumerator(reuse);
if (Debugging.AssertsEnabled) Debugging.Assert(termsEnum != null);
return new AssertingAtomicReader.AssertingTermsEnum(termsEnum);
}
}
internal enum DocsEnumState
{
START,
ITERATING,
FINISHED
}
/// <summary>
/// Wraps a <see cref="DocsEnum"/> with additional checks </summary>
public class AssertingDocsEnum : FilterAtomicReader.FilterDocsEnum
{
private DocsEnumState state = DocsEnumState.START;
private int doc;
public AssertingDocsEnum(DocsEnum @in)
: this(@in, true)
{ }
public AssertingDocsEnum(DocsEnum @in, bool failOnUnsupportedDocID)
: base(@in)
{
try
{
int docid = @in.DocID;
if (Debugging.AssertsEnabled) Debugging.Assert(docid == -1, () => @in.GetType() + ": invalid initial doc id: " + docid);
}
catch (NotSupportedException /*e*/)
{
if (failOnUnsupportedDocID)
{
throw; // LUCENENET: CA2200: Rethrow to preserve stack details (https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2200-rethrow-to-preserve-stack-details)
}
}
doc = -1;
}
public override int NextDoc()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "NextDoc() called after NO_MORE_DOCS");
int nextDoc = base.NextDoc();
if (Debugging.AssertsEnabled) Debugging.Assert(nextDoc > doc, () => "backwards NextDoc from " + doc + " to " + nextDoc + " " + m_input);
if (nextDoc == DocIdSetIterator.NO_MORE_DOCS)
{
state = DocsEnumState.FINISHED;
}
else
{
state = DocsEnumState.ITERATING;
}
if (Debugging.AssertsEnabled) Debugging.Assert(base.DocID == nextDoc);
return doc = nextDoc;
}
public override int Advance(int target)
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "Advance() called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(target > doc, () => "target must be > DocID, got " + target + " <= " + doc);
int advanced = base.Advance(target);
if (Debugging.AssertsEnabled) Debugging.Assert(advanced >= target, () => "backwards advance from: " + target + " to: " + advanced);
if (advanced == DocIdSetIterator.NO_MORE_DOCS)
{
state = DocsEnumState.FINISHED;
}
else
{
state = DocsEnumState.ITERATING;
}
if (Debugging.AssertsEnabled) Debugging.Assert(base.DocID == advanced);
return doc = advanced;
}
public override int DocID
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(doc == base.DocID, () => " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
return doc;
}
}
public override int Freq
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "Freq called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "Freq called after NO_MORE_DOCS");
int freq = base.Freq;
if (Debugging.AssertsEnabled) Debugging.Assert(freq > 0);
return freq;
}
}
}
/// <summary>
/// Wraps a <see cref="NumericDocValues"/> but with additional asserts </summary>
public class AssertingNumericDocValues : NumericDocValues
{
private readonly NumericDocValues @in;
private readonly int maxDoc;
public AssertingNumericDocValues(NumericDocValues @in, int maxDoc)
{
this.@in = @in;
this.maxDoc = maxDoc;
}
public override long Get(int docID)
{
if (Debugging.AssertsEnabled) Debugging.Assert(docID >= 0 && docID < maxDoc);
return @in.Get(docID);
}
}
/// <summary>
/// Wraps a <see cref="BinaryDocValues"/> but with additional asserts </summary>
public class AssertingBinaryDocValues : BinaryDocValues
{
private readonly BinaryDocValues @in;
private readonly int maxDoc;
public AssertingBinaryDocValues(BinaryDocValues @in, int maxDoc)
{
this.@in = @in;
this.maxDoc = maxDoc;
}
public override void Get(int docID, BytesRef result)
{
if (Debugging.AssertsEnabled) Debugging.Assert(docID >= 0 && docID < maxDoc);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
@in.Get(docID, result);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
}
}
/// <summary>
/// Wraps a <see cref="SortedDocValues"/> but with additional asserts </summary>
public class AssertingSortedDocValues : SortedDocValues
{
private readonly SortedDocValues @in;
private readonly int maxDoc;
private readonly int valueCount;
public AssertingSortedDocValues(SortedDocValues @in, int maxDoc)
{
this.@in = @in;
this.maxDoc = maxDoc;
this.valueCount = @in.ValueCount;
if (Debugging.AssertsEnabled) Debugging.Assert(valueCount >= 0 && valueCount <= maxDoc);
}
public override int GetOrd(int docID)
{
if (Debugging.AssertsEnabled) Debugging.Assert(docID >= 0 && docID < maxDoc);
int ord = @in.GetOrd(docID);
if (Debugging.AssertsEnabled) Debugging.Assert(ord >= -1 && ord < valueCount);
return ord;
}
public override void LookupOrd(int ord, BytesRef result)
{
if (Debugging.AssertsEnabled) Debugging.Assert(ord >= 0 && ord < valueCount);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
@in.LookupOrd(ord, result);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
}
public override int ValueCount
{
get
{
int valueCount = @in.ValueCount;
if (Debugging.AssertsEnabled) Debugging.Assert(valueCount == this.valueCount); // should not change
return valueCount;
}
}
public override void Get(int docID, BytesRef result)
{
if (Debugging.AssertsEnabled) Debugging.Assert(docID >= 0 && docID < maxDoc);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
@in.Get(docID, result);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
}
public override int LookupTerm(BytesRef key)
{
if (Debugging.AssertsEnabled) Debugging.Assert(key.IsValid());
int result = @in.LookupTerm(key);
if (Debugging.AssertsEnabled) Debugging.Assert(result < valueCount);
if (Debugging.AssertsEnabled) Debugging.Assert(key.IsValid());
return result;
}
}
/// <summary>
/// Wraps a <see cref="SortedSetDocValues"/> but with additional asserts </summary>
public class AssertingSortedSetDocValues : SortedSetDocValues
{
private readonly SortedSetDocValues @in;
private readonly int maxDoc;
private readonly long valueCount;
private long lastOrd = NO_MORE_ORDS;
public AssertingSortedSetDocValues(SortedSetDocValues @in, int maxDoc)
{
this.@in = @in;
this.maxDoc = maxDoc;
this.valueCount = @in.ValueCount;
if (Debugging.AssertsEnabled) Debugging.Assert(valueCount >= 0);
}
public override long NextOrd()
{
if (Debugging.AssertsEnabled) Debugging.Assert(lastOrd != NO_MORE_ORDS);
long ord = @in.NextOrd();
if (Debugging.AssertsEnabled) Debugging.Assert(ord < valueCount);
if (Debugging.AssertsEnabled) Debugging.Assert(ord == NO_MORE_ORDS || ord > lastOrd);
lastOrd = ord;
return ord;
}
public override void SetDocument(int docID)
{
if (Debugging.AssertsEnabled) Debugging.Assert(docID >= 0 && docID < maxDoc, () => "docid=" + docID + ",maxDoc=" + maxDoc);
@in.SetDocument(docID);
lastOrd = -2;
}
public override void LookupOrd(long ord, BytesRef result)
{
if (Debugging.AssertsEnabled) Debugging.Assert(ord >= 0 && ord < valueCount);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
@in.LookupOrd(ord, result);
if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid());
}
public override long ValueCount
{
get
{
long valueCount = @in.ValueCount;
if (Debugging.AssertsEnabled) Debugging.Assert(valueCount == this.valueCount); // should not change
return valueCount;
}
}
public override long LookupTerm(BytesRef key)
{
if (Debugging.AssertsEnabled) Debugging.Assert(key.IsValid());
long result = @in.LookupTerm(key);
if (Debugging.AssertsEnabled) Debugging.Assert(result < valueCount);
if (Debugging.AssertsEnabled) Debugging.Assert(key.IsValid());
return result;
}
}
/// <summary>
/// Wraps a <see cref="IBits"/> but with additional asserts </summary>
public class AssertingBits : IBits
{
internal readonly IBits @in;
public AssertingBits(IBits @in)
{
this.@in = @in;
}
public virtual bool Get(int index)
{
if (Debugging.AssertsEnabled) Debugging.Assert(index >= 0 && index < Length);
return @in.Get(index);
}
public virtual int Length => @in.Length;
}
/// <summary>
/// A <see cref="FilterAtomicReader"/> that can be used to apply
/// additional checks for tests.
/// </summary>
public class AssertingAtomicReader : FilterAtomicReader
{
public AssertingAtomicReader(AtomicReader @in)
: base(@in)
{
// check some basic reader sanity
if (Debugging.AssertsEnabled) Debugging.Assert(@in.MaxDoc >= 0);
if (Debugging.AssertsEnabled) Debugging.Assert(@in.NumDocs <= @in.MaxDoc);
if (Debugging.AssertsEnabled) Debugging.Assert(@in.NumDeletedDocs + @in.NumDocs == @in.MaxDoc);
if (Debugging.AssertsEnabled) Debugging.Assert(!@in.HasDeletions || @in.NumDeletedDocs > 0 && @in.NumDocs < @in.MaxDoc);
}
public override Fields Fields
{
get
{
Fields fields = base.Fields;
return fields == null ? null : new AssertingFields(fields);
}
}
public override Fields GetTermVectors(int docID)
{
Fields fields = base.GetTermVectors(docID);
return fields == null ? null : new AssertingFields(fields);
}
// LUCENENET specific - de-nested AssertingFields
// LUCENENET specific - de-nested AssertingTerms
// LUCENENET specific - de-nested AssertingTermsEnum
internal class AssertingTermsEnum : FilterTermsEnum
{
private enum State
{
INITIAL,
POSITIONED,
UNPOSITIONED
}
private State state = State.INITIAL;
public AssertingTermsEnum(TermsEnum @in)
: base(@in)
{ }
public override DocsEnum Docs(IBits liveDocs, DocsEnum reuse, DocsFlags flags)
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "Docs(...) called on unpositioned TermsEnum");
// TODO: should we give this thing a random to be super-evil,
// and randomly *not* unwrap?
if (reuse is AssertingDocsEnum)
{
reuse = ((AssertingDocsEnum)reuse).m_input;
}
DocsEnum docs = base.Docs(liveDocs, reuse, flags);
return docs == null ? null : new AssertingDocsEnum(docs);
}
public override DocsAndPositionsEnum DocsAndPositions(IBits liveDocs, DocsAndPositionsEnum reuse, DocsAndPositionsFlags flags)
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "DocsAndPositions(...) called on unpositioned TermsEnum");
// TODO: should we give this thing a random to be super-evil,
// and randomly *not* unwrap?
if (reuse is AssertingDocsAndPositionsEnum)
{
reuse = ((AssertingDocsAndPositionsEnum)reuse).m_input;
}
DocsAndPositionsEnum docs = base.DocsAndPositions(liveDocs, reuse, flags);
return docs == null ? null : new AssertingDocsAndPositionsEnum(docs);
}
public override bool MoveNext()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.INITIAL || state == State.POSITIONED, "MoveNext() called on unpositioned TermsEnum");
if (!base.MoveNext())
{
state = State.UNPOSITIONED;
return false;
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(base.Term.IsValid());
state = State.POSITIONED;
return true;
}
}
// TODO: we should separately track if we are 'at the end' ?
// someone should not call next() after it returns null!!!!
[Obsolete("Use MoveNext() and Term instead. This method will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override BytesRef Next()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.INITIAL || state == State.POSITIONED, "Next() called on unpositioned TermsEnum");
if (MoveNext())
return base.Term;
return null;
}
public override long Ord
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "Ord called on unpositioned TermsEnum");
return base.Ord;
}
}
public override int DocFreq
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "DocFreq called on unpositioned TermsEnum");
return base.DocFreq;
}
}
public override long TotalTermFreq
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "TotalTermFreq called on unpositioned TermsEnum");
return base.TotalTermFreq;
}
}
public override BytesRef Term
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "Term called on unpositioned TermsEnum");
BytesRef ret = base.Term;
if (Debugging.AssertsEnabled) Debugging.Assert(ret == null || ret.IsValid());
return ret;
}
}
public override void SeekExact(long ord)
{
base.SeekExact(ord);
state = State.POSITIONED;
}
public override SeekStatus SeekCeil(BytesRef term)
{
if (Debugging.AssertsEnabled) Debugging.Assert(term.IsValid());
SeekStatus result = base.SeekCeil(term);
if (result == SeekStatus.END)
{
state = State.UNPOSITIONED;
}
else
{
state = State.POSITIONED;
}
return result;
}
public override bool SeekExact(BytesRef text)
{
if (Debugging.AssertsEnabled) Debugging.Assert(text.IsValid());
if (base.SeekExact(text))
{
state = State.POSITIONED;
return true;
}
else
{
state = State.UNPOSITIONED;
return false;
}
}
public override TermState GetTermState()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state == State.POSITIONED, "GetTermState() called on unpositioned TermsEnum");
return base.GetTermState();
}
public override void SeekExact(BytesRef term, TermState state)
{
if (Debugging.AssertsEnabled) Debugging.Assert(term.IsValid());
base.SeekExact(term, state);
this.state = State.POSITIONED;
}
}
// LUCENENET specific - de-nested DocsEnumState
// LUCENENET specific - de-nested AssertingDocsEnum
internal class AssertingDocsAndPositionsEnum : FilterDocsAndPositionsEnum
{
private DocsEnumState state = DocsEnumState.START;
private int positionMax = 0;
private int positionCount = 0;
private int doc;
public AssertingDocsAndPositionsEnum(DocsAndPositionsEnum @in)
: base(@in)
{
int docid = @in.DocID;
if (Debugging.AssertsEnabled) Debugging.Assert(docid == -1, () => "invalid initial doc id: " + docid);
doc = -1;
}
public override int NextDoc()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "NextDoc() called after NO_MORE_DOCS");
int nextDoc = base.NextDoc();
if (Debugging.AssertsEnabled) Debugging.Assert(nextDoc > doc, () => "backwards nextDoc from " + doc + " to " + nextDoc);
positionCount = 0;
if (nextDoc == DocIdSetIterator.NO_MORE_DOCS)
{
state = DocsEnumState.FINISHED;
positionMax = 0;
}
else
{
state = DocsEnumState.ITERATING;
positionMax = base.Freq;
}
if (Debugging.AssertsEnabled) Debugging.Assert(base.DocID == nextDoc);
return doc = nextDoc;
}
public override int Advance(int target)
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "Advance() called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(target > doc, () => "target must be > DocID, got " + target + " <= " + doc);
int advanced = base.Advance(target);
if (Debugging.AssertsEnabled) Debugging.Assert(advanced >= target, () => "backwards advance from: " + target + " to: " + advanced);
positionCount = 0;
if (advanced == DocIdSetIterator.NO_MORE_DOCS)
{
state = DocsEnumState.FINISHED;
positionMax = 0;
}
else
{
state = DocsEnumState.ITERATING;
positionMax = base.Freq;
}
if (Debugging.AssertsEnabled) Debugging.Assert(base.DocID == advanced);
return doc = advanced;
}
public override int DocID
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(doc == base.DocID, () => " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
return doc;
}
}
public override int Freq
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "Freq called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "Freq called after NO_MORE_DOCS");
int freq = base.Freq;
if (Debugging.AssertsEnabled) Debugging.Assert(freq > 0);
return freq;
}
}
public override int NextPosition()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "NextPosition() called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "NextPosition() called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(positionCount < positionMax, "NextPosition() called more than Freq times!");
int position = base.NextPosition();
if (Debugging.AssertsEnabled) Debugging.Assert(position >= 0 || position == -1, () => "invalid position: " + position);
positionCount++;
return position;
}
public override int StartOffset
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "StartOffset called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "StartOffset called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(positionCount > 0, "StartOffset called before NextPosition()!");
return base.StartOffset;
}
}
public override int EndOffset
{
get
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "EndOffset called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "EndOffset called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(positionCount > 0, "EndOffset called before NextPosition()!");
return base.EndOffset;
}
}
public override BytesRef GetPayload()
{
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.START, "GetPayload() called before NextDoc()/Advance()");
if (Debugging.AssertsEnabled) Debugging.Assert(state != DocsEnumState.FINISHED, "GetPayload() called after NO_MORE_DOCS");
if (Debugging.AssertsEnabled) Debugging.Assert(positionCount > 0, "GetPayload() called before NextPosition()!");
BytesRef payload = base.GetPayload();
if (Debugging.AssertsEnabled) Debugging.Assert(payload == null || payload.IsValid() && payload.Length > 0, "GetPayload() returned payload with invalid length!");
return payload;
}
}
// LUCENENET specific - de-nested AssertingNumericDocValues
// LUCENENET specific - de-nested AssertingBinaryDocValues
// LUCENENET specific - de-nested AssertingSortedDocValues
// LUCENENET specific - de-nested AssertingSortedSetDocValues
public override NumericDocValues GetNumericDocValues(string field)
{
NumericDocValues dv = base.GetNumericDocValues(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (dv != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.DocValuesType == DocValuesType.NUMERIC);
return new AssertingNumericDocValues(dv, MaxDoc);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.DocValuesType != DocValuesType.NUMERIC);
return null;
}
}
public override BinaryDocValues GetBinaryDocValues(string field)
{
BinaryDocValues dv = base.GetBinaryDocValues(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (dv != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.DocValuesType == DocValuesType.BINARY);
return new AssertingBinaryDocValues(dv, MaxDoc);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.DocValuesType != DocValuesType.BINARY);
return null;
}
}
public override SortedDocValues GetSortedDocValues(string field)
{
SortedDocValues dv = base.GetSortedDocValues(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (dv != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.DocValuesType == DocValuesType.SORTED);
return new AssertingSortedDocValues(dv, MaxDoc);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.DocValuesType != DocValuesType.SORTED);
return null;
}
}
public override SortedSetDocValues GetSortedSetDocValues(string field)
{
SortedSetDocValues dv = base.GetSortedSetDocValues(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (dv != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.DocValuesType == DocValuesType.SORTED_SET);
return new AssertingSortedSetDocValues(dv, MaxDoc);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.DocValuesType != DocValuesType.SORTED_SET);
return null;
}
}
public override NumericDocValues GetNormValues(string field)
{
NumericDocValues dv = base.GetNormValues(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (dv != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.HasNorms);
return new AssertingNumericDocValues(dv, MaxDoc);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.HasNorms == false);
return null;
}
}
// LUCENENET specific - de-nested AssertingBits
public override IBits LiveDocs
{
get
{
IBits liveDocs = base.LiveDocs;
if (liveDocs != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(MaxDoc == liveDocs.Length);
liveDocs = new AssertingBits(liveDocs);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(MaxDoc == NumDocs);
if (Debugging.AssertsEnabled) Debugging.Assert(!HasDeletions);
}
return liveDocs;
}
}
public override IBits GetDocsWithField(string field)
{
IBits docsWithField = base.GetDocsWithField(field);
FieldInfo fi = base.FieldInfos.FieldInfo(field);
if (docsWithField != null)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi != null);
if (Debugging.AssertsEnabled) Debugging.Assert(fi.HasDocValues);
if (Debugging.AssertsEnabled) Debugging.Assert(MaxDoc == docsWithField.Length);
docsWithField = new AssertingBits(docsWithField);
}
else
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi == null || fi.HasDocValues == false);
}
return docsWithField;
}
// this is the same hack as FCInvisible
public override object CoreCacheKey => cacheKey;
public override object CombinedCoreAndDeletesKey => cacheKey;
private readonly object cacheKey = new object();
}
}