-
Notifications
You must be signed in to change notification settings - Fork 624
/
Terms.cs
188 lines (167 loc) · 7.84 KB
/
Terms.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
using Lucene.Net.Support;
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.
*/
using BytesRef = Lucene.Net.Util.BytesRef;
using CompiledAutomaton = Lucene.Net.Util.Automaton.CompiledAutomaton;
/// <summary>
/// Access to the terms in a specific field. See <see cref="Fields"/>.
/// <para/>
/// @lucene.experimental
/// </summary>
public abstract class Terms
{
/// <summary>
/// Sole constructor. (For invocation by subclass
/// constructors, typically implicit.)
/// </summary>
protected Terms()
{
}
/// <summary>
/// Returns an iterator that will step through all
/// terms. This method will not return <c>null</c>.
/// </summary>
public abstract TermsEnum GetEnumerator(); // LUCENENET specific - Refactored to require both overloads, so we don't have a strange null parameter unless needed
/// <summary>
/// Returns an iterator that will step through all
/// terms. This method will not return <c>null</c>.
/// </summary>
/// <param name="reuse">If you have a previous <see cref="TermsEnum"/>,
/// for example from a different field, you can pass it for possible
/// reuse if the implementation can do so.</param>
public virtual TermsEnum GetEnumerator(TermsEnum reuse) => GetEnumerator(); // LUCENENET specific - Refactored to require both overloads, so we don't have a strange null parameter unless needed
/// <summary>
/// Returns an iterator that will step through all
/// terms. This method will not return <c>null</c>. If you have
/// a previous <see cref="TermsEnum"/>, for example from a different
/// field, you can pass it for possible reuse if the
/// implementation can do so.
/// </summary>
[Obsolete("Use GetEnumerator() or GetEnumerator(TermsEnum). This method will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public virtual TermsEnum GetIterator(TermsEnum reuse) => GetEnumerator(reuse);
/// <summary>
/// Returns a <see cref="TermsEnum"/> that iterates over all terms that
/// are accepted by the provided
/// <see cref="CompiledAutomaton"/>. If the <paramref name="startTerm"/> is
/// provided then the returned enum will only accept terms
/// > <paramref name="startTerm"/>, but you still must call
/// <see cref="TermsEnum.MoveNext()"/> first to get to the first term. Note that the
/// provided <paramref name="startTerm"/> must be accepted by
/// the automaton.
///
/// <para><b>NOTE</b>: the returned <see cref="TermsEnum"/> cannot
/// seek</para>.
/// </summary>
public virtual TermsEnum Intersect(CompiledAutomaton compiled, BytesRef startTerm)
{
// TODO: eventually we could support seekCeil/Exact on
// the returned enum, instead of only being able to seek
// at the start
if (compiled.Type != CompiledAutomaton.AUTOMATON_TYPE.NORMAL)
{
throw new ArgumentException("please use CompiledAutomaton.getTermsEnum instead");
}
if (startTerm == null)
{
return new AutomatonTermsEnum(GetEnumerator(), compiled);
}
else
{
return new AutomatonTermsEnumAnonymousClass(GetEnumerator(), compiled, startTerm);
}
}
private class AutomatonTermsEnumAnonymousClass : AutomatonTermsEnum
{
private readonly BytesRef startTerm;
public AutomatonTermsEnumAnonymousClass(TermsEnum iterator, CompiledAutomaton compiled, BytesRef startTerm)
: base(iterator, compiled)
{
this.startTerm = startTerm;
}
protected override BytesRef NextSeekTerm(BytesRef term)
{
if (term == null)
{
term = startTerm;
}
return base.NextSeekTerm(term);
}
}
/// <summary>
/// Return the <see cref="T:IComparer{BytesRef}"/> used to sort terms
/// provided by the iterator. This method may return <c>null</c>
/// if there are no terms. This method may be invoked
/// many times; it's best to cache a single instance &
/// reuse it.
/// </summary>
public abstract IComparer<BytesRef> Comparer { get; }
/// <summary>
/// Returns the number of terms for this field, or -1 if this
/// measure isn't stored by the codec. Note that, just like
/// other term measures, this measure does not take deleted
/// documents into account.
/// NOTE: This was size() in Lucene.
/// </summary>
public abstract long Count { get; }
/// <summary>
/// Returns the sum of <see cref="TermsEnum.TotalTermFreq"/> for
/// all terms in this field, or -1 if this measure isn't
/// stored by the codec (or if this fields omits term freq
/// and positions). Note that, just like other term
/// measures, this measure does not take deleted documents
/// into account.
/// </summary>
public abstract long SumTotalTermFreq { get; }
/// <summary>
/// Returns the sum of <see cref="TermsEnum.DocFreq"/> for
/// all terms in this field, or -1 if this measure isn't
/// stored by the codec. Note that, just like other term
/// measures, this measure does not take deleted documents
/// into account.
/// </summary>
public abstract long SumDocFreq { get; }
/// <summary>
/// Returns the number of documents that have at least one
/// term for this field, or -1 if this measure isn't
/// stored by the codec. Note that, just like other term
/// measures, this measure does not take deleted documents
/// into account.
/// </summary>
public abstract int DocCount { get; }
/// <summary>
/// Returns true if documents in this field store
/// per-document term frequency (<see cref="DocsEnum.Freq"/>).
/// </summary>
public abstract bool HasFreqs { get; }
/// <summary>
/// Returns <c>true</c> if documents in this field store offsets. </summary>
public abstract bool HasOffsets { get; }
/// <summary>
/// Returns <c>true</c> if documents in this field store positions. </summary>
public abstract bool HasPositions { get; }
/// <summary>
/// Returns <c>true</c> if documents in this field store payloads. </summary>
public abstract bool HasPayloads { get; }
/// <summary>
/// Zero-length array of <see cref="Terms"/>. </summary>
public static readonly Terms[] EMPTY_ARRAY = Arrays.Empty<Terms>();
}
}