This is an automated email from the ASF dual-hosted git repository. nightowl888 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit e12cde4c49bf5665540f29322f70631491133569 Author: Shad Storhaug <[email protected]> AuthorDate: Wed Aug 7 14:21:23 2019 +0700 SWEEP: Ensure all enumerators are disposed of properly (except in some cases where enumerators are set to field variables, see LUCENENET-611) --- .../Analysis/Nl/DutchAnalyzer.cs | 14 +- .../Analysis/Shingle/ShingleFilter.cs | 36 +-- .../Analysis/Synonym/SlowSynonymMap.cs | 54 ++--- .../Analysis/Util/CharArrayMap.cs | 86 +++---- .../Analysis/Util/CharArraySet.cs | 8 +- .../Egothor.Stemmer/Gener.cs | 6 +- .../Egothor.Stemmer/Lift.cs | 4 +- .../Egothor.Stemmer/Optimizer.cs | 8 +- .../Egothor.Stemmer/Reduce.cs | 21 +- .../Egothor.Stemmer/Row.cs | 23 +- .../Support/Sax/Helpers/NamespaceSupport.cs | 1 + .../Memory/MemoryDocValuesConsumer.cs | 3 +- .../SimpleText/SimpleTextDocValuesWriter.cs | 69 +++--- .../Taxonomy/WriterCache/CompactLabelToOrdinal.cs | 11 +- .../VectorHighlight/BaseFragListBuilder.cs | 93 ++++---- .../VectorHighlight/BaseFragmentsBuilder.cs | 54 ++--- .../VectorHighlight/FastVectorHighlighter.cs | 5 +- .../VectorHighlight/FieldPhraseList.cs | 167 ++++++++------ .../VectorHighlight/SingleFragListBuilder.cs | 22 +- src/Lucene.Net.Memory/MemoryIndex.cs | 8 +- .../Flexible/Core/Nodes/OrQueryNode.cs | 4 +- .../Processors/RemoveDeletedQueryNodesProcessor.cs | 4 +- .../Standard/Parser/StandardSyntaxParser.cs | 25 ++- .../Queries/FuzzyLikeThisQuery.cs | 7 +- .../Codecs/Asserting/AssertingDocValuesFormat.cs | 97 ++++---- .../Codecs/MissingOrdRemapper.cs | 21 +- .../Index/FieldFilterAtomicReader.cs | 3 +- .../JavaCompatibility/SystemTypesHelpers.cs | 10 +- .../Store/MockDirectoryWrapper.cs | 163 +++++++------- .../Util/LuceneTestCase.cs | 33 +-- src/Lucene.Net/Index/CoalescedUpdates.cs | 1 + src/Lucene.Net/Index/IndexWriter.cs | 7 +- src/Lucene.Net/Search/BooleanQuery.cs | 115 +++++----- src/Lucene.Net/Search/MultiPhraseQuery.cs | 8 +- src/Lucene.Net/Search/Payloads/PayloadNearQuery.cs | 4 +- src/Lucene.Net/Search/Payloads/PayloadSpanUtil.cs | 5 +- src/Lucene.Net/Search/Spans/SpanNearQuery.cs | 4 +- src/Lucene.Net/Search/Spans/SpanOrQuery.cs | 9 +- .../Search/Spans/SpanPayloadCheckQuery.cs | 18 +- src/Lucene.Net/Support/HashMap.cs | 70 +++--- src/Lucene.Net/Support/TreeSet.cs | 246 +++++++++++---------- src/Lucene.Net/Util/AttributeSource.cs | 16 +- src/Lucene.Net/Util/Automaton/BasicOperations.cs | 5 +- .../Util/Automaton/LevenshteinAutomata.cs | 10 +- src/Lucene.Net/Util/Automaton/SpecialOperations.cs | 8 +- src/Lucene.Net/Util/CloseableThreadLocal.cs | 3 +- src/Lucene.Net/Util/MergedIterator.cs | 5 +- src/Lucene.Net/Util/WAH8DocIdSet.cs | 9 +- .../tools/lucene-cli/SourceCode/ConsolePager.cs | 2 +- 49 files changed, 835 insertions(+), 770 deletions(-) diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Nl/DutchAnalyzer.cs b/src/Lucene.Net.Analysis.Common/Analysis/Nl/DutchAnalyzer.cs index 07ce34a..7352d2c 100644 --- a/src/Lucene.Net.Analysis.Common/Analysis/Nl/DutchAnalyzer.cs +++ b/src/Lucene.Net.Analysis.Common/Analysis/Nl/DutchAnalyzer.cs @@ -168,13 +168,15 @@ namespace Lucene.Net.Analysis.Nl this.origStemdict = null; // we don't need to ignore case here since we lowercase in this analyzer anyway StemmerOverrideFilter.Builder builder = new StemmerOverrideFilter.Builder(false); - CharArrayMap<string>.EntryIterator iter = (CharArrayMap<string>.EntryIterator)stemOverrideDict.EntrySet().GetEnumerator(); - CharsRef spare = new CharsRef(); - while (iter.HasNext) + using (CharArrayMap<string>.EntryIterator iter = (CharArrayMap<string>.EntryIterator)stemOverrideDict.EntrySet().GetEnumerator()) { - char[] nextKey = iter.NextKey(); - spare.CopyChars(nextKey, 0, nextKey.Length); - builder.Add(new string(spare.Chars), iter.CurrentValue); + CharsRef spare = new CharsRef(); + while (iter.HasNext) + { + char[] nextKey = iter.NextKey(); + spare.CopyChars(nextKey, 0, nextKey.Length); + builder.Add(new string(spare.Chars), iter.CurrentValue); + } } try { diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Shingle/ShingleFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Shingle/ShingleFilter.cs index 609a50b..709474e 100644 --- a/src/Lucene.Net.Analysis.Common/Analysis/Shingle/ShingleFilter.cs +++ b/src/Lucene.Net.Analysis.Common/Analysis/Shingle/ShingleFilter.cs @@ -326,29 +326,31 @@ namespace Lucene.Net.Analysis.Shingle { bool isAllFiller = true; InputWindowToken nextToken = null; - IEnumerator<InputWindowToken> iter = inputWindow.GetEnumerator(); - for (int gramNum = 1; iter.MoveNext() && builtGramSize < gramSize.Value; ++gramNum) + using (IEnumerator<InputWindowToken> iter = inputWindow.GetEnumerator()) { - nextToken = iter.Current; - if (builtGramSize < gramNum) + for (int gramNum = 1; iter.MoveNext() && builtGramSize < gramSize.Value; ++gramNum) { - if (builtGramSize > 0) + nextToken = iter.Current; + if (builtGramSize < gramNum) { - gramBuilder.Append(tokenSeparator); + if (builtGramSize > 0) + { + gramBuilder.Append(tokenSeparator); + } + gramBuilder.Append(nextToken.termAtt.Buffer, 0, nextToken.termAtt.Length); + ++builtGramSize; } - gramBuilder.Append(nextToken.termAtt.Buffer, 0, nextToken.termAtt.Length); - ++builtGramSize; - } - if (isAllFiller && nextToken.isFiller) - { - if (gramNum == gramSize.Value) + if (isAllFiller && nextToken.isFiller) { - gramSize.Advance(); + if (gramNum == gramSize.Value) + { + gramSize.Advance(); + } + } + else + { + isAllFiller = false; } - } - else - { - isAllFiller = false; } } if (!isAllFiller && builtGramSize == gramSize.Value) diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SlowSynonymMap.cs b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SlowSynonymMap.cs index 7a6f259..20a8169 100644 --- a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SlowSynonymMap.cs +++ b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SlowSynonymMap.cs @@ -189,36 +189,38 @@ namespace Lucene.Net.Analysis.Synonym } int pos = 0; - var iter1 = lst1.GetEnumerator(); - var iter2 = lst2.GetEnumerator(); - var tok1 = iter1.MoveNext() ? iter1.Current : null; - var tok2 = iter2.MoveNext() ? iter2.Current : null; - int pos1 = tok1 != null ? tok1.PositionIncrement : 0; - int pos2 = tok2 != null ? tok2.PositionIncrement : 0; - while (tok1 != null || tok2 != null) + using (var iter1 = lst1.GetEnumerator()) + using (var iter2 = lst2.GetEnumerator()) { - while (tok1 != null && (pos1 <= pos2 || tok2 == null)) + var tok1 = iter1.MoveNext() ? iter1.Current : null; + var tok2 = iter2.MoveNext() ? iter2.Current : null; + int pos1 = tok1 != null ? tok1.PositionIncrement : 0; + int pos2 = tok2 != null ? tok2.PositionIncrement : 0; + while (tok1 != null || tok2 != null) { - var tok = new Token(tok1.StartOffset, tok1.EndOffset, tok1.Type); - tok.CopyBuffer(tok1.Buffer, 0, tok1.Length); - tok.PositionIncrement = pos1 - pos; - result.Add(tok); - pos = pos1; - tok1 = iter1.MoveNext() ? iter1.Current : null; - pos1 += tok1 != null ? tok1.PositionIncrement : 0; - } - while (tok2 != null && (pos2 <= pos1 || tok1 == null)) - { - var tok = new Token(tok2.StartOffset, tok2.EndOffset, tok2.Type); - tok.CopyBuffer(tok2.Buffer, 0, tok2.Length); - tok.PositionIncrement = pos2 - pos; - result.Add(tok); - pos = pos2; - tok2 = iter2.MoveNext() ? iter2.Current : null; - pos2 += tok2 != null ? tok2.PositionIncrement : 0; + while (tok1 != null && (pos1 <= pos2 || tok2 == null)) + { + var tok = new Token(tok1.StartOffset, tok1.EndOffset, tok1.Type); + tok.CopyBuffer(tok1.Buffer, 0, tok1.Length); + tok.PositionIncrement = pos1 - pos; + result.Add(tok); + pos = pos1; + tok1 = iter1.MoveNext() ? iter1.Current : null; + pos1 += tok1 != null ? tok1.PositionIncrement : 0; + } + while (tok2 != null && (pos2 <= pos1 || tok1 == null)) + { + var tok = new Token(tok2.StartOffset, tok2.EndOffset, tok2.Type); + tok.CopyBuffer(tok2.Buffer, 0, tok2.Length); + tok.PositionIncrement = pos2 - pos; + result.Add(tok); + pos = pos2; + tok2 = iter2.MoveNext() ? iter2.Current : null; + pos2 += tok2 != null ? tok2.PositionIncrement : 0; + } } + return result; } - return result; } } } \ No newline at end of file diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs index cfe5625..480c4d6 100644 --- a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs +++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs @@ -214,10 +214,12 @@ namespace Lucene.Net.Analysis.Util /// <param name="arrayIndex">A 32-bit integer that represents the index in <paramref name="array"/> at which copying begins.</param> public virtual void CopyTo(KeyValuePair<string, TValue>[] array, int arrayIndex) { - var iter = (EntryIterator)EntrySet().GetEnumerator(); - for (int i = arrayIndex; iter.MoveNext(); i++) + using (var iter = (EntryIterator)EntrySet().GetEnumerator()) { - array[i] = new KeyValuePair<string, TValue>(iter.Current.Key, iter.CurrentValue); + for (int i = arrayIndex; iter.MoveNext(); i++) + { + array[i] = new KeyValuePair<string, TValue>(iter.Current.Key, iter.CurrentValue); + } } } @@ -228,10 +230,12 @@ namespace Lucene.Net.Analysis.Util /// <param name="map"></param> public virtual void CopyTo(CharArrayMap<TValue> map) { - var iter = (EntryIterator)EntrySet().GetEnumerator(); - while(iter.MoveNext()) + using (var iter = (EntryIterator)EntrySet().GetEnumerator()) { - map.Put(iter.Current.Key, iter.CurrentValue); + while (iter.MoveNext()) + { + map.Put(iter.Current.Key, iter.CurrentValue); + } } } @@ -758,14 +762,16 @@ namespace Lucene.Net.Analysis.Util if (this.Count != other.Count) return false; - var iter = other.GetEnumerator(); - while (iter.MoveNext()) + using (var iter = other.GetEnumerator()) { - if (!this.ContainsKey(iter.Current.Key)) - return false; + while (iter.MoveNext()) + { + if (!this.ContainsKey(iter.Current.Key)) + return false; - if (!EqualityComparer<TValue>.Default.Equals(this[iter.Current.Key], iter.Current.Value)) - return false; + if (!EqualityComparer<TValue>.Default.Equals(this[iter.Current.Key], iter.Current.Value)) + return false; + } } return true; @@ -1155,10 +1161,12 @@ namespace Lucene.Net.Analysis.Util public void CopyTo(string[] array, int arrayIndex) { - var iter = GetEnumerator(); - for (int i = arrayIndex; iter.MoveNext(); i++) + using (var iter = GetEnumerator()) { - array[i] = iter.Current; + for (int i = arrayIndex; iter.MoveNext(); i++) + { + array[i] = iter.Current; + } } } @@ -1289,23 +1297,25 @@ namespace Lucene.Net.Analysis.Util public override string ToString() { - var i = (ValueEnumerator)GetEnumerator(); - if (!i.HasNext) - return "[]"; - - StringBuilder sb = new StringBuilder(); - sb.Append('['); - while(i.MoveNext()) + using (var i = (ValueEnumerator)GetEnumerator()) { - TValue value = i.Current; - if (sb.Length > 1) + if (!i.HasNext) + return "[]"; + + StringBuilder sb = new StringBuilder(); + sb.Append('['); + while (i.MoveNext()) { - sb.Append(',').Append(' '); + TValue value = i.Current; + if (sb.Length > 1) + { + sb.Append(',').Append(' '); + } + sb.Append(value.ToString()); } - sb.Append(value.ToString()); - } - return sb.Append(']').ToString(); + return sb.Append(']').ToString(); + } } /// <summary> @@ -1340,7 +1350,7 @@ namespace Lucene.Net.Analysis.Util public void Dispose() { - // nothing to do + entryIterator.Dispose(); } public bool MoveNext() @@ -1414,17 +1424,19 @@ namespace Lucene.Net.Analysis.Util { var sb = new StringBuilder("{"); - IEnumerator<KeyValuePair<string, TValue>> iter1 = DictionaryExtensions.EntrySet(this).GetEnumerator(); - while (iter1.MoveNext()) + using (IEnumerator<KeyValuePair<string, TValue>> iter1 = DictionaryExtensions.EntrySet(this).GetEnumerator()) { - KeyValuePair<string, TValue> entry = iter1.Current; - if (sb.Length > 1) + while (iter1.MoveNext()) { - sb.Append(", "); + KeyValuePair<string, TValue> entry = iter1.Current; + if (sb.Length > 1) + { + sb.Append(", "); + } + sb.Append(entry.Key); + sb.Append("="); + sb.Append(entry.Value); } - sb.Append(entry.Key); - sb.Append("="); - sb.Append(entry.Value); } return sb.Append('}').ToString(); diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArraySet.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArraySet.cs index 3b39cee..445ef59 100644 --- a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArraySet.cs +++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArraySet.cs @@ -366,10 +366,12 @@ namespace Lucene.Net.Analysis.Util /// <param name="arrayIndex">The zero-based index in array at which copying begins.</param> public void CopyTo(string[] array, int arrayIndex) { - var iter = map.OriginalKeySet.GetEnumerator(); - for (int i = arrayIndex; iter.MoveNext(); i++) + using (var iter = map.OriginalKeySet.GetEnumerator()) { - array[i] = iter.Current; + for (int i = arrayIndex; iter.MoveNext(); i++) + { + array[i] = iter.Current; + } } } diff --git a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Gener.cs b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Gener.cs index bacfc68..b8defb9 100644 --- a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Gener.cs +++ b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Gener.cs @@ -106,9 +106,8 @@ namespace Egothor.Stemmer public bool Eat(Row @in, int[] remap) { int sum = 0; - for (IEnumerator<Cell> i = @in.cells.Values.GetEnumerator(); i.MoveNext();) + foreach (Cell c in @in.cells.Values) { - Cell c = i.Current; sum += c.cnt; if (c.@ref >= 0) { @@ -120,9 +119,8 @@ namespace Egothor.Stemmer } int frame = sum / 10; bool live = false; - for (IEnumerator<Cell> i = @in.cells.Values.GetEnumerator(); i.MoveNext();) + foreach (Cell c in @in.cells.Values) { - Cell c = i.Current; if (c.cnt < frame && c.cmd >= 0) { c.cnt = 0; diff --git a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Lift.cs b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Lift.cs index 43a4602..d14a45c 100644 --- a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Lift.cs +++ b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Lift.cs @@ -116,10 +116,8 @@ namespace Egothor.Stemmer /// <param name="nodes">contains the patch commands</param> public void LiftUp(Row @in, IList<Row> nodes) { - IEnumerator<Cell> i = @in.cells.Values.GetEnumerator(); - for (; i.MoveNext();) + foreach (Cell c in @in.cells.Values) { - Cell c = i.Current; if (c.@ref >= 0) { Row to = nodes[c.@ref]; diff --git a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Optimizer.cs b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Optimizer.cs index e299452..ed97f98 100644 --- a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Optimizer.cs +++ b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Optimizer.cs @@ -124,11 +124,9 @@ namespace Egothor.Stemmer /// <returns>the resulting <see cref="Row"/>, or <c>null</c> if the operation cannot be realized</returns> public Row Merge(Row master, Row existing) { - var i = master.cells.Keys.GetEnumerator(); Row n = new Row(); - for (; i.MoveNext();) + foreach (char ch in master.cells.Keys) { - char ch = i.Current; // XXX also must handle Cnt and Skip !! Cell a = master.cells.ContainsKey(ch) ? master.cells[ch] : null; Cell b = existing.cells.ContainsKey(ch) ? existing.cells[ch] : null; @@ -140,10 +138,8 @@ namespace Egothor.Stemmer } n.cells[ch] = s; } - i = existing.cells.Keys.GetEnumerator(); - for (; i.MoveNext();) + foreach (char ch in existing.cells.Keys) { - char ch = i.Current; if (master.At(ch) != null) { continue; diff --git a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Reduce.cs b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Reduce.cs index 61a1c3f..3b95735 100644 --- a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Reduce.cs +++ b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Reduce.cs @@ -93,10 +93,8 @@ namespace Egothor.Stemmer Row now = old[ind]; to.Add(now); - IEnumerator<Cell> i = now.cells.Values.GetEnumerator(); - for (; i.MoveNext();) + foreach (Cell c in now.cells.Values) { - Cell c = i.Current; if (c.@ref >= 0 && remap[c.@ref] < 0) { RemoveGaps(c.@ref, old, to, remap); @@ -111,19 +109,16 @@ namespace Egothor.Stemmer /// </summary> internal class Remap : Row { - /** - * Constructor for the <see cref="Remap"/> object - * - * @param old Description of the Parameter - * @param remap Description of the Parameter - */ + /// <summary> + /// Constructor for the <see cref="Remap"/> object + /// </summary> + /// <param name="old">Description of the Parameter</param> + /// <param name="remap">Description of the Parameter</param> public Remap(Row old, int[] remap) - : base() + : base() { - var i = old.cells.Keys.GetEnumerator(); - for (; i.MoveNext();) + foreach (char ch in old.cells.Keys) { - char ch = i.Current; Cell c = old.At(ch); Cell nc; if (c.@ref >= 0) diff --git a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Row.cs b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Row.cs index 149b8e2..250972b 100644 --- a/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Row.cs +++ b/src/Lucene.Net.Analysis.Stempel/Egothor.Stemmer/Row.cs @@ -151,11 +151,9 @@ namespace Egothor.Stemmer /// <returns>the number of cells in use</returns> public int GetCells() { - IEnumerator<char> i = cells.Keys.GetEnumerator(); int size = 0; - for (; i.MoveNext();) + foreach (char c in cells.Keys) { - char c = i.Current; Cell e = At(c); if (e.cmd >= 0 || e.@ref >= 0) { @@ -171,11 +169,9 @@ namespace Egothor.Stemmer /// <returns>the number of references</returns> public int GetCellsPnt() { - IEnumerator<char> i = cells.Keys.GetEnumerator(); int size = 0; - for (; i.MoveNext();) + foreach (char c in cells.Keys) { - char c = i.Current; Cell e = At(c); if (e.@ref >= 0) { @@ -191,11 +187,9 @@ namespace Egothor.Stemmer /// <returns>the number of patch commands</returns> public int GetCellsVal() { - IEnumerator<char> i = cells.Keys.GetEnumerator(); int size = 0; - for (; i.MoveNext();) + foreach (char c in cells.Keys) { - char c = i.Current; Cell e = At(c); if (e.cmd >= 0) { @@ -248,10 +242,8 @@ namespace Egothor.Stemmer public virtual void Store(IDataOutput os) { os.WriteInt32(cells.Count); - IEnumerator<char> i = cells.Keys.GetEnumerator(); - for (; i.MoveNext();) + foreach (char c in cells.Keys) { - char c = i.Current; Cell e = At(c); if (e.cmd < 0 && e.@ref < 0) { @@ -274,13 +266,11 @@ namespace Egothor.Stemmer /// <returns>the number of identical <see cref="Cell"/>s, or -1 if there are (at least) two different <see cref="Cell"/>s</returns> public int UniformCmd(bool eqSkip) { - IEnumerator<Cell> i = cells.Values.GetEnumerator(); int ret = -1; uniformCnt = 1; uniformSkip = 0; - for (; i.MoveNext();) + foreach (Cell c in cells.Values) { - Cell c = i.Current; if (c.@ref >= 0) { return -1; @@ -325,9 +315,8 @@ namespace Egothor.Stemmer /// <param name="out"></param> public virtual void Print(TextWriter @out) { - for (IEnumerator<char> i = cells.Keys.GetEnumerator(); i.MoveNext();) + foreach (char ch in cells.Keys) { - char ch = i.Current; Cell c = At(ch); @out.Write("[" + ch + ":" + c + "]"); } diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs index c4014a0..ac79d0a 100644 --- a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs +++ b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs @@ -424,6 +424,7 @@ namespace Sax.Helpers public IEnumerable GetPrefixes(string uri) { var prefixes = new ArrayList(); + // LUCENENET NOTE: IEnumerator is not disposable IEnumerator allPrefixes = GetPrefixes().GetEnumerator(); while (allPrefixes.MoveNext()) { diff --git a/src/Lucene.Net.Codecs/Memory/MemoryDocValuesConsumer.cs b/src/Lucene.Net.Codecs/Memory/MemoryDocValuesConsumer.cs index 8bbb765..447d7f3 100644 --- a/src/Lucene.Net.Codecs/Memory/MemoryDocValuesConsumer.cs +++ b/src/Lucene.Net.Codecs/Memory/MemoryDocValuesConsumer.cs @@ -506,7 +506,8 @@ namespace Lucene.Net.Codecs.Memory public void Dispose() { - // nothing to do + this.counts.Dispose(); + this.ords.Dispose(); } public void Reset() diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextDocValuesWriter.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextDocValuesWriter.cs index 3598d6a..fdb30ea 100644 --- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextDocValuesWriter.cs +++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextDocValuesWriter.cs @@ -323,23 +323,25 @@ namespace Lucene.Net.Codecs.SimpleText // compute ord pattern: this is funny, we encode all values for all docs to find the maximum length var maxOrdListLength = 0; var sb2 = new StringBuilder(); - var ordStream = ords.GetEnumerator(); - foreach (var n in docToOrdCount) + using (var ordStream = ords.GetEnumerator()) { - sb2.Length = 0; - var count = (int) n; - for (int i = 0; i < count; i++) + foreach (var n in docToOrdCount) { - ordStream.MoveNext(); - - var ord = ordStream.Current; - if (sb2.Length > 0) + sb2.Length = 0; + var count = (int)n; + for (int i = 0; i < count; i++) { - sb2.Append(","); + ordStream.MoveNext(); + + var ord = ordStream.Current; + if (sb2.Length > 0) + { + sb2.Append(","); + } + sb2.Append(ord.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); } - sb2.Append(ord.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); + maxOrdListLength = Math.Max(maxOrdListLength, sb2.Length); } - maxOrdListLength = Math.Max(maxOrdListLength, sb2.Length); } sb2.Length = 0; @@ -379,30 +381,31 @@ namespace Lucene.Net.Codecs.SimpleText Debug.Assert(valuesSeen == valueCount); - ordStream = ords.GetEnumerator(); - - // write the ords for each doc comma-separated - foreach (var n in docToOrdCount) + using (var ordStream = ords.GetEnumerator()) { - sb2.Length = 0; - var count = (int) n; - for (var i = 0; i < count; i++) + // write the ords for each doc comma-separated + foreach (var n in docToOrdCount) { - ordStream.MoveNext(); - var ord = ordStream.Current; - if (sb2.Length > 0) - sb2.Append(","); - - sb2.Append(ord); - } - // now pad to fit: these are numbers so spaces work well. reader calls trim() - var numPadding = maxOrdListLength - sb2.Length; - for (var i = 0; i < numPadding; i++) - { - sb2.Append(' '); + sb2.Length = 0; + var count = (int)n; + for (var i = 0; i < count; i++) + { + ordStream.MoveNext(); + var ord = ordStream.Current; + if (sb2.Length > 0) + sb2.Append(","); + + sb2.Append(ord); + } + // now pad to fit: these are numbers so spaces work well. reader calls trim() + var numPadding = maxOrdListLength - sb2.Length; + for (var i = 0; i < numPadding; i++) + { + sb2.Append(' '); + } + SimpleTextUtil.Write(data, sb2.ToString(), scratch); + SimpleTextUtil.WriteNewline(data); } - SimpleTextUtil.Write(data, sb2.ToString(), scratch); - SimpleTextUtil.WriteNewline(data); } } diff --git a/src/Lucene.Net.Facet/Taxonomy/WriterCache/CompactLabelToOrdinal.cs b/src/Lucene.Net.Facet/Taxonomy/WriterCache/CompactLabelToOrdinal.cs index dd68485..b71f3aa 100644 --- a/src/Lucene.Net.Facet/Taxonomy/WriterCache/CompactLabelToOrdinal.cs +++ b/src/Lucene.Net.Facet/Taxonomy/WriterCache/CompactLabelToOrdinal.cs @@ -212,12 +212,13 @@ namespace Lucene.Net.Facet.Taxonomy.WriterCache this.collisionMap = new CollisionMap(oldCollisionMap.Capacity, this.labelRepository); this.threshold = (int)(this.capacity * this.loadFactor); - var it = oldCollisionMap.GetEnumerator(); - - while (it.MoveNext()) + using (var it = oldCollisionMap.GetEnumerator()) { - var e = it.Current; - AddLabelOffset(StringHashCode(this.labelRepository, e.offset), e.cid, e.offset); + while (it.MoveNext()) + { + var e = it.Current; + AddLabelOffset(StringHashCode(this.labelRepository, e.offset), e.cid, e.offset); + } } } diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragListBuilder.cs b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragListBuilder.cs index 96f1900..842956e 100644 --- a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragListBuilder.cs +++ b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragListBuilder.cs @@ -58,59 +58,61 @@ namespace Lucene.Net.Search.VectorHighlight throw new ArgumentException("fragCharSize(" + fragCharSize + ") is too small. It must be " + minFragCharSize + " or higher."); List<WeightedPhraseInfo> wpil = new List<WeightedPhraseInfo>(); - IteratorQueue<WeightedPhraseInfo> queue = new IteratorQueue<WeightedPhraseInfo>(fieldPhraseList.PhraseList.GetEnumerator()); - WeightedPhraseInfo phraseInfo = null; - int startOffset = 0; - while ((phraseInfo = queue.Top()) != null) + using (IteratorQueue<WeightedPhraseInfo> queue = new IteratorQueue<WeightedPhraseInfo>(fieldPhraseList.PhraseList.GetEnumerator())) { - // if the phrase violates the border of previous fragment, discard it and try next phrase - if (phraseInfo.StartOffset < startOffset) + WeightedPhraseInfo phraseInfo = null; + int startOffset = 0; + while ((phraseInfo = queue.Top()) != null) { - queue.RemoveTop(); - continue; - } + // if the phrase violates the border of previous fragment, discard it and try next phrase + if (phraseInfo.StartOffset < startOffset) + { + queue.RemoveTop(); + continue; + } - wpil.Clear(); - int currentPhraseStartOffset = phraseInfo.StartOffset; - int currentPhraseEndOffset = phraseInfo.EndOffset; - int spanStart = Math.Max(currentPhraseStartOffset - margin, startOffset); - int spanEnd = Math.Max(currentPhraseEndOffset, spanStart + fragCharSize); - if (AcceptPhrase(queue.RemoveTop(), currentPhraseEndOffset - currentPhraseStartOffset, fragCharSize)) - { - wpil.Add(phraseInfo); - } - while ((phraseInfo = queue.Top()) != null) - { // pull until we crossed the current spanEnd - if (phraseInfo.EndOffset <= spanEnd) + wpil.Clear(); + int currentPhraseStartOffset = phraseInfo.StartOffset; + int currentPhraseEndOffset = phraseInfo.EndOffset; + int spanStart = Math.Max(currentPhraseStartOffset - margin, startOffset); + int spanEnd = Math.Max(currentPhraseEndOffset, spanStart + fragCharSize); + if (AcceptPhrase(queue.RemoveTop(), currentPhraseEndOffset - currentPhraseStartOffset, fragCharSize)) { - currentPhraseEndOffset = phraseInfo.EndOffset; - if (AcceptPhrase(queue.RemoveTop(), currentPhraseEndOffset - currentPhraseStartOffset, fragCharSize)) + wpil.Add(phraseInfo); + } + while ((phraseInfo = queue.Top()) != null) + { // pull until we crossed the current spanEnd + if (phraseInfo.EndOffset <= spanEnd) + { + currentPhraseEndOffset = phraseInfo.EndOffset; + if (AcceptPhrase(queue.RemoveTop(), currentPhraseEndOffset - currentPhraseStartOffset, fragCharSize)) + { + wpil.Add(phraseInfo); + } + } + else { - wpil.Add(phraseInfo); + break; } } - else + if (!wpil.Any()) { - break; + continue; } - } - if (!wpil.Any()) - { - continue; - } - int matchLen = currentPhraseEndOffset - currentPhraseStartOffset; - // now recalculate the start and end position to "center" the result - int newMargin = Math.Max(0, (fragCharSize - matchLen) / 2); // matchLen can be > fragCharSize prevent IAOOB here - spanStart = currentPhraseStartOffset - newMargin; - if (spanStart < startOffset) - { - spanStart = startOffset; + int matchLen = currentPhraseEndOffset - currentPhraseStartOffset; + // now recalculate the start and end position to "center" the result + int newMargin = Math.Max(0, (fragCharSize - matchLen) / 2); // matchLen can be > fragCharSize prevent IAOOB here + spanStart = currentPhraseStartOffset - newMargin; + if (spanStart < startOffset) + { + spanStart = startOffset; + } + // whatever is bigger here we grow this out + spanEnd = spanStart + Math.Max(matchLen, fragCharSize); + startOffset = spanEnd; + fieldFragList.Add(spanStart, spanEnd, wpil); } - // whatever is bigger here we grow this out - spanEnd = spanStart + Math.Max(matchLen, fragCharSize); - startOffset = spanEnd; - fieldFragList.Add(spanStart, spanEnd, wpil); } return fieldFragList; } @@ -131,7 +133,7 @@ namespace Lucene.Net.Search.VectorHighlight return info.TermsOffsets.Count <= 1 || matchLength <= fragCharSize; } - private sealed class IteratorQueue<T> + private sealed class IteratorQueue<T> : IDisposable // LUCENENET specific - implemented IDisposable to dispose the IEnumerator<T> { private readonly IEnumerator<T> iter; private T top; @@ -161,6 +163,11 @@ namespace Lucene.Net.Search.VectorHighlight } return currentTop; } + + public void Dispose() + { + iter.Dispose(); + } } } } diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs index 6f77027..29adb50 100644 --- a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs +++ b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs @@ -293,39 +293,43 @@ namespace Lucene.Net.Search.VectorHighlight List<SubInfo> fragInfo_SubInfos_ToDelete = new List<SubInfo>(); List<SubInfo> subInfos = new List<SubInfo>(); - IEnumerator<SubInfo> subInfoIterator = fragInfo.SubInfos.GetEnumerator(); float boost = 0.0f; // The boost of the new info will be the sum of the boosts of its SubInfos - while (subInfoIterator.MoveNext()) + using (IEnumerator<SubInfo> subInfoIterator = fragInfo.SubInfos.GetEnumerator()) { - SubInfo subInfo = subInfoIterator.Current; - List<Toffs> toffsList = new List<Toffs>(); + while (subInfoIterator.MoveNext()) + { + SubInfo subInfo = subInfoIterator.Current; + List<Toffs> toffsList = new List<Toffs>(); - IEnumerator<Toffs> toffsIterator = subInfo.TermsOffsets.GetEnumerator(); - while (toffsIterator.MoveNext()) - { - Toffs toffs = toffsIterator.Current; - if (toffs.StartOffset >= fieldStart && toffs.EndOffset <= fieldEnd) + using (IEnumerator<Toffs> toffsIterator = subInfo.TermsOffsets.GetEnumerator()) { - - toffsList.Add(toffs); - //toffsIterator.Remove(); + while (toffsIterator.MoveNext()) + { + Toffs toffs = toffsIterator.Current; + if (toffs.StartOffset >= fieldStart && toffs.EndOffset <= fieldEnd) + { + + toffsList.Add(toffs); + //toffsIterator.Remove(); + } + } } - } - if (toffsList.Any()) - { - // LUCENENET NOTE: Instead of removing during iteration (which isn't allowed in .NET when using an IEnumerator), - // we just remove the items at this point. We only get here if there are items to remove. - subInfo.TermsOffsets.RemoveAll(toffsList); + if (toffsList.Any()) + { + // LUCENENET NOTE: Instead of removing during iteration (which isn't allowed in .NET when using an IEnumerator), + // we just remove the items at this point. We only get here if there are items to remove. + subInfo.TermsOffsets.RemoveAll(toffsList); - subInfos.Add(new SubInfo(subInfo.Text, toffsList, subInfo.Seqnum, subInfo.Boost)); - boost += subInfo.Boost; - } + subInfos.Add(new SubInfo(subInfo.Text, toffsList, subInfo.Seqnum, subInfo.Boost)); + boost += subInfo.Boost; + } - if (!subInfo.TermsOffsets.Any()) - { - //subInfoIterator.Remove(); - fragInfo_SubInfos_ToDelete.Add(subInfo); + if (!subInfo.TermsOffsets.Any()) + { + //subInfoIterator.Remove(); + fragInfo_SubInfos_ToDelete.Add(subInfo); + } } } diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FastVectorHighlighter.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FastVectorHighlighter.cs index 4a37bd8..a78b3ac 100644 --- a/src/Lucene.Net.Highlighter/VectorHighlight/FastVectorHighlighter.cs +++ b/src/Lucene.Net.Highlighter/VectorHighlight/FastVectorHighlighter.cs @@ -250,7 +250,6 @@ namespace Lucene.Net.Search.VectorHighlight FieldQuery fieldQuery, IndexReader reader, int docId, ISet<string> matchedFields, int fragCharSize) { - IEnumerator<string> matchedFieldsItr = matchedFields.GetEnumerator(); if (!matchedFields.Any()) { throw new ArgumentException("matchedFields must contain at least on field name."); @@ -258,9 +257,9 @@ namespace Lucene.Net.Search.VectorHighlight FieldPhraseList[] toMerge = new FieldPhraseList[matchedFields.Count]; int i = 0; - while (matchedFieldsItr.MoveNext()) + foreach (var matchedField in matchedFields) { - FieldTermStack stack = new FieldTermStack(reader, docId, matchedFieldsItr.Current, fieldQuery); + FieldTermStack stack = new FieldTermStack(reader, docId, matchedField, fieldQuery); toMerge[i++] = new FieldPhraseList(stack, fieldQuery, phraseLimit); } return fragListBuilder.CreateFieldFragList(new FieldPhraseList(toMerge), fragCharSize); diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs index 136cb82..93a2e3a 100644 --- a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs +++ b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs @@ -149,54 +149,66 @@ namespace Lucene.Net.Search.VectorHighlight // Step 1. Sort by startOffset, endOffset, and boost, in that order. IEnumerator<WeightedPhraseInfo>[] allInfos = new IEnumerator<WeightedPhraseInfo>[toMerge.Length]; - int index = 0; - foreach (FieldPhraseList fplToMerge in toMerge) + try { - allInfos[index++] = fplToMerge.phraseList.GetEnumerator(); - } - MergedIterator<WeightedPhraseInfo> itr = new MergedIterator<WeightedPhraseInfo>(false, allInfos); - // Step 2. Walk the sorted list merging infos that overlap - phraseList = new List<WeightedPhraseInfo>(); - if (!itr.MoveNext()) - { - return; - } - List<WeightedPhraseInfo> work = new List<WeightedPhraseInfo>(); - WeightedPhraseInfo first = itr.Current; - work.Add(first); - int workEndOffset = first.EndOffset; - while (itr.MoveNext()) - { - WeightedPhraseInfo current = itr.Current; - if (current.StartOffset <= workEndOffset) + int index = 0; + foreach (FieldPhraseList fplToMerge in toMerge) { - workEndOffset = Math.Max(workEndOffset, current.EndOffset); - work.Add(current); + allInfos[index++] = fplToMerge.phraseList.GetEnumerator(); } - else + using (MergedIterator<WeightedPhraseInfo> itr = new MergedIterator<WeightedPhraseInfo>(false, allInfos)) { + // Step 2. Walk the sorted list merging infos that overlap + phraseList = new List<WeightedPhraseInfo>(); + if (!itr.MoveNext()) + { + return; + } + List<WeightedPhraseInfo> work = new List<WeightedPhraseInfo>(); + WeightedPhraseInfo first = itr.Current; + work.Add(first); + int workEndOffset = first.EndOffset; + while (itr.MoveNext()) + { + WeightedPhraseInfo current = itr.Current; + if (current.StartOffset <= workEndOffset) + { + workEndOffset = Math.Max(workEndOffset, current.EndOffset); + work.Add(current); + } + else + { + if (work.Count == 1) + { + phraseList.Add(work[0]); + work[0] = current; + } + else + { + phraseList.Add(new WeightedPhraseInfo(work)); + work.Clear(); + work.Add(current); + } + workEndOffset = current.EndOffset; + } + } if (work.Count == 1) { phraseList.Add(work[0]); - work[0] = current; } else { phraseList.Add(new WeightedPhraseInfo(work)); work.Clear(); - work.Add(current); } - workEndOffset = current.EndOffset; } } - if (work.Count == 1) - { - phraseList.Add(work[0]); - } - else + finally { - phraseList.Add(new WeightedPhraseInfo(work)); - work.Clear(); + foreach (var allInfo in allInfos) + { + allInfo.Dispose(); + } } } @@ -307,50 +319,67 @@ namespace Lucene.Net.Search.VectorHighlight /// </summary> public WeightedPhraseInfo(ICollection<WeightedPhraseInfo> toMerge) { - // Pretty much the same idea as merging FieldPhraseLists: - // Step 1. Sort by startOffset, endOffset - // While we are here merge the boosts and termInfos - IEnumerator<WeightedPhraseInfo> toMergeItr = toMerge.GetEnumerator(); - if (!toMergeItr.MoveNext()) - { - throw new ArgumentException("toMerge must contain at least one WeightedPhraseInfo."); - } - WeightedPhraseInfo first = toMergeItr.Current; IEnumerator<Toffs>[] allToffs = new IEnumerator<Toffs>[toMerge.Count]; - termsInfos = new List<TermInfo>(); - seqnum = first.seqnum; - boost = first.boost; - allToffs[0] = first.termsOffsets.GetEnumerator(); - int index = 1; - while (toMergeItr.MoveNext()) + try { - WeightedPhraseInfo info = toMergeItr.Current; - boost += info.boost; - termsInfos.AddAll(info.termsInfos); - allToffs[index++] = info.termsOffsets.GetEnumerator(); - } - // Step 2. Walk the sorted list merging overlaps - MergedIterator<Toffs> itr = new MergedIterator<Toffs>(false, allToffs); - termsOffsets = new List<Toffs>(); - if (!itr.MoveNext()) - { - return; - } - Toffs work = itr.Current; - while (itr.MoveNext()) - { - Toffs current = itr.Current; - if (current.StartOffset <= work.EndOffset) + + // Pretty much the same idea as merging FieldPhraseLists: + // Step 1. Sort by startOffset, endOffset + // While we are here merge the boosts and termInfos + using (IEnumerator<WeightedPhraseInfo> toMergeItr = toMerge.GetEnumerator()) { - work.EndOffset = Math.Max(work.EndOffset, current.EndOffset); + if (!toMergeItr.MoveNext()) + { + throw new ArgumentException("toMerge must contain at least one WeightedPhraseInfo."); + } + WeightedPhraseInfo first = toMergeItr.Current; + + termsInfos = new List<TermInfo>(); + seqnum = first.seqnum; + boost = first.boost; + allToffs[0] = first.termsOffsets.GetEnumerator(); + int index = 1; + while (toMergeItr.MoveNext()) + { + WeightedPhraseInfo info = toMergeItr.Current; + boost += info.boost; + termsInfos.AddAll(info.termsInfos); + allToffs[index++] = info.termsOffsets.GetEnumerator(); + } + + // Step 2. Walk the sorted list merging overlaps + using (MergedIterator<Toffs> itr = new MergedIterator<Toffs>(false, allToffs)) + { + termsOffsets = new List<Toffs>(); + if (!itr.MoveNext()) + { + return; + } + Toffs work = itr.Current; + while (itr.MoveNext()) + { + Toffs current = itr.Current; + if (current.StartOffset <= work.EndOffset) + { + work.EndOffset = Math.Max(work.EndOffset, current.EndOffset); + } + else + { + termsOffsets.Add(work); + work = current; + } + } + termsOffsets.Add(work); + } } - else + } + finally + { + foreach (var allToff in allToffs) { - termsOffsets.Add(work); - work = current; + allToff.Dispose(); } } - termsOffsets.Add(work); } public virtual int StartOffset diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/SingleFragListBuilder.cs b/src/Lucene.Net.Highlighter/VectorHighlight/SingleFragListBuilder.cs index 37a3947..cd843d6 100644 --- a/src/Lucene.Net.Highlighter/VectorHighlight/SingleFragListBuilder.cs +++ b/src/Lucene.Net.Highlighter/VectorHighlight/SingleFragListBuilder.cs @@ -38,19 +38,21 @@ namespace Lucene.Net.Search.VectorHighlight FieldFragList ffl = new SimpleFieldFragList(fragCharSize); List<WeightedPhraseInfo> wpil = new List<WeightedPhraseInfo>(); - IEnumerator<WeightedPhraseInfo> ite = fieldPhraseList.PhraseList.GetEnumerator(); - WeightedPhraseInfo phraseInfo = null; - while (true) + using (IEnumerator<WeightedPhraseInfo> ite = fieldPhraseList.PhraseList.GetEnumerator()) { - if (!ite.MoveNext()) break; - phraseInfo = ite.Current; - if (phraseInfo == null) break; + WeightedPhraseInfo phraseInfo = null; + while (true) + { + if (!ite.MoveNext()) break; + phraseInfo = ite.Current; + if (phraseInfo == null) break; - wpil.Add(phraseInfo); + wpil.Add(phraseInfo); + } + if (wpil.Count > 0) + ffl.Add(0, int.MaxValue, wpil); + return ffl; } - if (wpil.Count > 0) - ffl.Add(0, int.MaxValue, wpil); - return ffl; } } } diff --git a/src/Lucene.Net.Memory/MemoryIndex.cs b/src/Lucene.Net.Memory/MemoryIndex.cs index d278ab9..2b951f8 100644 --- a/src/Lucene.Net.Memory/MemoryIndex.cs +++ b/src/Lucene.Net.Memory/MemoryIndex.cs @@ -629,10 +629,12 @@ namespace Lucene.Net.Index.Memory int size = map.Count; KeyValuePair<K, V>[] entries = new KeyValuePair<K, V>[size]; - IEnumerator<KeyValuePair<K, V>> iter = map.GetEnumerator(); - for (int i = 0; i < size && iter.MoveNext(); i++) + using (IEnumerator<KeyValuePair<K, V>> iter = map.GetEnumerator()) { - entries[i] = iter.Current; + for (int i = 0; i < size && iter.MoveNext(); i++) + { + entries[i] = iter.Current; + } } if (size > 1) diff --git a/src/Lucene.Net.QueryParser/Flexible/Core/Nodes/OrQueryNode.cs b/src/Lucene.Net.QueryParser/Flexible/Core/Nodes/OrQueryNode.cs index 0a9b9e0..e310e62 100644 --- a/src/Lucene.Net.QueryParser/Flexible/Core/Nodes/OrQueryNode.cs +++ b/src/Lucene.Net.QueryParser/Flexible/Core/Nodes/OrQueryNode.cs @@ -67,9 +67,9 @@ namespace Lucene.Net.QueryParsers.Flexible.Core.Nodes StringBuilder sb = new StringBuilder(); string filler = ""; - for (IEnumerator<IQueryNode> it = children.GetEnumerator(); it.MoveNext();) + foreach (var child in children) { - sb.Append(filler).Append(it.Current.ToQueryString(escapeSyntaxParser)); + sb.Append(filler).Append(child.ToQueryString(escapeSyntaxParser)); filler = " OR "; } diff --git a/src/Lucene.Net.QueryParser/Flexible/Core/Processors/RemoveDeletedQueryNodesProcessor.cs b/src/Lucene.Net.QueryParser/Flexible/Core/Processors/RemoveDeletedQueryNodesProcessor.cs index 0a54974..87a8b19 100644 --- a/src/Lucene.Net.QueryParser/Flexible/Core/Processors/RemoveDeletedQueryNodesProcessor.cs +++ b/src/Lucene.Net.QueryParser/Flexible/Core/Processors/RemoveDeletedQueryNodesProcessor.cs @@ -60,10 +60,10 @@ namespace Lucene.Net.QueryParsers.Flexible.Core.Processors { removeBoolean = true; - for (IEnumerator<IQueryNode> it = children.GetEnumerator(); it.MoveNext();) + foreach (var child in children) { - if (!(it.Current is DeletedQueryNode)) + if (!(child is DeletedQueryNode)) { removeBoolean = false; break; diff --git a/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/StandardSyntaxParser.cs b/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/StandardSyntaxParser.cs index 0cc249d..f69e99d 100644 --- a/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/StandardSyntaxParser.cs +++ b/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/StandardSyntaxParser.cs @@ -1180,25 +1180,28 @@ namespace Lucene.Net.QueryParsers.Flexible.Standard.Parser { jj_expentry[i] = jj_lasttokens[i]; } - for (var it = jj_expentries.GetEnumerator(); it.MoveNext();) + using (var it = jj_expentries.GetEnumerator()) { - int[] oldentry = (int[])(it.Current); - if (oldentry.Length == jj_expentry.Length) + while (it.MoveNext()) { - for (int i = 0; i < jj_expentry.Length; i++) + int[] oldentry = (int[])(it.Current); + if (oldentry.Length == jj_expentry.Length) { - if (oldentry[i] != jj_expentry[i]) + for (int i = 0; i < jj_expentry.Length; i++) { - goto jj_entries_loop_continue; + if (oldentry[i] != jj_expentry[i]) + { + goto jj_entries_loop_continue; + } } + jj_expentries.Add(jj_expentry); + goto jj_entries_loop_break; } - jj_expentries.Add(jj_expentry); - goto jj_entries_loop_break; + jj_entries_loop_continue: { } } - jj_entries_loop_continue: { } + jj_entries_loop_break: + if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } - jj_entries_loop_break: - if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } } diff --git a/src/Lucene.Net.Sandbox/Queries/FuzzyLikeThisQuery.cs b/src/Lucene.Net.Sandbox/Queries/FuzzyLikeThisQuery.cs index 3cc7e2c..9ed11b4 100644 --- a/src/Lucene.Net.Sandbox/Queries/FuzzyLikeThisQuery.cs +++ b/src/Lucene.Net.Sandbox/Queries/FuzzyLikeThisQuery.cs @@ -305,9 +305,8 @@ namespace Lucene.Net.Sandbox.Queries l.Add(st); } //Step 2: Organize the sorted termqueries into zero-coord scoring boolean queries - for (var iter = variantQueries.Values.GetEnumerator(); iter.MoveNext();) + foreach (List<ScoreTerm> variants in variantQueries.Values) { - List<ScoreTerm> variants = iter.Current; if (variants.Count == 1) { //optimize where only one selected variant @@ -319,10 +318,8 @@ namespace Lucene.Net.Sandbox.Queries else { BooleanQuery termVariants = new BooleanQuery(true); //disable coord and IDF for these term variants - for (IEnumerator<ScoreTerm> iterator2 = variants.GetEnumerator(); iterator2 - .MoveNext();) + foreach (ScoreTerm st in variants) { - ScoreTerm st = iterator2.Current; // found a match Query tq = ignoreTF ? (Query)new ConstantScoreQuery(new TermQuery(st.Term)) : new TermQuery(st.Term, 1); tq.Boost = st.Score; // set the boost using the ScoreTerm's score diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs index 564efd2..37419f7 100644 --- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs +++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs @@ -159,36 +159,38 @@ namespace Lucene.Net.Codecs.Asserting int docCount = 0; long ordCount = 0; Int64BitSet seenOrds = new Int64BitSet(valueCount); - IEnumerator<long?> ordIterator = ords.GetEnumerator(); - foreach (long? v in docToOrdCount) + using (IEnumerator<long?> ordIterator = ords.GetEnumerator()) { - Debug.Assert(v != null); - int count = (int)v.Value; - Debug.Assert(count >= 0); - docCount++; - ordCount += count; - - long lastOrd = -1; - for (int i = 0; i < count; i++) + foreach (long? v in docToOrdCount) { - ordIterator.MoveNext(); - long? o = ordIterator.Current; - Debug.Assert(o != null); - long ord = o.Value; - Debug.Assert(ord >= 0 && ord < valueCount); - Debug.Assert(ord > lastOrd, "ord=" + ord + ",lastOrd=" + lastOrd); - seenOrds.Set(ord); - lastOrd = ord; + Debug.Assert(v != null); + int count = (int)v.Value; + Debug.Assert(count >= 0); + docCount++; + ordCount += count; + + long lastOrd = -1; + for (int i = 0; i < count; i++) + { + ordIterator.MoveNext(); + long? o = ordIterator.Current; + Debug.Assert(o != null); + long ord = o.Value; + Debug.Assert(ord >= 0 && ord < valueCount); + Debug.Assert(ord > lastOrd, "ord=" + ord + ",lastOrd=" + lastOrd); + seenOrds.Set(ord); + lastOrd = ord; + } } + Debug.Assert(ordIterator.MoveNext() == false); + + Debug.Assert(docCount == MaxDoc); + Debug.Assert(seenOrds.Cardinality() == valueCount); + CheckIterator(values.GetEnumerator(), valueCount, false); + CheckIterator(docToOrdCount.GetEnumerator(), MaxDoc, false); + CheckIterator(ords.GetEnumerator(), ordCount, false); + @in.AddSortedSetField(field, values, docToOrdCount, ords); } - Debug.Assert(ordIterator.MoveNext() == false); - - Debug.Assert(docCount == MaxDoc); - Debug.Assert(seenOrds.Cardinality() == valueCount); - CheckIterator(values.GetEnumerator(), valueCount, false); - CheckIterator(docToOrdCount.GetEnumerator(), MaxDoc, false); - CheckIterator(ords.GetEnumerator(), ordCount, false); - @in.AddSortedSetField(field, values, docToOrdCount, ords); } protected override void Dispose(bool disposing) @@ -246,32 +248,39 @@ namespace Lucene.Net.Codecs.Asserting private static void CheckIterator<T>(IEnumerator<T> iterator, long expectedSize, bool allowNull) { - for (long i = 0; i < expectedSize; i++) + try { - bool hasNext = iterator.MoveNext(); - Debug.Assert(hasNext); - T v = iterator.Current; - Debug.Assert(allowNull || v != null); - try + for (long i = 0; i < expectedSize; i++) { - iterator.Reset(); - throw new InvalidOperationException("broken iterator (supports remove): " + iterator); + bool hasNext = iterator.MoveNext(); + Debug.Assert(hasNext); + T v = iterator.Current; + Debug.Assert(allowNull || v != null); + try + { + iterator.Reset(); + throw new InvalidOperationException("broken iterator (supports remove): " + iterator); + } + catch (System.NotSupportedException) + { + // ok + } } - catch (System.NotSupportedException) + Debug.Assert(!iterator.MoveNext()); + /*try { - // ok + //iterator.next(); + throw new InvalidOperationException("broken iterator (allows next() when hasNext==false) " + iterator); } + catch (Exception) + { + // ok + }*/ } - Debug.Assert(!iterator.MoveNext()); - /*try + finally { - //iterator.next(); - throw new InvalidOperationException("broken iterator (allows next() when hasNext==false) " + iterator); + iterator.Dispose(); } - catch (Exception) - { - // ok - }*/ } internal class AssertingDocValuesProducer : DocValuesProducer diff --git a/src/Lucene.Net.TestFramework/Codecs/MissingOrdRemapper.cs b/src/Lucene.Net.TestFramework/Codecs/MissingOrdRemapper.cs index 87c3afe..3b0c253 100644 --- a/src/Lucene.Net.TestFramework/Codecs/MissingOrdRemapper.cs +++ b/src/Lucene.Net.TestFramework/Codecs/MissingOrdRemapper.cs @@ -56,17 +56,17 @@ namespace Lucene.Net.Codecs private class IteratorAnonymousInnerClassHelper : IEnumerator<BytesRef> { - private readonly IterableAnonymousInnerClassHelper OuterInstance; + private readonly IterableAnonymousInnerClassHelper outerInstance; public IteratorAnonymousInnerClassHelper(IterableAnonymousInnerClassHelper outerInstance) { - this.OuterInstance = outerInstance; + this.outerInstance = outerInstance; seenEmpty = false; @in = outerInstance.Iterable.GetEnumerator(); } private bool seenEmpty; - private IEnumerator<BytesRef> @in; + private readonly IEnumerator<BytesRef> @in; private BytesRef current; public bool MoveNext() @@ -104,6 +104,7 @@ namespace Lucene.Net.Codecs public void Dispose() { + @in.Dispose(); } } } @@ -136,15 +137,15 @@ namespace Lucene.Net.Codecs private class IteratorAnonymousInnerClassHelper2 : IEnumerator<long?> { - private readonly IterableAnonymousInnerClassHelper2 OuterInstance; + private readonly IterableAnonymousInnerClassHelper2 outerInstance; public IteratorAnonymousInnerClassHelper2(IterableAnonymousInnerClassHelper2 outerInstance) { - this.OuterInstance = outerInstance; + this.outerInstance = outerInstance; @in = outerInstance.Iterable.GetEnumerator(); } - private IEnumerator<long?> @in; + private readonly IEnumerator<long?> @in; private long current; public bool MoveNext() @@ -178,6 +179,7 @@ namespace Lucene.Net.Codecs public void Dispose() { + @in.Dispose(); } } } @@ -210,15 +212,15 @@ namespace Lucene.Net.Codecs private class IteratorAnonymousInnerClassHelper3 : IEnumerator<long?> { - private readonly IterableAnonymousInnerClassHelper3 OuterInstance; + private readonly IterableAnonymousInnerClassHelper3 outerInstance; public IteratorAnonymousInnerClassHelper3(IterableAnonymousInnerClassHelper3 outerInstance) { - this.OuterInstance = outerInstance; + this.outerInstance = outerInstance; @in = outerInstance.Iterable.GetEnumerator(); } - private IEnumerator<long?> @in; + private readonly IEnumerator<long?> @in; private long current; public bool MoveNext() @@ -251,6 +253,7 @@ namespace Lucene.Net.Codecs public void Dispose() { + @in.Dispose(); } } } diff --git a/src/Lucene.Net.TestFramework/Index/FieldFilterAtomicReader.cs b/src/Lucene.Net.TestFramework/Index/FieldFilterAtomicReader.cs index e3e66dc..5fa7296 100644 --- a/src/Lucene.Net.TestFramework/Index/FieldFilterAtomicReader.cs +++ b/src/Lucene.Net.TestFramework/Index/FieldFilterAtomicReader.cs @@ -74,7 +74,8 @@ namespace Lucene.Net.Index f = new FieldFilterFields(this, f); // we need to check for emptyness, so we can return // null: - return f.GetEnumerator().MoveNext() ? f : null; + using (var iter = f.GetEnumerator()) + return iter.MoveNext() ? f : null; } public override void Document(int docID, StoredFieldVisitor visitor) diff --git a/src/Lucene.Net.TestFramework/JavaCompatibility/SystemTypesHelpers.cs b/src/Lucene.Net.TestFramework/JavaCompatibility/SystemTypesHelpers.cs index 0cf1daf..af700cc 100644 --- a/src/Lucene.Net.TestFramework/JavaCompatibility/SystemTypesHelpers.cs +++ b/src/Lucene.Net.TestFramework/JavaCompatibility/SystemTypesHelpers.cs @@ -251,18 +251,18 @@ namespace Lucene.Net if (s.Count > list.Count()) { - for (var i = list.GetEnumerator(); i.MoveNext();) - modified |= s.Remove(i.Current); + foreach (var item in list) + modified |= s.Remove(item); } else { List<T> toRemove = new List<T>(); - for (var i = s.GetEnumerator(); i.MoveNext();) + foreach (var item in s) { - if (list.Contains(i.Current)) + if (list.Contains(item)) { - toRemove.Add(i.Current); + toRemove.Add(item); } } diff --git a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs index c8063a6..25af9f3 100644 --- a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs +++ b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs @@ -292,108 +292,110 @@ namespace Lucene.Net.Store OpenFiles = new Dictionary<string, int>(); OpenFilesForWrite = new HashSet<string>(); OpenFilesDeleted = new HashSet<string>(); - IEnumerator<string> it = UnSyncedFiles.GetEnumerator(); - UnSyncedFiles = new HashSet<string>(); - // first force-close all files, so we can corrupt on windows etc. - // clone the file map, as these guys want to remove themselves on close. - var m = new IdentityHashMap<IDisposable, Exception>(OpenFileHandles); - foreach (IDisposable f in m.Keys) + using (IEnumerator<string> it = UnSyncedFiles.GetEnumerator()) { - try + UnSyncedFiles = new HashSet<string>(); + // first force-close all files, so we can corrupt on windows etc. + // clone the file map, as these guys want to remove themselves on close. + var m = new IdentityHashMap<IDisposable, Exception>(OpenFileHandles); + foreach (IDisposable f in m.Keys) { - f.Dispose(); - } + try + { + f.Dispose(); + } #pragma warning disable 168 - catch (Exception ignored) + catch (Exception ignored) #pragma warning restore 168 - { - //Debug.WriteLine("Crash(): f.Dispose() FAILED for {0}:\n{1}", f.ToString(), ignored.ToString()); - } - } - - while (it.MoveNext()) - { - string name = it.Current; - int damage = RandomState.Next(5); - string action = null; - - if (damage == 0) - { - action = "deleted"; - DeleteFile(name, true); - } - else if (damage == 1) - { - action = "zeroed"; - // Zero out file entirely - long length = FileLength(name); - var zeroes = new byte[256]; - long upto = 0; - using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) { - while (upto < length) - { - var limit = (int)Math.Min(length - upto, zeroes.Length); - @out.WriteBytes(zeroes, 0, limit); - upto += limit; - } + //Debug.WriteLine("Crash(): f.Dispose() FAILED for {0}:\n{1}", f.ToString(), ignored.ToString()); } } - else if (damage == 2) + + while (it.MoveNext()) { - action = "partially truncated"; - // Partially Truncate the file: + string name = it.Current; + int damage = RandomState.Next(5); + string action = null; - // First, make temp file and copy only half this - // file over: - string tempFileName; - while (true) + if (damage == 0) + { + action = "deleted"; + DeleteFile(name, true); + } + else if (damage == 1) { - tempFileName = "" + RandomState.Next(); - if (!LuceneTestCase.SlowFileExists(m_input, tempFileName)) + action = "zeroed"; + // Zero out file entirely + long length = FileLength(name); + var zeroes = new byte[256]; + long upto = 0; + using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) { - break; + while (upto < length) + { + var limit = (int)Math.Min(length - upto, zeroes.Length); + @out.WriteBytes(zeroes, 0, limit); + upto += limit; + } } } - using (IndexOutput tempOut = m_input.CreateOutput(tempFileName, LuceneTestCase.NewIOContext(RandomState))) + else if (damage == 2) { - using (IndexInput ii = m_input.OpenInput(name, LuceneTestCase.NewIOContext(RandomState))) + action = "partially truncated"; + // Partially Truncate the file: + + // First, make temp file and copy only half this + // file over: + string tempFileName; + while (true) { - tempOut.CopyBytes(ii, ii.Length / 2); + tempFileName = "" + RandomState.Next(); + if (!LuceneTestCase.SlowFileExists(m_input, tempFileName)) + { + break; + } + } + using (IndexOutput tempOut = m_input.CreateOutput(tempFileName, LuceneTestCase.NewIOContext(RandomState))) + { + using (IndexInput ii = m_input.OpenInput(name, LuceneTestCase.NewIOContext(RandomState))) + { + tempOut.CopyBytes(ii, ii.Length / 2); + } } - } - // Delete original and copy bytes back: - DeleteFile(name, true); + // Delete original and copy bytes back: + DeleteFile(name, true); - using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) + using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) + { + using (IndexInput ii = m_input.OpenInput(tempFileName, LuceneTestCase.NewIOContext(RandomState))) + { + @out.CopyBytes(ii, ii.Length); + } + } + DeleteFile(tempFileName, true); + } + else if (damage == 3) { - using (IndexInput ii = m_input.OpenInput(tempFileName, LuceneTestCase.NewIOContext(RandomState))) + // The file survived intact: + action = "didn't change"; + } + else + { + action = "fully truncated"; + // Totally truncate the file to zero bytes + DeleteFile(name, true); + using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) { - @out.CopyBytes(ii, ii.Length); + @out.Length = 0; } } - DeleteFile(tempFileName, true); - } - else if (damage == 3) - { - // The file survived intact: - action = "didn't change"; - } - else - { - action = "fully truncated"; - // Totally truncate the file to zero bytes - DeleteFile(name, true); - using (IndexOutput @out = m_input.CreateOutput(name, LuceneTestCase.NewIOContext(RandomState))) + if (LuceneTestCase.VERBOSE) { - @out.Length = 0; + Console.WriteLine("MockDirectoryWrapper: " + action + " unsynced file: " + name); } } - if (LuceneTestCase.VERBOSE) - { - Console.WriteLine("MockDirectoryWrapper: " + action + " unsynced file: " + name); - } } } } @@ -928,12 +930,7 @@ namespace Lucene.Net.Store if (OpenFiles.Count > 0) { // print the first one as its very verbose otherwise - Exception cause = null; - IEnumerator<Exception> stacktraces = OpenFileHandles.Values.GetEnumerator(); - if (stacktraces.MoveNext()) - { - cause = stacktraces.Current; - } + Exception cause = OpenFileHandles.Values.FirstOrDefault(); // RuntimeException instead ofSystem.IO.IOException because // super() does not throwSystem.IO.IOException currently: diff --git a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs index 45eb5a4..eff930c 100644 --- a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs +++ b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs @@ -1946,17 +1946,18 @@ namespace Lucene.Net.Util } AssertFieldStatisticsEquals(info, leftFields, rightFields); - IEnumerator<string> leftEnum = leftFields.GetEnumerator(); - IEnumerator<string> rightEnum = rightFields.GetEnumerator(); - - while (leftEnum.MoveNext()) + using (IEnumerator<string> leftEnum = leftFields.GetEnumerator()) + using (IEnumerator<string> rightEnum = rightFields.GetEnumerator()) { - string field = leftEnum.Current; - rightEnum.MoveNext(); - Assert.AreEqual(field, rightEnum.Current, info); - AssertTermsEquals(info, leftReader, leftFields.GetTerms(field), rightFields.GetTerms(field), deep); + while (leftEnum.MoveNext()) + { + string field = leftEnum.Current; + rightEnum.MoveNext(); + Assert.AreEqual(field, rightEnum.Current, info); + AssertTermsEquals(info, leftReader, leftFields.GetTerms(field), rightFields.GetTerms(field), deep); + } + Assert.IsFalse(rightEnum.MoveNext()); } - Assert.IsFalse(rightEnum.MoveNext()); } /// <summary> @@ -2410,14 +2411,16 @@ namespace Lucene.Net.Util leftDoc.Fields.Sort(comp); rightDoc.Fields.Sort(comp); - var leftIterator = leftDoc.GetEnumerator(); - var rightIterator = rightDoc.GetEnumerator(); - while (leftIterator.MoveNext()) + using (var leftIterator = leftDoc.GetEnumerator()) + using (var rightIterator = rightDoc.GetEnumerator()) { - Assert.IsTrue(rightIterator.MoveNext(), info); - AssertStoredFieldEquals(info, leftIterator.Current, rightIterator.Current); + while (leftIterator.MoveNext()) + { + Assert.IsTrue(rightIterator.MoveNext(), info); + AssertStoredFieldEquals(info, leftIterator.Current, rightIterator.Current); + } + Assert.IsFalse(rightIterator.MoveNext(), info); } - Assert.IsFalse(rightIterator.MoveNext(), info); } } diff --git a/src/Lucene.Net/Index/CoalescedUpdates.cs b/src/Lucene.Net/Index/CoalescedUpdates.cs index 5ce47a9..7b0e21b 100644 --- a/src/Lucene.Net/Index/CoalescedUpdates.cs +++ b/src/Lucene.Net/Index/CoalescedUpdates.cs @@ -134,6 +134,7 @@ namespace Lucene.Net.Index public void Dispose() { + iter.Dispose(); } public bool MoveNext() diff --git a/src/Lucene.Net/Index/IndexWriter.cs b/src/Lucene.Net/Index/IndexWriter.cs index 4984d97..7009d45 100644 --- a/src/Lucene.Net/Index/IndexWriter.cs +++ b/src/Lucene.Net/Index/IndexWriter.cs @@ -558,7 +558,6 @@ namespace Lucene.Net.Index lock (this) { Exception priorE = null; - IEnumerator<KeyValuePair<SegmentCommitInfo, ReadersAndUpdates>> it = readerMap.GetEnumerator(); // LUCENENET specific - Since an enumerator doesn't allow you to delete // immediately, keep track of which elements we have iterated over so @@ -566,9 +565,9 @@ namespace Lucene.Net.Index // end of the block. IList<KeyValuePair<SegmentCommitInfo, ReadersAndUpdates>> toDelete = new List<KeyValuePair<SegmentCommitInfo, ReadersAndUpdates>>(); - while (it.MoveNext()) + foreach (var pair in readerMap) { - ReadersAndUpdates rld = it.Current.Value; + ReadersAndUpdates rld = pair.Value; try { @@ -612,7 +611,7 @@ namespace Lucene.Net.Index // so we store the elements that are iterated over and // delete as soon as we are done iterating (whether // that is because of an exception or not). - toDelete.Add(it.Current); + toDelete.Add(pair); // NOTE: it is allowed that these decRefs do not // actually close the SRs; this happens when a diff --git a/src/Lucene.Net/Search/BooleanQuery.cs b/src/Lucene.Net/Search/BooleanQuery.cs index 80ae085..8f7404c 100644 --- a/src/Lucene.Net/Search/BooleanQuery.cs +++ b/src/Lucene.Net/Search/BooleanQuery.cs @@ -341,49 +341,50 @@ namespace Lucene.Net.Search float sum = 0.0f; bool fail = false; int shouldMatchCount = 0; - IEnumerator<BooleanClause> cIter = outerInstance.clauses.GetEnumerator(); - for (IEnumerator<Weight> wIter = m_weights.GetEnumerator(); wIter.MoveNext(); ) + using (IEnumerator<BooleanClause> cIter = outerInstance.clauses.GetEnumerator()) { - Weight w = wIter.Current; - cIter.MoveNext(); - BooleanClause c = cIter.Current; - if (w.GetScorer(context, context.AtomicReader.LiveDocs) == null) + foreach (Weight w in m_weights) { - if (c.IsRequired) + cIter.MoveNext(); + BooleanClause c = cIter.Current; + if (w.GetScorer(context, context.AtomicReader.LiveDocs) == null) { - fail = true; - Explanation r = new Explanation(0.0f, "no match on required clause (" + c.Query.ToString() + ")"); - sumExpl.AddDetail(r); + if (c.IsRequired) + { + fail = true; + Explanation r = new Explanation(0.0f, "no match on required clause (" + c.Query.ToString() + ")"); + sumExpl.AddDetail(r); + } + continue; } - continue; - } - Explanation e = w.Explain(context, doc); - if (e.IsMatch) - { - if (!c.IsProhibited) + Explanation e = w.Explain(context, doc); + if (e.IsMatch) { - sumExpl.AddDetail(e); - sum += e.Value; - coord++; + if (!c.IsProhibited) + { + sumExpl.AddDetail(e); + sum += e.Value; + coord++; + } + else + { + Explanation r = new Explanation(0.0f, "match on prohibited clause (" + c.Query.ToString() + ")"); + r.AddDetail(e); + sumExpl.AddDetail(r); + fail = true; + } + if (c.Occur == Occur_e.SHOULD) + { + shouldMatchCount++; + } } - else + else if (c.IsRequired) { - Explanation r = new Explanation(0.0f, "match on prohibited clause (" + c.Query.ToString() + ")"); + Explanation r = new Explanation(0.0f, "no match on required clause (" + c.Query.ToString() + ")"); r.AddDetail(e); sumExpl.AddDetail(r); fail = true; } - if (c.Occur == Occur_e.SHOULD) - { - shouldMatchCount++; - } - } - else if (c.IsRequired) - { - Explanation r = new Explanation(0.0f, "no match on required clause (" + c.Query.ToString() + ")"); - r.AddDetail(e); - sumExpl.AddDetail(r); - fail = true; } } if (fail) @@ -429,33 +430,35 @@ namespace Lucene.Net.Search IList<BulkScorer> prohibited = new List<BulkScorer>(); IList<BulkScorer> optional = new List<BulkScorer>(); - IEnumerator<BooleanClause> cIter = outerInstance.clauses.GetEnumerator(); - foreach (Weight w in m_weights) - { - cIter.MoveNext(); - BooleanClause c = cIter.Current; - BulkScorer subScorer = w.GetBulkScorer(context, false, acceptDocs); - if (subScorer == null) + using (IEnumerator<BooleanClause> cIter = outerInstance.clauses.GetEnumerator()) + { + foreach (Weight w in m_weights) { - if (c.IsRequired) + cIter.MoveNext(); + BooleanClause c = cIter.Current; + BulkScorer subScorer = w.GetBulkScorer(context, false, acceptDocs); + if (subScorer == null) { - return null; + if (c.IsRequired) + { + return null; + } + } + else if (c.IsRequired) + { + // TODO: there are some cases where BooleanScorer + // would handle conjunctions faster than + // BooleanScorer2... + return base.GetBulkScorer(context, scoreDocsInOrder, acceptDocs); + } + else if (c.IsProhibited) + { + prohibited.Add(subScorer); + } + else + { + optional.Add(subScorer); } - } - else if (c.IsRequired) - { - // TODO: there are some cases where BooleanScorer - // would handle conjunctions faster than - // BooleanScorer2... - return base.GetBulkScorer(context, scoreDocsInOrder, acceptDocs); - } - else if (c.IsProhibited) - { - prohibited.Add(subScorer); - } - else - { - optional.Add(subScorer); } } diff --git a/src/Lucene.Net/Search/MultiPhraseQuery.cs b/src/Lucene.Net/Search/MultiPhraseQuery.cs index 0a68b64..5e36a95 100644 --- a/src/Lucene.Net/Search/MultiPhraseQuery.cs +++ b/src/Lucene.Net/Search/MultiPhraseQuery.cs @@ -396,12 +396,10 @@ namespace Lucene.Net.Search buffer.Append("\""); int k = 0; - IEnumerator<Term[]> i = termArrays.GetEnumerator(); int? lastPos = -1; bool first = true; - while (i.MoveNext()) + foreach (Term[] terms in termArrays) { - Term[] terms = i.Current; int? position = positions[k]; if (first) { @@ -546,10 +544,8 @@ namespace Lucene.Net.Search internal DocsQueue(ICollection<DocsAndPositionsEnum> docsEnums) : base(docsEnums.Count) { - IEnumerator<DocsAndPositionsEnum> i = docsEnums.GetEnumerator(); - while (i.MoveNext()) + foreach (DocsAndPositionsEnum postings in docsEnums) { - DocsAndPositionsEnum postings = i.Current; if (postings.NextDoc() != DocIdSetIterator.NO_MORE_DOCS) { Add(postings); diff --git a/src/Lucene.Net/Search/Payloads/PayloadNearQuery.cs b/src/Lucene.Net/Search/Payloads/PayloadNearQuery.cs index 60fcba0..f4dc779 100644 --- a/src/Lucene.Net/Search/Payloads/PayloadNearQuery.cs +++ b/src/Lucene.Net/Search/Payloads/PayloadNearQuery.cs @@ -87,11 +87,9 @@ namespace Lucene.Net.Search.Payloads { StringBuilder buffer = new StringBuilder(); buffer.Append("payloadNear(["); - IEnumerator<SpanQuery> i = m_clauses.GetEnumerator(); bool hasCommaSpace = false; - while (i.MoveNext()) + foreach (SpanQuery clause in m_clauses) { - SpanQuery clause = i.Current; buffer.Append(clause.ToString(field)); buffer.Append(", "); hasCommaSpace = true; diff --git a/src/Lucene.Net/Search/Payloads/PayloadSpanUtil.cs b/src/Lucene.Net/Search/Payloads/PayloadSpanUtil.cs index db74e74..57281e9 100644 --- a/src/Lucene.Net/Search/Payloads/PayloadSpanUtil.cs +++ b/src/Lucene.Net/Search/Payloads/PayloadSpanUtil.cs @@ -114,10 +114,9 @@ namespace Lucene.Net.Search.Payloads } else if (query is DisjunctionMaxQuery) { - IEnumerator<Query> enumerator = ((DisjunctionMaxQuery)query).GetEnumerator(); - while (enumerator.MoveNext()) + foreach (var q in ((DisjunctionMaxQuery)query)) { - QueryToSpanQuery(enumerator.Current, payloads); + QueryToSpanQuery(q, payloads); } } else if (query is MultiPhraseQuery) diff --git a/src/Lucene.Net/Search/Spans/SpanNearQuery.cs b/src/Lucene.Net/Search/Spans/SpanNearQuery.cs index 9b6449e..5ea2a87 100644 --- a/src/Lucene.Net/Search/Spans/SpanNearQuery.cs +++ b/src/Lucene.Net/Search/Spans/SpanNearQuery.cs @@ -129,11 +129,9 @@ namespace Lucene.Net.Search.Spans { StringBuilder buffer = new StringBuilder(); buffer.Append("SpanNear(["); - IEnumerator<SpanQuery> i = m_clauses.GetEnumerator(); bool isFirst = true; - while (i.MoveNext()) + foreach (SpanQuery clause in m_clauses) { - SpanQuery clause = i.Current; if (!isFirst) { buffer.Append(", "); diff --git a/src/Lucene.Net/Search/Spans/SpanOrQuery.cs b/src/Lucene.Net/Search/Spans/SpanOrQuery.cs index 0893ca9..f55f8aa 100644 --- a/src/Lucene.Net/Search/Spans/SpanOrQuery.cs +++ b/src/Lucene.Net/Search/Spans/SpanOrQuery.cs @@ -134,11 +134,9 @@ namespace Lucene.Net.Search.Spans { StringBuilder buffer = new StringBuilder(); buffer.Append("spanOr(["); - IEnumerator<SpanQuery> i = clauses.GetEnumerator(); bool first = true; - while (i.MoveNext()) + foreach (SpanQuery clause in clauses) { - SpanQuery clause = i.Current; if (!first) buffer.Append(", "); buffer.Append(clause.ToString(field)); first = false; @@ -241,10 +239,9 @@ namespace Lucene.Net.Search.Spans private bool InitSpanQueue(int target) { queue = new SpanQueue(outerInstance, outerInstance.clauses.Count); - IEnumerator<SpanQuery> i = outerInstance.clauses.GetEnumerator(); - while (i.MoveNext()) + foreach (var clause in outerInstance.clauses) { - Spans spans = i.Current.GetSpans(context, acceptDocs, termContexts); + Spans spans = clause.GetSpans(context, acceptDocs, termContexts); cost += spans.GetCost(); if (((target == -1) && spans.Next()) || ((target != -1) && spans.SkipTo(target))) { diff --git a/src/Lucene.Net/Search/Spans/SpanPayloadCheckQuery.cs b/src/Lucene.Net/Search/Spans/SpanPayloadCheckQuery.cs index c9928ad..53b1487 100644 --- a/src/Lucene.Net/Search/Spans/SpanPayloadCheckQuery.cs +++ b/src/Lucene.Net/Search/Spans/SpanPayloadCheckQuery.cs @@ -62,16 +62,18 @@ namespace Lucene.Net.Search.Spans if (candidate.Count == m_payloadToMatch.Count) { //TODO: check the byte arrays are the same - var toMatchIter = m_payloadToMatch.GetEnumerator(); - //check each of the byte arrays, in order - //hmm, can't rely on order here - foreach (var candBytes in candidate) + using (var toMatchIter = m_payloadToMatch.GetEnumerator()) { - toMatchIter.MoveNext(); - //if one is a mismatch, then return false - if (Arrays.Equals(candBytes, toMatchIter.Current) == false) + //check each of the byte arrays, in order + //hmm, can't rely on order here + foreach (var candBytes in candidate) { - return AcceptStatus.NO; + toMatchIter.MoveNext(); + //if one is a mismatch, then return false + if (Arrays.Equals(candBytes, toMatchIter.Current) == false) + { + return AcceptStatus.NO; + } } } //we've verified all the bytes diff --git a/src/Lucene.Net/Support/HashMap.cs b/src/Lucene.Net/Support/HashMap.cs index db8723e..f01b6ee 100644 --- a/src/Lucene.Net/Support/HashMap.cs +++ b/src/Lucene.Net/Support/HashMap.cs @@ -166,21 +166,23 @@ namespace Lucene.Net.Support try { - var i = GetEnumerator(); - while (i.MoveNext()) + using (var i = GetEnumerator()) { - KeyValuePair<TKey, TValue> e = i.Current; - TKey key = e.Key; - TValue value = e.Value; - if (value == null) + while (i.MoveNext()) { - if (!(m[key] == null && m.ContainsKey(key))) - return false; - } - else - { - if (!value.Equals(m[key])) - return false; + KeyValuePair<TKey, TValue> e = i.Current; + TKey key = e.Key; + TValue value = e.Value; + if (value == null) + { + if (!(m[key] == null && m.ContainsKey(key))) + return false; + } + else + { + if (!value.Equals(m[key])) + return false; + } } } } @@ -199,31 +201,35 @@ namespace Lucene.Net.Support public override int GetHashCode() { int h = 0; - var i = GetEnumerator(); - while (i.MoveNext()) - h += i.Current.GetHashCode(); + using (var i = GetEnumerator()) + { + while (i.MoveNext()) + h += i.Current.GetHashCode(); + } return h; } public override string ToString() { - var i = GetEnumerator(); - if (!i.MoveNext()) - return "{}"; - - StringBuilder sb = new StringBuilder(); - sb.Append('{'); - for (;;) - { - var e = i.Current; - TKey key = e.Key; - TValue value = e.Value; - sb.Append(key); - sb.Append('='); - sb.Append(value); + using (var i = GetEnumerator()) + { if (!i.MoveNext()) - return sb.Append('}').ToString(); - sb.Append(',').Append(' '); + return "{}"; + + StringBuilder sb = new StringBuilder(); + sb.Append('{'); + for (; ; ) + { + var e = i.Current; + TKey key = e.Key; + TValue value = e.Value; + sb.Append(key); + sb.Append('='); + sb.Append(value); + if (!i.MoveNext()) + return sb.Append('}').ToString(); + sb.Append(',').Append(' '); + } } } diff --git a/src/Lucene.Net/Support/TreeSet.cs b/src/Lucene.Net/Support/TreeSet.cs index f0d78c7..c1532f3 100644 --- a/src/Lucene.Net/Support/TreeSet.cs +++ b/src/Lucene.Net/Support/TreeSet.cs @@ -1150,65 +1150,68 @@ namespace Lucene.Net.Support void addSorted(SCG.IEnumerable<T> items, bool safe, bool raise) { - SCG.IEnumerator<T> e = items.GetEnumerator(); ; - if (size > 0) - throw new InternalException("This can't happen"); - - if (!e.MoveNext()) - return; + using (SCG.IEnumerator<T> e = items.GetEnumerator()) + { + if (size > 0) + throw new InternalException("This can't happen"); - //To count theCollect - Node head = new Node(), tail = head; - int z = 1; - T lastitem = tail.item = e.Current; + if (!e.MoveNext()) + return; + //To count theCollect + Node head = new Node(), tail = head; + int z = 1; + T lastitem = tail.item = e.Current; - while (e.MoveNext()) - { - z++; - tail.right = new Node(); - tail = tail.right; - tail.item = e.Current; - if (safe) + while (e.MoveNext()) { - if (comparer.Compare(lastitem, tail.item) >= 0) - throw new ArgumentException("Argument not sorted"); - lastitem = tail.item; + z++; + tail.right = new Node(); + tail = tail.right; + tail.item = e.Current; + if (safe) + { + if (comparer.Compare(lastitem, tail.item) >= 0) + throw new ArgumentException("Argument not sorted"); + + lastitem = tail.item; + } + tail.generation = generation; + } - tail.generation = generation; - } - int blackheight = 0, red = z, maxred = 1; + int blackheight = 0, red = z, maxred = 1; - while (maxred <= red) - { - red -= maxred; - maxred <<= 1; - blackheight++; - } + while (maxred <= red) + { + red -= maxred; + maxred <<= 1; + blackheight++; + } - root = TreeSet<T>.maketreer(ref head, blackheight, maxred, red); - blackdepth = blackheight; - size = z; + root = TreeSet<T>.maketreer(ref head, blackheight, maxred, red); + blackdepth = blackheight; + size = z; - if (raise) - { - if ((ActiveEvents & EventTypeEnum.Added) != 0) + if (raise) { - CircularQueue<T> wasAdded = new CircularQueue<T>(); - foreach (T item in this) - wasAdded.Enqueue(item); - foreach (T item in wasAdded) - raiseItemsAdded(item, 1); + if ((ActiveEvents & EventTypeEnum.Added) != 0) + { + CircularQueue<T> wasAdded = new CircularQueue<T>(); + foreach (T item in this) + wasAdded.Enqueue(item); + foreach (T item in wasAdded) + raiseItemsAdded(item, 1); + } + if ((ActiveEvents & EventTypeEnum.Changed) != 0) + raiseCollectionChanged(); } - if ((ActiveEvents & EventTypeEnum.Changed) != 0) - raiseCollectionChanged(); + return; } - return; } #endregion @@ -1909,23 +1912,25 @@ namespace Lucene.Net.Support if ((ActiveEvents & EventTypeEnum.Removed) != 0) { wasRemoved = new CircularQueue<KeyValuePair<T, int>>(); - SCG.IEnumerator<KeyValuePair<T, int>> ie = ItemMultiplicities().GetEnumerator(); - foreach (KeyValuePair<T, int> p in t.ItemMultiplicities()) + using (SCG.IEnumerator<KeyValuePair<T, int>> ie = ItemMultiplicities().GetEnumerator()) { - //We know p.Key is in this! - while (ie.MoveNext()) + foreach (KeyValuePair<T, int> p in t.ItemMultiplicities()) { - if (comparer.Compare(ie.Current.Key, p.Key) == 0) + //We know p.Key is in this! + while (ie.MoveNext()) { + if (comparer.Compare(ie.Current.Key, p.Key) == 0) + { - break; + break; + } + else + wasRemoved.Enqueue(ie.Current); } - else - wasRemoved.Enqueue(ie.Current); } + while (ie.MoveNext()) + wasRemoved.Enqueue(ie.Current); } - while (ie.MoveNext()) - wasRemoved.Enqueue(ie.Current); } root = t.root; @@ -1971,50 +1976,52 @@ namespace Lucene.Net.Support if (!isValid) throw new ViewDisposedException("Snapshot has been disposed"); TreeSet<T> res = new TreeSet<T>(comparer); - SCG.IEnumerator<T> e = GetEnumerator(); - Node head = null, tail = null; - int z = 0; - - while (e.MoveNext()) + using (SCG.IEnumerator<T> e = GetEnumerator()) { - T thisitem = e.Current; + Node head = null, tail = null; + int z = 0; - if (filter(thisitem)) + while (e.MoveNext()) { - if (head == null) - { - head = tail = new Node(); - } - else + T thisitem = e.Current; + + if (filter(thisitem)) { + if (head == null) + { + head = tail = new Node(); + } + else + { - tail.right = new Node(); - tail = tail.right; - } + tail.right = new Node(); + tail = tail.right; + } - tail.item = thisitem; - z++; + tail.item = thisitem; + z++; + } } - } - if (z == 0) - return res; + if (z == 0) + return res; - int blackheight = 0, red = z, maxred = 1; + int blackheight = 0, red = z, maxred = 1; - while (maxred <= red) - { - red -= maxred; - maxred <<= 1; - blackheight++; - } + while (maxred <= red) + { + red -= maxred; + maxred <<= 1; + blackheight++; + } - res.root = TreeSet<T>.maketreer(ref head, blackheight, maxred, red); - res.blackdepth = blackheight; - res.size = z; + res.root = TreeSet<T>.maketreer(ref head, blackheight, maxred, red); + res.blackdepth = blackheight; + res.size = z; - return res; + return res; + } } @@ -2037,52 +2044,55 @@ namespace Lucene.Net.Support if (size == 0) return res; - SCG.IEnumerator<T> e = GetEnumerator(); - TreeSet<V>.Node head = null, tail = null; - V oldv = default(V); - int z = 0; - - while (e.MoveNext()) + using (SCG.IEnumerator<T> e = GetEnumerator()) { - T thisitem = e.Current; + TreeSet<V>.Node head = null, tail = null; + V oldv = default(V); + int z = 0; - V newv = mapper(thisitem); - - if (head == null) + while (e.MoveNext()) { - head = tail = new TreeSet<V>.Node(); - z++; - } - else - { - int comp = c.Compare(oldv, newv); + T thisitem = e.Current; + + V newv = mapper(thisitem); - if (comp >= 0) + if (head == null) + { + head = tail = new TreeSet<V>.Node(); + z++; + } + else + { + int comp = c.Compare(oldv, newv); - throw new ArgumentException("mapper not monotonic"); + if (comp >= 0) - tail.right = new TreeSet<V>.Node(); - tail = tail.right; - z++; + throw new ArgumentException("mapper not monotonic"); + + tail.right = new TreeSet<V>.Node(); + tail = tail.right; + z++; + } + + tail.item = oldv = newv; } - tail.item = oldv = newv; - } - int blackheight = 0, red = z, maxred = 1; + int blackheight = 0, red = z, maxred = 1; - while (maxred <= red) - { - red -= maxred; - maxred <<= 1; - blackheight++; - } + while (maxred <= red) + { + red -= maxred; + maxred <<= 1; + blackheight++; + } - res.root = TreeSet<V>.maketreer(ref head, blackheight, maxred, red); - res.blackdepth = blackheight; - res.size = size; - return res; + res.root = TreeSet<V>.maketreer(ref head, blackheight, maxred, red); + res.blackdepth = blackheight; + res.size = size; + return res; + } } diff --git a/src/Lucene.Net/Util/AttributeSource.cs b/src/Lucene.Net/Util/AttributeSource.cs index b46386a..f3b8b66 100644 --- a/src/Lucene.Net/Util/AttributeSource.cs +++ b/src/Lucene.Net/Util/AttributeSource.cs @@ -407,16 +407,18 @@ namespace Lucene.Net.Util return s; } var c = s = currentState[0] = new State(); - var it = attributeImpls.Values().GetEnumerator(); - it.MoveNext(); - c.attribute = it.Current.Value; - while (it.MoveNext()) + using (var it = attributeImpls.Values().GetEnumerator()) { - c.next = new State(); - c = c.next; + it.MoveNext(); c.attribute = it.Current.Value; + while (it.MoveNext()) + { + c.next = new State(); + c = c.next; + c.attribute = it.Current.Value; + } + return s; } - return s; } /// <summary> diff --git a/src/Lucene.Net/Util/Automaton/BasicOperations.cs b/src/Lucene.Net/Util/Automaton/BasicOperations.cs index d6efcb9..6169edc 100644 --- a/src/Lucene.Net/Util/Automaton/BasicOperations.cs +++ b/src/Lucene.Net/Util/Automaton/BasicOperations.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Text; /* @@ -1034,9 +1035,7 @@ namespace Lucene.Net.Util.Automaton } if (a.initial.accept && a.initial.NumTransitions == 1) { - var iter = a.initial.GetTransitions().GetEnumerator(); - iter.MoveNext(); - Transition t = iter.Current; ; + Transition t = a.initial.GetTransitions().First(); return t.to == a.initial && t.min == Character.MIN_CODE_POINT && t.max == Character.MAX_CODE_POINT; } return false; diff --git a/src/Lucene.Net/Util/Automaton/LevenshteinAutomata.cs b/src/Lucene.Net/Util/Automaton/LevenshteinAutomata.cs index f6e82f7..94ce273 100644 --- a/src/Lucene.Net/Util/Automaton/LevenshteinAutomata.cs +++ b/src/Lucene.Net/Util/Automaton/LevenshteinAutomata.cs @@ -80,11 +80,13 @@ namespace Lucene.Net.Util.Automaton set.Add(v); } alphabet = new int[set.Count]; - IEnumerator<int> iterator = set.GetEnumerator(); - for (int i = 0; i < alphabet.Length; i++) + using (IEnumerator<int> iterator = set.GetEnumerator()) { - iterator.MoveNext(); - alphabet[i] = iterator.Current; + for (int i = 0; i < alphabet.Length; i++) + { + iterator.MoveNext(); + alphabet[i] = iterator.Current; + } } rangeLower = new int[alphabet.Length + 2]; diff --git a/src/Lucene.Net/Util/Automaton/SpecialOperations.cs b/src/Lucene.Net/Util/Automaton/SpecialOperations.cs index b312fb9..17b83cf 100644 --- a/src/Lucene.Net/Util/Automaton/SpecialOperations.cs +++ b/src/Lucene.Net/Util/Automaton/SpecialOperations.cs @@ -124,9 +124,7 @@ namespace Lucene.Net.Util.Automaton visited.Add(s); if (!s.accept && s.NumTransitions == 1) { - var iter = s.GetTransitions().GetEnumerator(); - iter.MoveNext(); - Transition t = iter.Current; + Transition t = s.GetTransitions().First(); if (t.min == t.max && !visited.Contains(t.to)) { b.AppendCodePoint(t.min); @@ -157,9 +155,7 @@ namespace Lucene.Net.Util.Automaton visited.Add(s); if (!s.accept && s.NumTransitions == 1) { - var iter = s.GetTransitions().GetEnumerator(); - iter.MoveNext(); - Transition t = iter.Current; + Transition t = s.GetTransitions().First(); if (t.min == t.max && !visited.Contains(t.to)) { diff --git a/src/Lucene.Net/Util/CloseableThreadLocal.cs b/src/Lucene.Net/Util/CloseableThreadLocal.cs index 0328a4a..706334d 100644 --- a/src/Lucene.Net/Util/CloseableThreadLocal.cs +++ b/src/Lucene.Net/Util/CloseableThreadLocal.cs @@ -122,9 +122,8 @@ namespace Lucene.Net.Util List<Thread> Removed = new List<Thread>(); try { - for (IEnumerator<Thread> it = hardRefs.Keys.GetEnumerator(); it.MoveNext(); ) + foreach (Thread t in hardRefs.Keys) { - Thread t = it.Current; if (!t.IsAlive) { Removed.Add(t); diff --git a/src/Lucene.Net/Util/MergedIterator.cs b/src/Lucene.Net/Util/MergedIterator.cs index 668bfdf..7ee721c 100644 --- a/src/Lucene.Net/Util/MergedIterator.cs +++ b/src/Lucene.Net/Util/MergedIterator.cs @@ -43,9 +43,12 @@ namespace Lucene.Net.Util /// are returned isn't defined.</description></item> /// </list> /// <para/> + /// The caller is responsible for disposing the <see cref="IEnumerator{T}"/> instances that are passed + /// into the constructor, <see cref="MergedIterator{T}"/> doesn't do it automatically. + /// <para/> /// @lucene.internal /// </summary> - public sealed class MergedIterator<T> : IEnumerator<T> + public sealed class MergedIterator<T> : IEnumerator<T> // LUCENENET TODO: API - rename MergedEnumerator where T : IComparable<T> { private readonly TermMergeQueue<T> queue; diff --git a/src/Lucene.Net/Util/WAH8DocIdSet.cs b/src/Lucene.Net/Util/WAH8DocIdSet.cs index b5abda8..c1470e0 100644 --- a/src/Lucene.Net/Util/WAH8DocIdSet.cs +++ b/src/Lucene.Net/Util/WAH8DocIdSet.cs @@ -2,6 +2,7 @@ using Lucene.Net.Support; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; namespace Lucene.Net.Util { @@ -127,9 +128,7 @@ namespace Lucene.Net.Util case 0: throw new System.ArgumentException("There must be at least one set to intersect"); case 1: - var iter = docIdSets.GetEnumerator(); - iter.MoveNext(); - return iter.Current; + return docIdSets.First(); } // The logic below is similar to ConjunctionScorer int numSets = docIdSets.Count; @@ -202,9 +201,7 @@ namespace Lucene.Net.Util return EMPTY; case 1: - var iter = docIdSets.GetEnumerator(); - iter.MoveNext(); - return iter.Current; + return docIdSets.First(); } // The logic below is very similar to DisjunctionScorer int numSets = docIdSets.Count; diff --git a/src/dotnet/tools/lucene-cli/SourceCode/ConsolePager.cs b/src/dotnet/tools/lucene-cli/SourceCode/ConsolePager.cs index ef17101..71d3f16 100644 --- a/src/dotnet/tools/lucene-cli/SourceCode/ConsolePager.cs +++ b/src/dotnet/tools/lucene-cli/SourceCode/ConsolePager.cs @@ -51,7 +51,7 @@ namespace Lucene.Net.Cli.SourceCode /// </item> /// </list> /// </summary> - public class ConsolePager : IDisposable + public sealed class ConsolePager : IDisposable { private readonly MultipleFileLineEnumerator enumerator;
