DateFilter.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 DateField = Lucene.Net.Documents.DateField;
  18. using IndexReader = Lucene.Net.Index.IndexReader;
  19. using Term = Lucene.Net.Index.Term;
  20. using TermDocs = Lucene.Net.Index.TermDocs;
  21. using TermEnum = Lucene.Net.Index.TermEnum;
  22. namespace Lucene.Net.Search
  23. {
  24. /// <summary> A Filter that restricts search results to a range of time.
  25. /// 
  26. /// <p>For this to work, documents must have been indexed with a
  27. /// {@link DateField}.</p>
  28. /// 
  29. /// </summary>
  30. /// <deprecated> Instead, use {@link RangeFilter} combined with 
  31. /// {@link Lucene.Net.document.DateTools}.
  32. /// </deprecated>
  33. [Serializable]
  34. public class DateFilter : Filter
  35. {
  36. private void  InitBlock()
  37. {
  38. start = DateField.MIN_DATE_STRING();
  39. end = DateField.MAX_DATE_STRING();
  40. }
  41. internal System.String field;
  42. internal System.String start;
  43. internal System.String end;
  44. private DateFilter(System.String f)
  45. {
  46. InitBlock();
  47. field = f;
  48. }
  49. /// <summary> Constructs a filter for field <code>f</code> matching dates
  50. /// between <code>from</code> and <code>to</code> inclusively.
  51. /// </summary>
  52. public DateFilter(System.String f, System.DateTime from, System.DateTime to)
  53. {
  54. InitBlock();
  55. field = f;
  56. start = DateField.DateToString(from);
  57. end = DateField.DateToString(to);
  58. }
  59. /// <summary> Constructs a filter for field <code>f</code> matching times
  60. /// between <code>from</code> and <code>to</code> inclusively.
  61. /// </summary>
  62. public DateFilter(System.String f, long from, long to)
  63. {
  64. InitBlock();
  65. field = f;
  66. start = DateField.TimeToString(from);
  67. end = DateField.TimeToString(to);
  68. }
  69. /// <summary> Constructs a filter for field <code>f</code> matching
  70. /// dates on or before before <code>date</code>.
  71. /// </summary>
  72. public static DateFilter Before(System.String field, System.DateTime date)
  73. {
  74. DateFilter result = new DateFilter(field);
  75. result.end = DateField.DateToString(date);
  76. return result;
  77. }
  78. /// <summary> Constructs a filter for field <code>f</code> matching times
  79. /// on or before <code>time</code>.
  80. /// </summary>
  81. public static DateFilter Before(System.String field, long time)
  82. {
  83. DateFilter result = new DateFilter(field);
  84. result.end = DateField.TimeToString(time);
  85. return result;
  86. }
  87. /// <summary> Constructs a filter for field <code>f</code> matching
  88. /// dates on or after <code>date</code>.
  89. /// </summary>
  90. public static DateFilter After(System.String field, System.DateTime date)
  91. {
  92. DateFilter result = new DateFilter(field);
  93. result.start = DateField.DateToString(date);
  94. return result;
  95. }
  96. /// <summary> Constructs a filter for field <code>f</code> matching
  97. /// times on or after <code>time</code>.
  98. /// </summary>
  99. public static DateFilter After(System.String field, long time)
  100. {
  101. DateFilter result = new DateFilter(field);
  102. result.start = DateField.TimeToString(time);
  103. return result;
  104. }
  105. /// <summary> Returns a BitSet with true for documents which should be
  106. /// permitted in search results, and false for those that should
  107. /// not.
  108. /// </summary>
  109. public override System.Collections.BitArray Bits(IndexReader reader)
  110. {
  111. System.Collections.BitArray bits = new System.Collections.BitArray((reader.MaxDoc() % 64 == 0?reader.MaxDoc() / 64:reader.MaxDoc() / 64 + 1) * 64);
  112. TermEnum enumerator = reader.Terms(new Term(field, start));
  113. TermDocs termDocs = reader.TermDocs();
  114. if (enumerator.Term() == null)
  115. {
  116. return bits;
  117. }
  118. try
  119. {
  120. Term stop = new Term(field, end);
  121. while (enumerator.Term().CompareTo(stop) <= 0)
  122. {
  123. termDocs.Seek(enumerator.Term());
  124. while (termDocs.Next())
  125. {
  126. bits.Set(termDocs.Doc(), true);
  127. }
  128. if (!enumerator.Next())
  129. {
  130. break;
  131. }
  132. }
  133. }
  134. finally
  135. {
  136. enumerator.Close();
  137. termDocs.Close();
  138. }
  139. return bits;
  140. }
  141. public override System.String ToString()
  142. {
  143. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  144. buffer.Append(field);
  145. buffer.Append(":");
  146. buffer.Append(DateField.StringToDate(start).ToString("r"));
  147. buffer.Append("-");
  148. buffer.Append(DateField.StringToDate(end).ToString("r"));
  149. return buffer.ToString();
  150. }
  151. }
  152. }