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

搜索引擎

开发平台:

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. namespace Lucene.Net.Search
  18. {
  19. /// <summary> Stores information about how to sort documents by terms in an individual
  20. /// field.  Fields must be indexed in order to sort by them.
  21. /// 
  22. /// <p>Created: Feb 11, 2004 1:25:29 PM
  23. /// 
  24. /// </summary>
  25. /// <author>   Tim Jones (Nacimiento Software)
  26. /// </author>
  27. /// <since>   lucene 1.4
  28. /// </since>
  29. /// <version>  $Id: SortField.java 150357 2004-05-24 22:51:42Z tjones $
  30. /// </version>
  31. /// <seealso cref="Sort">
  32. /// </seealso>
  33. [Serializable]
  34. public class SortField
  35. {
  36. /// <summary>Sort by document score (relevancy).  Sort values are Float and higher
  37. /// values are at the front. 
  38. /// </summary>
  39. public const int SCORE = 0;
  40. /// <summary>Sort by document number (index order).  Sort values are Integer and lower
  41. /// values are at the front. 
  42. /// </summary>
  43. public const int DOC = 1;
  44. /// <summary>Guess type of sort based on field contents.  A regular expression is used
  45. /// to look at the first term indexed for the field and determine if it
  46. /// represents an integer number, a floating point number, or just arbitrary
  47. /// string characters. 
  48. /// </summary>
  49. public const int AUTO = 2;
  50. /// <summary>Sort using term values as Strings.  Sort values are String and lower
  51. /// values are at the front. 
  52. /// </summary>
  53. public const int STRING = 3;
  54. /// <summary>Sort using term values as encoded Integers.  Sort values are Integer and
  55. /// lower values are at the front. 
  56. /// </summary>
  57. public const int INT = 4;
  58. /// <summary>Sort using term values as encoded Floats.  Sort values are Float and
  59. /// lower values are at the front. 
  60. /// </summary>
  61. public const int FLOAT = 5;
  62. /// <summary>Sort using a custom Comparator.  Sort values are any Comparable and
  63. /// sorting is done according to natural order. 
  64. /// </summary>
  65. public const int CUSTOM = 9;
  66. // IMPLEMENTATION NOTE: the FieldCache.STRING_INDEX is in the same "namespace"
  67. // as the above static int values.  Any new values must not have the same value
  68. // as FieldCache.STRING_INDEX.
  69. /// <summary>Represents sorting by document score (relevancy). </summary>
  70. public static readonly SortField FIELD_SCORE = new SortField(null, SCORE);
  71. /// <summary>Represents sorting by document number (index order). </summary>
  72. public static readonly SortField FIELD_DOC = new SortField(null, DOC);
  73. private System.String field;
  74. private int type = AUTO; // defaults to determining type dynamically
  75. private System.Globalization.CultureInfo locale; // defaults to "natural order" (no Locale)
  76. internal bool reverse = false; // defaults to natural order
  77. private SortComparatorSource factory;
  78. /// <summary>Creates a sort by terms in the given field where the type of term value
  79. /// is determined dynamically ({@link #AUTO AUTO}).
  80. /// </summary>
  81. /// <param name="field">Name of field to sort by, cannot be <code>null</code>.
  82. /// </param>
  83. public SortField(System.String field)
  84. {
  85. this.field = String.Intern(field);
  86. }
  87. /// <summary>Creates a sort, possibly in reverse, by terms in the given field where
  88. /// the type of term value is determined dynamically ({@link #AUTO AUTO}).
  89. /// </summary>
  90. /// <param name="field">Name of field to sort by, cannot be <code>null</code>.
  91. /// </param>
  92. /// <param name="reverse">True if natural order should be reversed.
  93. /// </param>
  94. public SortField(System.String field, bool reverse)
  95. {
  96. this.field = String.Intern(field);
  97. this.reverse = reverse;
  98. }
  99. /// <summary>Creates a sort by terms in the given field with the type of term
  100. /// values explicitly given.
  101. /// </summary>
  102. /// <param name="field"> Name of field to sort by.  Can be <code>null</code> if
  103. /// <code>type</code> is SCORE or DOC.
  104. /// </param>
  105. /// <param name="type">  Type of values in the terms.
  106. /// </param>
  107. public SortField(System.String field, int type)
  108. {
  109. this.field = (field != null)?String.Intern(field):field;
  110. this.type = type;
  111. }
  112. /// <summary>Creates a sort, possibly in reverse, by terms in the given field with the
  113. /// type of term values explicitly given.
  114. /// </summary>
  115. /// <param name="field"> Name of field to sort by.  Can be <code>null</code> if
  116. /// <code>type</code> is SCORE or DOC.
  117. /// </param>
  118. /// <param name="type">  Type of values in the terms.
  119. /// </param>
  120. /// <param name="reverse">True if natural order should be reversed.
  121. /// </param>
  122. public SortField(System.String field, int type, bool reverse)
  123. {
  124. this.field = (field != null) ? String.Intern(field) : field;
  125. this.type = type;
  126. this.reverse = reverse;
  127. }
  128. /// <summary>Creates a sort by terms in the given field sorted
  129. /// according to the given locale.
  130. /// </summary>
  131. /// <param name="field"> Name of field to sort by, cannot be <code>null</code>.
  132. /// </param>
  133. /// <param name="locale">Locale of values in the field.
  134. /// </param>
  135. public SortField(System.String field, System.Globalization.CultureInfo locale)
  136. {
  137. this.field = String.Intern(field);
  138. this.type = STRING;
  139. this.locale = locale;
  140. }
  141. /// <summary>Creates a sort, possibly in reverse, by terms in the given field sorted
  142. /// according to the given locale.
  143. /// </summary>
  144. /// <param name="field"> Name of field to sort by, cannot be <code>null</code>.
  145. /// </param>
  146. /// <param name="locale">Locale of values in the field.
  147. /// </param>
  148. public SortField(System.String field, System.Globalization.CultureInfo locale, bool reverse)
  149. {
  150. this.field = String.Intern(field);
  151. this.type = STRING;
  152. this.locale = locale;
  153. this.reverse = reverse;
  154. }
  155. /// <summary>Creates a sort with a custom comparison function.</summary>
  156. /// <param name="field">Name of field to sort by; cannot be <code>null</code>.
  157. /// </param>
  158. /// <param name="comparator">Returns a comparator for sorting hits.
  159. /// </param>
  160. public SortField(System.String field, SortComparatorSource comparator)
  161. {
  162. this.field = (field != null)?String.Intern(field):field;
  163. this.type = CUSTOM;
  164. this.factory = comparator;
  165. }
  166. /// <summary>Creates a sort, possibly in reverse, with a custom comparison function.</summary>
  167. /// <param name="field">Name of field to sort by; cannot be <code>null</code>.
  168. /// </param>
  169. /// <param name="comparator">Returns a comparator for sorting hits.
  170. /// </param>
  171. /// <param name="reverse">True if natural order should be reversed.
  172. /// </param>
  173. public SortField(System.String field, SortComparatorSource comparator, bool reverse)
  174. {
  175. this.field = (field != null)?String.Intern(field):field;
  176. this.type = CUSTOM;
  177. this.reverse = reverse;
  178. this.factory = comparator;
  179. }
  180. /// <summary>Returns the name of the field.  Could return <code>null</code>
  181. /// if the sort is by SCORE or DOC.
  182. /// </summary>
  183. /// <returns> Name of field, possibly <code>null</code>.
  184. /// </returns>
  185. public virtual System.String GetField()
  186. {
  187. return field;
  188. }
  189. /// <summary>Returns the type of contents in the field.</summary>
  190. /// <returns> One of the constants SCORE, DOC, AUTO, STRING, INT or FLOAT.
  191. /// </returns>
  192. public virtual int GetType()
  193. {
  194. return type;
  195. }
  196. /// <summary>Returns the Locale by which term values are interpreted.
  197. /// May return <code>null</code> if no Locale was specified.
  198. /// </summary>
  199. /// <returns> Locale, or <code>null</code>.
  200. /// </returns>
  201. public virtual System.Globalization.CultureInfo GetLocale()
  202. {
  203. return locale;
  204. }
  205. /// <summary>Returns whether the sort should be reversed.</summary>
  206. /// <returns>  True if natural order should be reversed.
  207. /// </returns>
  208. public virtual bool GetReverse()
  209. {
  210. return reverse;
  211. }
  212. public virtual SortComparatorSource GetFactory()
  213. {
  214. return factory;
  215. }
  216. public override System.String ToString()
  217. {
  218. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  219. switch (type)
  220. {
  221. case SCORE:  buffer.Append("<score>");
  222. break;
  223. case DOC:  buffer.Append("<doc>");
  224. break;
  225. case CUSTOM:
  226. buffer.Append("<custom:"" + field + "": " + factory + ">");
  227. break;
  228. default:  buffer.Append(""" + field + """);
  229. break;
  230. }
  231. if (locale != null)
  232. buffer.Append("(" + locale + ")");
  233. if (reverse)
  234. buffer.Append('!');
  235. return buffer.ToString();
  236. }
  237. }
  238. }