SegmentTermDocs.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. using BitVector = Lucene.Net.Util.BitVector;
  19. namespace Lucene.Net.Index
  20. {
  21. class SegmentTermDocs : TermDocs
  22. {
  23. protected internal SegmentReader parent;
  24. protected internal IndexInput freqStream;
  25. protected internal int count;
  26. protected internal int df;
  27. protected internal BitVector deletedDocs;
  28. internal int doc = 0;
  29. internal int freq;
  30. private int skipInterval;
  31. private int numSkips;
  32. private int skipCount;
  33. private IndexInput skipStream;
  34. private int skipDoc;
  35. private long freqPointer;
  36. private long proxPointer;
  37. private long skipPointer;
  38. private bool haveSkipped;
  39. protected internal SegmentTermDocs(SegmentReader parent)
  40. {
  41. this.parent = parent;
  42. this.freqStream = (IndexInput) parent.freqStream.Clone();
  43. this.deletedDocs = parent.deletedDocs;
  44. this.skipInterval = parent.tis.GetSkipInterval();
  45. }
  46. public virtual void  Seek(Term term)
  47. {
  48. TermInfo ti = parent.tis.Get(term);
  49. Seek(ti);
  50. }
  51. public virtual void  Seek(TermEnum termEnum)
  52. {
  53. TermInfo ti;
  54. // use comparison of fieldinfos to verify that termEnum belongs to the same segment as this SegmentTermDocs
  55. if (termEnum is SegmentTermEnum && ((SegmentTermEnum) termEnum).fieldInfos == parent.fieldInfos)
  56. // optimized case
  57. ti = ((SegmentTermEnum) termEnum).TermInfo();
  58. // punt case
  59. else
  60. ti = parent.tis.Get(termEnum.Term());
  61. Seek(ti);
  62. }
  63. internal virtual void  Seek(TermInfo ti)
  64. {
  65. count = 0;
  66. if (ti == null)
  67. {
  68. df = 0;
  69. }
  70. else
  71. {
  72. df = ti.docFreq;
  73. doc = 0;
  74. skipDoc = 0;
  75. skipCount = 0;
  76. numSkips = df / skipInterval;
  77. freqPointer = ti.freqPointer;
  78. proxPointer = ti.proxPointer;
  79. skipPointer = freqPointer + ti.skipOffset;
  80. freqStream.Seek(freqPointer);
  81. haveSkipped = false;
  82. }
  83. }
  84. public virtual void  Close()
  85. {
  86. freqStream.Close();
  87. if (skipStream != null)
  88. skipStream.Close();
  89. }
  90. public int Doc()
  91. {
  92. return doc;
  93. }
  94. public int Freq()
  95. {
  96. return freq;
  97. }
  98. protected internal virtual void  SkippingDoc()
  99. {
  100. }
  101. public virtual bool Next()
  102. {
  103. while (true)
  104. {
  105. if (count == df)
  106. return false;
  107. int docCode = freqStream.ReadVInt();
  108. doc += (int) (((uint) docCode) >> 1); // shift off low bit
  109. if ((docCode & 1) != 0)
  110. // if low bit is set
  111. freq = 1;
  112. // freq is one
  113. else
  114. freq = freqStream.ReadVInt(); // else read freq
  115. count++;
  116. if (deletedDocs == null || !deletedDocs.Get(doc))
  117. break;
  118. SkippingDoc();
  119. }
  120. return true;
  121. }
  122. /// <summary>Optimized implementation. </summary>
  123. public virtual int Read(int[] docs, int[] freqs)
  124. {
  125. int length = docs.Length;
  126. int i = 0;
  127. while (i < length && count < df)
  128. {
  129. // manually inlined call to next() for speed
  130. int docCode = freqStream.ReadVInt();
  131. doc += (int) (((uint) docCode) >> 1); // shift off low bit
  132. if ((docCode & 1) != 0)
  133. // if low bit is set
  134. freq = 1;
  135. // freq is one
  136. else
  137. freq = freqStream.ReadVInt(); // else read freq
  138. count++;
  139. if (deletedDocs == null || !deletedDocs.Get(doc))
  140. {
  141. docs[i] = doc;
  142. freqs[i] = freq;
  143. ++i;
  144. }
  145. }
  146. return i;
  147. }
  148. /// <summary>Overridden by SegmentTermPositions to skip in prox stream. </summary>
  149. protected internal virtual void  SkipProx(long proxPointer)
  150. {
  151. }
  152. /// <summary>Optimized implementation. </summary>
  153. public virtual bool SkipTo(int target)
  154. {
  155. if (df >= skipInterval)
  156. {
  157. // optimized case
  158. if (skipStream == null)
  159. skipStream = (IndexInput) freqStream.Clone(); // lazily clone
  160. if (!haveSkipped)
  161. {
  162. // lazily seek skip stream
  163. skipStream.Seek(skipPointer);
  164. haveSkipped = true;
  165. }
  166. // scan skip data
  167. int lastSkipDoc = skipDoc;
  168. long lastFreqPointer = freqStream.GetFilePointer();
  169. long lastProxPointer = - 1;
  170. int numSkipped = - 1 - (count % skipInterval);
  171. while (target > skipDoc)
  172. {
  173. lastSkipDoc = skipDoc;
  174. lastFreqPointer = freqPointer;
  175. lastProxPointer = proxPointer;
  176. if (skipDoc != 0 && skipDoc >= doc)
  177. numSkipped += skipInterval;
  178. if (skipCount >= numSkips)
  179. break;
  180. skipDoc += skipStream.ReadVInt();
  181. freqPointer += skipStream.ReadVInt();
  182. proxPointer += skipStream.ReadVInt();
  183. skipCount++;
  184. }
  185. // if we found something to skip, then skip it
  186. if (lastFreqPointer > freqStream.GetFilePointer())
  187. {
  188. freqStream.Seek(lastFreqPointer);
  189. SkipProx(lastProxPointer);
  190. doc = lastSkipDoc;
  191. count += numSkipped;
  192. }
  193. }
  194. // done skipping, now just scan
  195. do 
  196. {
  197. if (!Next())
  198. return false;
  199. }
  200. while (target > doc);
  201. return true;
  202. }
  203. }
  204. }