diff options
Diffstat (limited to 'src/core/Index/SegmentMergeInfo.cs')
-rw-r--r-- | src/core/Index/SegmentMergeInfo.cs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/core/Index/SegmentMergeInfo.cs b/src/core/Index/SegmentMergeInfo.cs new file mode 100644 index 0000000..bad0aad --- /dev/null +++ b/src/core/Index/SegmentMergeInfo.cs @@ -0,0 +1,108 @@ +/* + * 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 System; + +namespace Lucene.Net.Index +{ + + sealed class SegmentMergeInfo : IDisposable + { + internal Term term; + internal int base_Renamed; + internal int ord; // the position of the segment in a MultiReader + internal TermEnum termEnum; + internal IndexReader reader; + internal int delCount; + private TermPositions postings; // use getPositions() + private int[] docMap; // use getDocMap() + + private bool isDisposed; + + internal SegmentMergeInfo(int b, TermEnum te, IndexReader r) + { + base_Renamed = b; + reader = r; + termEnum = te; + term = te.Term; + } + + // maps around deleted docs + internal int[] GetDocMap() + { + if (docMap == null) + { + delCount = 0; + // build array which maps document numbers around deletions + if (reader.HasDeletions) + { + int maxDoc = reader.MaxDoc; + docMap = new int[maxDoc]; + int j = 0; + for (int i = 0; i < maxDoc; i++) + { + if (reader.IsDeleted(i)) + { + delCount++; + docMap[i] = - 1; + } + else + docMap[i] = j++; + } + } + } + return docMap; + } + + internal TermPositions GetPositions() + { + if (postings == null) + { + postings = reader.TermPositions(); + } + return postings; + } + + internal bool Next() + { + if (termEnum.Next()) + { + term = termEnum.Term; + return true; + } + else + { + term = null; + return false; + } + } + + public void Dispose() + { + if (isDisposed) return; + + // Move to protected method if class becomes unsealed + termEnum.Close(); + if (postings != null) + { + postings.Close(); + } + + isDisposed = true; + } + } +}
\ No newline at end of file |