SegmentTermEnum.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:6k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using IndexInput = Lucene.Net.Store.IndexInput;
  18. namespace Lucene.Net.Index
  19. {
  20. public sealed class SegmentTermEnum : TermEnum, System.ICloneable
  21. {
  22. private IndexInput input;
  23. internal FieldInfos fieldInfos;
  24. internal long size;
  25. internal long position = - 1;
  26. private TermBuffer termBuffer = new TermBuffer();
  27. private TermBuffer prevBuffer = new TermBuffer();
  28. private TermBuffer scratch; // used for scanning
  29. private TermInfo termInfo = new TermInfo();
  30. private int format;
  31. private bool isIndex = false;
  32. internal long indexPointer = 0;
  33. internal int indexInterval;
  34. internal int skipInterval;
  35. private int formatM1SkipInterval;
  36. internal SegmentTermEnum(IndexInput i, FieldInfos fis, bool isi)
  37. {
  38. input = i;
  39. fieldInfos = fis;
  40. isIndex = isi;
  41. int firstInt = input.ReadInt();
  42. if (firstInt >= 0)
  43. {
  44. // original-format file, without explicit format version number
  45. format = 0;
  46. size = firstInt;
  47. // back-compatible settings
  48. indexInterval = 128;
  49. skipInterval = System.Int32.MaxValue; // switch off skipTo optimization
  50. }
  51. else
  52. {
  53. // we have a format version number
  54. format = firstInt;
  55. // check that it is a format we can understand
  56. if (format < TermInfosWriter.FORMAT)
  57. throw new System.IO.IOException("Unknown format version:" + format);
  58. size = input.ReadLong(); // read the size
  59. if (format == - 1)
  60. {
  61. if (!isIndex)
  62. {
  63. indexInterval = input.ReadInt();
  64. formatM1SkipInterval = input.ReadInt();
  65. }
  66. // switch off skipTo optimization for file format prior to 1.4rc2 in order to avoid a bug in 
  67. // skipTo implementation of these versions
  68. skipInterval = System.Int32.MaxValue;
  69. }
  70. else
  71. {
  72. indexInterval = input.ReadInt();
  73. skipInterval = input.ReadInt();
  74. }
  75. }
  76. }
  77. public System.Object Clone()
  78. {
  79. SegmentTermEnum clone = null;
  80. try
  81. {
  82. clone = (SegmentTermEnum) base.MemberwiseClone();
  83. }
  84. catch (System.Exception)
  85. {
  86. }
  87. clone.input = (IndexInput) input.Clone();
  88. clone.termInfo = new TermInfo(termInfo);
  89. clone.termBuffer = (TermBuffer) termBuffer.Clone();
  90. clone.prevBuffer = (TermBuffer) prevBuffer.Clone();
  91. clone.scratch = null;
  92. return clone;
  93. }
  94. internal void  Seek(long pointer, int p, Term t, TermInfo ti)
  95. {
  96. input.Seek(pointer);
  97. position = p;
  98. termBuffer.Set(t);
  99. prevBuffer.Reset();
  100. termInfo.Set(ti);
  101. }
  102. /// <summary>Increments the enumeration to the next element.  True if one exists.</summary>
  103. public override bool Next()
  104. {
  105. if (position++ >= size - 1)
  106. {
  107. termBuffer.Reset();
  108. return false;
  109. }
  110. prevBuffer.Set(termBuffer);
  111. termBuffer.Read(input, fieldInfos);
  112. termInfo.docFreq = input.ReadVInt(); // read doc freq
  113. termInfo.freqPointer += input.ReadVLong(); // read freq pointer
  114. termInfo.proxPointer += input.ReadVLong(); // read prox pointer
  115. if (format == - 1)
  116. {
  117. //  just read skipOffset in order to increment  file pointer; 
  118. // value is never used since skipTo is switched off
  119. if (!isIndex)
  120. {
  121. if (termInfo.docFreq > formatM1SkipInterval)
  122. {
  123. termInfo.skipOffset = input.ReadVInt();
  124. }
  125. }
  126. }
  127. else
  128. {
  129. if (termInfo.docFreq >= skipInterval)
  130. termInfo.skipOffset = input.ReadVInt();
  131. }
  132. if (isIndex)
  133. indexPointer += input.ReadVLong(); // read index pointer
  134. return true;
  135. }
  136. /// <summary>Optimized scan, without allocating new terms. </summary>
  137. internal void  ScanTo(Term term)
  138. {
  139. if (scratch == null)
  140. scratch = new TermBuffer();
  141. scratch.Set(term);
  142. while (scratch.CompareTo(termBuffer) > 0 && Next())
  143. {
  144. }
  145. }
  146. /// <summary>Returns the current Term in the enumeration.
  147. /// Initially invalid, valid after next() called for the first time.
  148. /// </summary>
  149. public override Term Term()
  150. {
  151. return termBuffer.ToTerm();
  152. }
  153. /// <summary>Returns the previous Term enumerated. Initially null.</summary>
  154. internal Term Prev()
  155. {
  156. return prevBuffer.ToTerm();
  157. }
  158. /// <summary>Returns the current TermInfo in the enumeration.
  159. /// Initially invalid, valid after next() called for the first time.
  160. /// </summary>
  161. internal TermInfo TermInfo()
  162. {
  163. return new TermInfo(termInfo);
  164. }
  165. /// <summary>Sets the argument to the current TermInfo in the enumeration.
  166. /// Initially invalid, valid after next() called for the first time.
  167. /// </summary>
  168. internal void  TermInfo(TermInfo ti)
  169. {
  170. ti.Set(termInfo);
  171. }
  172. /// <summary>Returns the docFreq from the current TermInfo in the enumeration.
  173. /// Initially invalid, valid after next() called for the first time.
  174. /// </summary>
  175. public override int DocFreq()
  176. {
  177. return termInfo.docFreq;
  178. }
  179. /* Returns the freqPointer from the current TermInfo in the enumeration.
  180. Initially invalid, valid after next() called for the first time.*/
  181. internal long FreqPointer()
  182. {
  183. return termInfo.freqPointer;
  184. }
  185. /* Returns the proxPointer from the current TermInfo in the enumeration.
  186. Initially invalid, valid after next() called for the first time.*/
  187. internal long ProxPointer()
  188. {
  189. return termInfo.proxPointer;
  190. }
  191. /// <summary>Closes the enumeration to further activity, freeing resources. </summary>
  192. public override void  Close()
  193. {
  194. input.Close();
  195. }
  196. }
  197. }