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

搜索引擎

开发平台:

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 PriorityQueue = Lucene.Net.Util.PriorityQueue;
  18. namespace Lucene.Net.Index
  19. {
  20. /// <summary> Describe class <code>MultipleTermPositions</code> here.
  21. /// 
  22. /// </summary>
  23. /// <author>  Anders Nielsen
  24. /// </author>
  25. /// <version>  1.0
  26. /// </version>
  27. public class MultipleTermPositions : TermPositions
  28. {
  29. private sealed class TermPositionsQueue:PriorityQueue
  30. {
  31. internal TermPositionsQueue(System.Collections.IList termPositions)
  32. {
  33. Initialize(termPositions.Count);
  34. System.Collections.IEnumerator i = termPositions.GetEnumerator();
  35. while (i.MoveNext())
  36. {
  37. TermPositions tp = (TermPositions) i.Current;
  38. if (tp.Next())
  39. Put(tp);
  40. }
  41. }
  42. internal TermPositions Peek()
  43. {
  44. return (TermPositions) Top();
  45. }
  46. public override bool LessThan(System.Object a, System.Object b)
  47. {
  48. return ((TermPositions) a).Doc() < ((TermPositions) b).Doc();
  49. }
  50. }
  51. private sealed class IntQueue
  52. {
  53. public IntQueue()
  54. {
  55. InitBlock();
  56. }
  57. private void  InitBlock()
  58. {
  59. _array = new int[_arraySize];
  60. }
  61. private int _arraySize = 16;
  62. private int _index = 0;
  63. private int _lastIndex = 0;
  64. private int[] _array;
  65. internal void  Add(int i)
  66. {
  67. if (_lastIndex == _arraySize)
  68. GrowArray();
  69. _array[_lastIndex++] = i;
  70. }
  71. internal int Next()
  72. {
  73. return _array[_index++];
  74. }
  75. internal void  Sort()
  76. {
  77. System.Array.Sort(_array, _index, _lastIndex - _index);
  78. }
  79. internal void  Clear()
  80. {
  81. _index = 0;
  82. _lastIndex = 0;
  83. }
  84. internal int Size()
  85. {
  86. return (_lastIndex - _index);
  87. }
  88. private void  GrowArray()
  89. {
  90. int[] newArray = new int[_arraySize * 2];
  91. Array.Copy(_array, 0, newArray, 0, _arraySize);
  92. _array = newArray;
  93. _arraySize *= 2;
  94. }
  95. }
  96. private int _doc;
  97. private int _freq;
  98. private TermPositionsQueue _termPositionsQueue;
  99. private IntQueue _posList;
  100. /// <summary> Creates a new <code>MultipleTermPositions</code> instance.
  101. /// 
  102. /// </summary>
  103. /// <exception cref="IOException">
  104. /// </exception>
  105. public MultipleTermPositions(IndexReader indexReader, Term[] terms)
  106. {
  107. System.Collections.IList termPositions = new System.Collections.ArrayList();
  108. for (int i = 0; i < terms.Length; i++)
  109. termPositions.Add(indexReader.TermPositions(terms[i]));
  110. _termPositionsQueue = new TermPositionsQueue(termPositions);
  111. _posList = new IntQueue();
  112. }
  113. public bool Next()
  114. {
  115. if (_termPositionsQueue.Size() == 0)
  116. return false;
  117. _posList.Clear();
  118. _doc = _termPositionsQueue.Peek().Doc();
  119. TermPositions tp;
  120. do 
  121. {
  122. tp = _termPositionsQueue.Peek();
  123. for (int i = 0; i < tp.Freq(); i++)
  124. _posList.Add(tp.NextPosition());
  125. if (tp.Next())
  126. _termPositionsQueue.AdjustTop();
  127. else
  128. {
  129. _termPositionsQueue.Pop();
  130. tp.Close();
  131. }
  132. }
  133. while (_termPositionsQueue.Size() > 0 && _termPositionsQueue.Peek().Doc() == _doc);
  134. _posList.Sort();
  135. _freq = _posList.Size();
  136. return true;
  137. }
  138. public int NextPosition()
  139. {
  140. return _posList.Next();
  141. }
  142. public bool SkipTo(int target)
  143. {
  144. while (_termPositionsQueue.Peek() != null && target > _termPositionsQueue.Peek().Doc())
  145. {
  146. TermPositions tp = (TermPositions) _termPositionsQueue.Pop();
  147. if (tp.SkipTo(target))
  148. _termPositionsQueue.Put(tp);
  149. else
  150. tp.Close();
  151. }
  152. return Next();
  153. }
  154. public int Doc()
  155. {
  156. return _doc;
  157. }
  158. public int Freq()
  159. {
  160. return _freq;
  161. }
  162. public void  Close()
  163. {
  164. while (_termPositionsQueue.Size() > 0)
  165. ((TermPositions) _termPositionsQueue.Pop()).Close();
  166. }
  167. /// <summary> Not implemented.</summary>
  168. /// <throws>  UnsupportedOperationException </throws>
  169. public virtual void  Seek(Term arg0)
  170. {
  171. throw new System.NotSupportedException();
  172. }
  173. /// <summary> Not implemented.</summary>
  174. /// <throws>  UnsupportedOperationException </throws>
  175. public virtual void  Seek(TermEnum termEnum)
  176. {
  177. throw new System.NotSupportedException();
  178. }
  179. /// <summary> Not implemented.</summary>
  180. /// <throws>  UnsupportedOperationException </throws>
  181. public virtual int Read(int[] arg0, int[] arg1)
  182. {
  183. throw new System.NotSupportedException();
  184. }
  185. }
  186. }