blob: 11795f5fca3e33a5747716b36083157681a509c5 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Text;
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.
*/
using AttributeSource = Lucene.Net.Util.AttributeSource;
using IBits = Lucene.Net.Util.IBits;
using BytesRef = Lucene.Net.Util.BytesRef;
/// <summary>
/// A <see cref="FilterAtomicReader"/> contains another <see cref="AtomicReader"/>, which it
/// uses as its basic source of data, possibly transforming the data along the
/// way or providing additional functionality. The class
/// <see cref="FilterAtomicReader"/> itself simply implements all abstract methods
/// of <see cref="IndexReader"/> with versions that pass all requests to the
/// contained index reader. Subclasses of <see cref="FilterAtomicReader"/> may
/// further override some of these methods and may also provide additional
/// methods and fields.
/// <para/><b>NOTE</b>: If you override <see cref="LiveDocs"/>, you will likely need
/// to override <see cref="NumDocs"/> as well and vice-versa.
/// <para/><b>NOTE</b>: If this <see cref="FilterAtomicReader"/> does not change the
/// content the contained reader, you could consider overriding
/// <see cref="IndexReader.CoreCacheKey"/> so that <see cref="Search.IFieldCache"/> and
/// <see cref="Search.CachingWrapperFilter"/> share the same entries for this atomic reader
/// and the wrapped one. <see cref="IndexReader.CombinedCoreAndDeletesKey"/> could be
/// overridden as well if the <see cref="LiveDocs"/> are not changed
/// either.
/// </summary>
public class FilterAtomicReader : AtomicReader
{
/// <summary>
/// Get the wrapped instance by <paramref name="reader"/> as long as this reader is
/// an intance of <see cref="FilterAtomicReader"/>.
/// </summary>
public static AtomicReader Unwrap(AtomicReader reader)
{
while (reader is FilterAtomicReader)
{
reader = ((FilterAtomicReader)reader).m_input;
}
return reader;
}
/// <summary>
/// Base class for filtering <see cref="Index.Fields"/>
/// implementations.
/// </summary>
public class FilterFields : Fields
{
/// <summary>
/// The underlying <see cref="Index.Fields"/> instance. </summary>
protected readonly Fields m_input;
/// <summary>
/// Creates a new <see cref="FilterFields"/>. </summary>
/// <param name="input"> the underlying <see cref="Index.Fields"/> instance. </param>
public FilterFields(Fields input)
{
this.m_input = input;
}
public override IEnumerator<string> GetEnumerator()
{
return m_input.GetEnumerator();
}
public override Terms GetTerms(string field)
{
return m_input.GetTerms(field);
}
public override int Count => m_input.Count;
}
/// <summary>
/// Base class for filtering <see cref="Terms"/> implementations.
/// <para/><b>NOTE</b>: If the order of terms and documents is not changed, and if
/// these terms are going to be intersected with automata, you could consider
/// overriding <see cref="Terms.Intersect"/> for better performance.
/// </summary>
public class FilterTerms : Terms
{
/// <summary>
/// The underlying <see cref="Terms"/> instance. </summary>
protected readonly Terms m_input;
/// <summary>
/// Creates a new <see cref="FilterTerms"/> </summary>
/// <param name="input"> the underlying <see cref="Terms"/> instance. </param>
public FilterTerms(Terms input)
{
this.m_input = input;
}
public override TermsEnum GetEnumerator() => m_input.GetEnumerator();
public override TermsEnum GetEnumerator(TermsEnum reuse) => m_input.GetEnumerator(reuse);
public override IComparer<BytesRef> Comparer => m_input.Comparer;
public override long Count => m_input.Count;
public override long SumTotalTermFreq => m_input.SumTotalTermFreq;
public override long SumDocFreq => m_input.SumDocFreq;
public override int DocCount => m_input.DocCount;
public override bool HasFreqs => m_input.HasFreqs;
public override bool HasOffsets => m_input.HasOffsets;
public override bool HasPositions => m_input.HasPositions;
public override bool HasPayloads => m_input.HasPayloads;
}
/// <summary>
/// Base class for filtering <see cref="TermsEnum"/> implementations. </summary>
public class FilterTermsEnum : TermsEnum
{
/// <summary>
/// The underlying <see cref="TermsEnum"/> instance. </summary>
protected internal readonly TermsEnum m_input;
/// <summary>
/// Creates a new <see cref="FilterTermsEnum"/> </summary>
/// <param name="input"> the underlying <see cref="TermsEnum"/> instance. </param>
public FilterTermsEnum(TermsEnum input)
{
this.m_input = input;
}
public override AttributeSource Attributes => m_input.Attributes;
public override SeekStatus SeekCeil(BytesRef text)
{
return m_input.SeekCeil(text);
}
public override void SeekExact(long ord)
{
m_input.SeekExact(ord);
}
public override bool MoveNext()
{
return m_input.MoveNext();
}
[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 (MoveNext())
return m_input.Term;
return null;
}
public override BytesRef Term => m_input.Term;
public override long Ord => m_input.Ord;
public override int DocFreq => m_input.DocFreq;
public override long TotalTermFreq => m_input.TotalTermFreq;
public override DocsEnum Docs(IBits liveDocs, DocsEnum reuse, DocsFlags flags)
{
return m_input.Docs(liveDocs, reuse, flags);
}
public override DocsAndPositionsEnum DocsAndPositions(IBits liveDocs, DocsAndPositionsEnum reuse, DocsAndPositionsFlags flags)
{
return m_input.DocsAndPositions(liveDocs, reuse, flags);
}
public override IComparer<BytesRef> Comparer => m_input.Comparer;
}
/// <summary>
/// Base class for filtering <see cref="DocsEnum"/> implementations. </summary>
public class FilterDocsEnum : DocsEnum
{
/// <summary>
/// The underlying <see cref="DocsEnum"/> instance.
/// </summary>
protected internal DocsEnum m_input;
/// <summary>
/// Create a new <see cref="FilterDocsEnum"/> </summary>
/// <param name="input"> the underlying <see cref="DocsEnum"/> instance. </param>
public FilterDocsEnum(DocsEnum input)
{
this.m_input = input;
}
public override AttributeSource Attributes => m_input.Attributes;
public override int DocID => m_input.DocID;
public override int Freq => m_input.Freq;
public override int NextDoc()
{
return m_input.NextDoc();
}
public override int Advance(int target)
{
return m_input.Advance(target);
}
public override long GetCost()
{
return m_input.GetCost();
}
}
/// <summary>
/// Base class for filtering <see cref="DocsAndPositionsEnum"/> implementations. </summary>
public class FilterDocsAndPositionsEnum : DocsAndPositionsEnum
{
/// <summary>
/// The underlying <see cref="DocsAndPositionsEnum"/> instance. </summary>
protected internal readonly DocsAndPositionsEnum m_input;
/// <summary>
/// Create a new <see cref="FilterDocsAndPositionsEnum"/> </summary>
/// <param name="input"> the underlying <see cref="DocsAndPositionsEnum"/> instance. </param>
public FilterDocsAndPositionsEnum(DocsAndPositionsEnum input)
{
this.m_input = input;
}
public override AttributeSource Attributes => m_input.Attributes;
public override int DocID => m_input.DocID;
public override int Freq => m_input.Freq;
public override int NextDoc()
{
return m_input.NextDoc();
}
public override int Advance(int target)
{
return m_input.Advance(target);
}
public override int NextPosition()
{
return m_input.NextPosition();
}
public override int StartOffset => m_input.StartOffset;
public override int EndOffset => m_input.EndOffset;
public override BytesRef GetPayload()
{
return m_input.GetPayload();
}
public override long GetCost()
{
return m_input.GetCost();
}
}
/// <summary>
/// The underlying <see cref="AtomicReader"/>. </summary>
protected readonly AtomicReader m_input;
/// <summary>
/// Construct a <see cref="FilterAtomicReader"/> based on the specified base reader.
/// <para/>
/// Note that base reader is closed if this <see cref="FilterAtomicReader"/> is closed.
/// </summary>
/// <param name="input"> specified base reader. </param>
public FilterAtomicReader(AtomicReader input)
: base()
{
this.m_input = input;
input.RegisterParentReader(this);
}
public override IBits LiveDocs
{
get
{
EnsureOpen();
return m_input.LiveDocs;
}
}
public override FieldInfos FieldInfos => m_input.FieldInfos;
public override Fields GetTermVectors(int docID)
{
EnsureOpen();
return m_input.GetTermVectors(docID);
}
public override int NumDocs =>
// Don't call ensureOpen() here (it could affect performance)
m_input.NumDocs;
public override int MaxDoc =>
// Don't call ensureOpen() here (it could affect performance)
m_input.MaxDoc;
public override void Document(int docID, StoredFieldVisitor visitor)
{
EnsureOpen();
m_input.Document(docID, visitor);
}
protected internal override void DoClose()
{
m_input.Dispose();
}
public override Fields Fields
{
get
{
EnsureOpen();
return m_input.Fields;
}
}
public override string ToString()
{
StringBuilder buffer = new StringBuilder("FilterAtomicReader(");
buffer.Append(m_input);
buffer.Append(')');
return buffer.ToString();
}
public override NumericDocValues GetNumericDocValues(string field)
{
EnsureOpen();
return m_input.GetNumericDocValues(field);
}
public override BinaryDocValues GetBinaryDocValues(string field)
{
EnsureOpen();
return m_input.GetBinaryDocValues(field);
}
public override SortedDocValues GetSortedDocValues(string field)
{
EnsureOpen();
return m_input.GetSortedDocValues(field);
}
public override SortedSetDocValues GetSortedSetDocValues(string field)
{
EnsureOpen();
return m_input.GetSortedSetDocValues(field);
}
public override NumericDocValues GetNormValues(string field)
{
EnsureOpen();
return m_input.GetNormValues(field);
}
public override IBits GetDocsWithField(string field)
{
EnsureOpen();
return m_input.GetDocsWithField(field);
}
public override void CheckIntegrity()
{
EnsureOpen();
m_input.CheckIntegrity();
}
}
}