blob: 528f992b7e0108cfa74f5f52b7accb931bf4ead9 [file] [log] [blame]
using Lucene.Net.Index;
using System.Collections.Generic;
using System.Linq;
namespace Lucene.Net.Search.Grouping
{
/*
* 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>
/// A collector that collects all groups that match the
/// query. Only the group value is collected, and the order
/// is undefined. This collector does not determine
/// the most relevant document of a group.
///
/// <para>
/// This is an abstract version. Concrete implementations define
/// what a group actually is and how it is internally collected.
/// </para>
/// @lucene.experimental
/// </summary>
/// <typeparam name="TGroupValue"></typeparam>
public abstract class AbstractAllGroupsCollector<TGroupValue> : IAbstractAllGroupsCollector<TGroupValue>
{
/// <summary>
/// Returns the total number of groups for the executed search.
/// This is a convenience method. The following code snippet has the same effect: <code>GetGroups().Count</code>
/// </summary>
/// <returns>The total number of groups for the executed search</returns>
public virtual int GroupCount => Groups.Count();
/// <summary>
/// Returns the group values
/// <para>
/// This is an unordered collections of group values. For each group that matched the query there is a <see cref="Util.BytesRef"/>
/// representing a group value.
/// </para>
/// </summary>
/// <returns>the group values</returns>
public abstract IEnumerable<TGroupValue> Groups { get; }
// Empty not necessary
public virtual void SetScorer(Scorer scorer)
{
}
// LUCENENET specific - we need to implement these here, since our abstract base class
// is now an interface.
/// <summary>
/// Called once for every document matching a query, with the unbased document
/// number.
/// <para/>Note: The collection of the current segment can be terminated by throwing
/// a <see cref="CollectionTerminatedException"/>. In this case, the last docs of the
/// current <see cref="AtomicReaderContext"/> will be skipped and <see cref="IndexSearcher"/>
/// will swallow the exception and continue collection with the next leaf.
/// <para/>
/// Note: this is called in an inner search loop. For good search performance,
/// implementations of this method should not call <see cref="IndexSearcher.Doc(int)"/> or
/// <see cref="Lucene.Net.Index.IndexReader.Document(int)"/> on every hit.
/// Doing so can slow searches by an order of magnitude or more.
/// </summary>
public abstract void Collect(int doc);
/// <summary>
/// Called before collecting from each <see cref="AtomicReaderContext"/>. All doc ids in
/// <see cref="Collect(int)"/> will correspond to <see cref="Index.IndexReaderContext.Reader"/>.
///
/// Add <see cref="AtomicReaderContext.DocBase"/> to the current <see cref="Index.IndexReaderContext.Reader"/>'s
/// internal document id to re-base ids in <see cref="Collect(int)"/>.
/// </summary>
/// <param name="context">next atomic reader context </param>
public abstract void SetNextReader(AtomicReaderContext context);
public virtual bool AcceptsDocsOutOfOrder => true;
}
/// <summary>
/// LUCENENET specific interface used to apply covariance to TGroupValue
/// </summary>
/// <typeparam name="TGroupValue"></typeparam>
public interface IAbstractAllGroupsCollector<out TGroupValue> : ICollector
{
/// <summary>
/// Returns the total number of groups for the executed search.
/// This is a convenience method. The following code snippet has the same effect: <code>GetGroups().Count</code>
/// </summary>
/// <returns>The total number of groups for the executed search</returns>
int GroupCount { get; }
/// <summary>
/// Returns the group values
/// <para>
/// This is an unordered collections of group values. For each group that matched the query there is a <see cref="Util.BytesRef"/>
/// representing a group value.
/// </para>
/// </summary>
/// <returns>the group values</returns>
IEnumerable<TGroupValue> Groups { get; }
}
}