ConstantScoreRangeQuery.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 IndexReader = Lucene.Net.Index.IndexReader;
  18. namespace Lucene.Net.Search
  19. {
  20. /// <summary> A range query that returns a constant score equal to it's boost for
  21. /// all documents in the range.
  22. /// <p>
  23. /// It does not have an upper bound on the number of clauses covered in the range.
  24. /// <p>
  25. /// If an endpoint is null, it is said to be "open".
  26. /// Either or both endpoints may be open.  Open endpoints may not be exclusive
  27. /// (you can't select all but the first or last term without explicitly specifying the term to exclude.)
  28. /// 
  29. /// </summary>
  30. /// <author>  yonik
  31. /// </author>
  32. /// <version>  $Id$
  33. /// </version>
  34. [Serializable]
  35. public class ConstantScoreRangeQuery : Query
  36. {
  37. private System.String fieldName;
  38. private System.String lowerVal;
  39. private System.String upperVal;
  40. private bool includeLower;
  41. private bool includeUpper;
  42. public ConstantScoreRangeQuery(System.String fieldName, System.String lowerVal, System.String upperVal, bool includeLower, bool includeUpper)
  43. {
  44. // do a little bit of normalization...
  45. // open ended range queries should always be inclusive.
  46. if (lowerVal == null)
  47. {
  48. includeLower = true;
  49. }
  50. else if (includeLower && lowerVal.Equals(""))
  51. {
  52. lowerVal = null;
  53. }
  54. if (upperVal == null)
  55. {
  56. includeUpper = true;
  57. }
  58. this.fieldName = String.Intern(fieldName); // intern it, just like terms...
  59. this.lowerVal = lowerVal;
  60. this.upperVal = upperVal;
  61. this.includeLower = includeLower;
  62. this.includeUpper = includeUpper;
  63. }
  64. /// <summary>Returns the field name for this query </summary>
  65. public virtual System.String GetField()
  66. {
  67. return fieldName;
  68. }
  69. /// <summary>Returns the value of the lower endpoint of this range query, null if open ended </summary>
  70. public virtual System.String GetLowerVal()
  71. {
  72. return lowerVal;
  73. }
  74. /// <summary>Returns the value of the upper endpoint of this range query, null if open ended </summary>
  75. public virtual System.String GetUpperVal()
  76. {
  77. return upperVal;
  78. }
  79. /// <summary>Returns <code>true</code> if the lower endpoint is inclusive </summary>
  80. public virtual bool IncludesLower()
  81. {
  82. return includeLower;
  83. }
  84. /// <summary>Returns <code>true</code> if the upper endpoint is inclusive </summary>
  85. public virtual bool IncludesUpper()
  86. {
  87. return includeUpper;
  88. }
  89. public override Query Rewrite(IndexReader reader)
  90. {
  91. // Map to RangeFilter semantics which are slightly different...
  92. RangeFilter rangeFilt = new RangeFilter(fieldName, lowerVal != null ? lowerVal : "", upperVal, (System.Object) lowerVal == (System.Object) ""?false:includeLower, upperVal == null?false:includeUpper);
  93. Query q = new ConstantScoreQuery(rangeFilt);
  94. q.SetBoost(GetBoost());
  95. return q;
  96. }
  97. /// <summary>Prints a user-readable version of this query. </summary>
  98. public override System.String ToString(System.String field)
  99. {
  100. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  101. if (!GetField().Equals(field))
  102. {
  103. buffer.Append(GetField());
  104. buffer.Append(":");
  105. }
  106. buffer.Append(includeLower ? '[' : '{');
  107. buffer.Append(lowerVal != null ? lowerVal : "*");
  108. buffer.Append(" TO ");
  109. buffer.Append(upperVal != null ? upperVal : "*");
  110. buffer.Append(includeUpper ? ']' : '}');
  111. if (GetBoost() != 1.0f)
  112. {
  113. buffer.Append("^");
  114. buffer.Append(GetBoost().ToString());
  115. }
  116. return buffer.ToString();
  117. }
  118. /// <summary>Returns true if <code>o</code> is equal to this. </summary>
  119. public  override bool Equals(System.Object o)
  120. {
  121. if (this == o)
  122. return true;
  123. if (!(o is ConstantScoreRangeQuery))
  124. return false;
  125. ConstantScoreRangeQuery other = (ConstantScoreRangeQuery) o;
  126. if ((System.Object) this.fieldName != (System.Object) other.fieldName || this.includeLower != other.includeLower || this.includeUpper != other.includeUpper)
  127. {
  128. return false;
  129. }
  130. if (this.lowerVal != null ? !this.lowerVal.Equals(other.lowerVal) : other.lowerVal != null)
  131. return false;
  132. if (this.upperVal != null ? !this.upperVal.Equals(other.upperVal) : other.upperVal != null)
  133. return false;
  134. return this.GetBoost() == other.GetBoost();
  135. }
  136. /// <summary>Returns a hash code value for this object.</summary>
  137. public override int GetHashCode()
  138. {
  139. int h = BitConverter.ToInt32(BitConverter.GetBytes(GetBoost()), 0) ^ fieldName.GetHashCode();
  140. // hashCode of "" is 0, so don't use that for null...
  141. h ^= (lowerVal != null ? lowerVal.GetHashCode() : unchecked((int) 0x965a965a));     // {{Aroush-1.9}} Is this OK?!
  142. // don't just XOR upperVal with out mixing either it or h, as it will cancel
  143. // out lowerVal if they are equal.
  144. h ^= ((h << 17) | (SupportClass.Number.URShift(h, 16))); // a reversible (one to one) 32 bit mapping mix
  145. h ^= (upperVal != null ? (upperVal.GetHashCode()) : 0x5a695a69);
  146. h ^= (includeLower ? 0x665599aa : 0) ^ (includeUpper ? unchecked((int) 0x99aa5566) : 0);    // {{Aroush-1.9}} Is this OK?!
  147. return h;
  148. }
  149.         override public System.Object Clone()
  150. {
  151.             // {{Aroush-1.9}} is this all that we need to clone?!
  152. ConstantScoreRangeQuery clone = (ConstantScoreRangeQuery) base.Clone();
  153. clone.fieldName = (System.String) this.fieldName.Clone();
  154. clone.lowerVal = (System.String) this.lowerVal.Clone();
  155. clone.upperVal = (System.String) this.upperVal.Clone();
  156. clone.includeLower = this.includeLower;
  157. clone.includeUpper = this.includeUpper;
  158. return clone;
  159.         }
  160. }
  161. }