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

搜索引擎

开发平台:

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. /* Generated By:JavaCC: Do not edit this line. QueryParser.java */
  17. using System;
  18. using Lucene.Net.Analysis;
  19. using Lucene.Net.Documents;
  20. using Term = Lucene.Net.Index.Term;
  21. using Lucene.Net.Search;
  22. using Searchable = Lucene.Net.Search.Searchable;
  23. using Parameter = Lucene.Net.Util.Parameter;
  24. namespace Lucene.Net.QueryParsers
  25. {
  26. /// <summary> This class is generated by JavaCC.  The most important method is
  27. /// {@link #Parse(String)}.
  28. /// 
  29. /// The syntax for query strings is as follows:
  30. /// A Query is a series of clauses.
  31. /// A clause may be prefixed by:
  32. /// <ul>
  33. /// <li> a plus (<code>+</code>) or a minus (<code>-</code>) sign, indicating
  34. /// that the clause is required or prohibited respectively; or
  35. /// <li> a term followed by a colon, indicating the field to be searched.
  36. /// This enables one to construct queries which search multiple fields.
  37. /// </ul>
  38. /// 
  39. /// A clause may be either:
  40. /// <ul>
  41. /// <li> a term, indicating all the documents that contain this term; or
  42. /// <li> a nested query, enclosed in parentheses.  Note that this may be used
  43. /// with a <code>+</code>/<code>-</code> prefix to require any of a set of
  44. /// terms.
  45. /// </ul>
  46. /// 
  47. /// Thus, in BNF, the query grammar is:
  48. /// <pre>
  49. /// Query  ::= ( Clause )*
  50. /// Clause ::= ["+", "-"] [&lt;TERM&gt; ":"] ( &lt;TERM&gt; | "(" Query ")" )
  51. /// </pre>
  52. /// 
  53. /// <p>
  54. /// Examples of appropriately formatted queries can be found in the <a
  55. /// href="http://lucene.apache.org/java/docs/queryparsersyntax.html">query syntax
  56. /// documentation</a>.
  57. /// </p>
  58. /// 
  59. /// <p>Note that QueryParser is <em>not</em> thread-safe.</p>
  60. /// 
  61. /// </summary>
  62. /// <author>  Brian Goetz
  63. /// </author>
  64. /// <author>  Peter Halacsy
  65. /// </author>
  66. /// <author>  Tatu Saloranta
  67. /// </author>
  68. public class QueryParser : QueryParserConstants
  69. {
  70. private void  InitBlock()
  71. {
  72. fuzzyMinSim = FuzzyQuery.defaultMinSimilarity;
  73. fuzzyPrefixLength = FuzzyQuery.defaultPrefixLength;
  74. jj_2_rtns = new JJCalls[1];
  75. jj_ls = new LookaheadSuccess();
  76. }
  77. private const int CONJ_NONE = 0;
  78. private const int CONJ_AND = 1;
  79. private const int CONJ_OR = 2;
  80. private const int MOD_NONE = 0;
  81. private const int MOD_NOT = 10;
  82. private const int MOD_REQ = 11;
  83. /// <deprecated> use {@link #OR_OPERATOR} instead 
  84. /// </deprecated>
  85. public const int DEFAULT_OPERATOR_OR = 0;
  86. /// <deprecated> use {@link #AND_OPERATOR} instead 
  87. /// </deprecated>
  88. public const int DEFAULT_OPERATOR_AND = 1;
  89. // make it possible to call setDefaultOperator() without accessing 
  90. // the nested class:
  91. /// <summary>Alternative form of QueryParser.Operator.AND </summary>
  92. public static readonly Operator AND_OPERATOR = Operator.AND;
  93. /// <summary>Alternative form of QueryParser.Operator.OR </summary>
  94. public static readonly Operator OR_OPERATOR = Operator.OR;
  95. /// <summary>The actual operator that parser uses to combine query terms </summary>
  96. private Operator operator_Renamed = OR_OPERATOR;
  97. internal bool lowercaseExpandedTerms = true;
  98. internal Analyzer analyzer;
  99. internal System.String field;
  100. internal int phraseSlop = 0;
  101. internal float fuzzyMinSim;
  102. internal int fuzzyPrefixLength;
  103. internal System.Globalization.CultureInfo locale = System.Threading.Thread.CurrentThread.CurrentCulture;
  104. /// <summary>The default operator for parsing queries. 
  105. /// Use {@link QueryParser#setDefaultOperator} to change it.
  106. /// </summary>
  107. [Serializable]
  108. public sealed class Operator : Parameter
  109. {
  110. internal Operator(System.String name) : base(name)
  111. {
  112. }
  113. public static readonly Operator OR = new Operator("OR");
  114. public static readonly Operator AND = new Operator("AND");
  115. }
  116. /// <summary>Parses a query string, returning a {@link Lucene.Net.search.Query}.</summary>
  117. /// <param name="query"> the query string to be parsed.
  118. /// </param>
  119. /// <param name="field"> the default field for query terms.
  120. /// </param>
  121. /// <param name="analyzer">  used to find terms in the query text.
  122. /// </param>
  123. /// <throws>  ParseException if the parsing fails </throws>
  124. /// <summary> 
  125. /// </summary>
  126. /// <deprecated> Use an instance of QueryParser and the {@link #Parse(String)} method instead.
  127. /// </deprecated>
  128. static public Query Parse(System.String query, System.String field, Analyzer analyzer)
  129. {
  130. QueryParser parser = new QueryParser(field, analyzer);
  131. return parser.Parse(query);
  132. }
  133. /// <summary>Constructs a query parser.</summary>
  134. /// <param name="f"> the default field for query terms.
  135. /// </param>
  136. /// <param name="a">  used to find terms in the query text.
  137. /// </param>
  138. public QueryParser(System.String f, Analyzer a) : this(new FastCharStream(new System.IO.StringReader("")))
  139. {
  140. analyzer = a;
  141. field = f;
  142. }
  143. /// <summary>Parses a query string, returning a {@link Lucene.Net.search.Query}.</summary>
  144. /// <param name="query"> the query string to be parsed.
  145. /// </param>
  146. /// <throws>  ParseException if the parsing fails </throws>
  147. public virtual Query Parse(System.String query)
  148. {
  149. ReInit(new FastCharStream(new System.IO.StringReader(query)));
  150. try
  151. {
  152. return Query(field);
  153. }
  154. catch (TokenMgrError tme)
  155. {
  156. throw new ParseException(tme.Message);
  157. }
  158. catch (BooleanQuery.TooManyClauses)
  159. {
  160. throw new ParseException("Too many boolean clauses");
  161. }
  162. }
  163. /// <returns> Returns the analyzer.
  164. /// </returns>
  165. public virtual Analyzer GetAnalyzer()
  166. {
  167. return analyzer;
  168. }
  169. /// <returns> Returns the field.
  170. /// </returns>
  171. public virtual System.String GetField()
  172. {
  173. return field;
  174. }
  175. /// <summary> Get the minimal similarity for fuzzy queries.</summary>
  176. public virtual float GetFuzzyMinSim()
  177. {
  178. return fuzzyMinSim;
  179. }
  180. /// <summary> Set the minimum similarity for fuzzy queries.
  181. /// Default is 0.5f.
  182. /// </summary>
  183. public virtual void  SetFuzzyMinSim(float fuzzyMinSim)
  184. {
  185. this.fuzzyMinSim = fuzzyMinSim;
  186. }
  187. /// <summary> Get the prefix length for fuzzy queries. </summary>
  188. /// <returns> Returns the fuzzyPrefixLength.
  189. /// </returns>
  190. public virtual int GetFuzzyPrefixLength()
  191. {
  192. return fuzzyPrefixLength;
  193. }
  194. /// <summary> Set the prefix length for fuzzy queries. Default is 0.</summary>
  195. /// <param name="fuzzyPrefixLength">The fuzzyPrefixLength to set.
  196. /// </param>
  197. public virtual void  SetFuzzyPrefixLength(int fuzzyPrefixLength)
  198. {
  199. this.fuzzyPrefixLength = fuzzyPrefixLength;
  200. }
  201. /// <summary> Sets the default slop for phrases.  If zero, then exact phrase matches
  202. /// are required.  Default value is zero.
  203. /// </summary>
  204. public virtual void  SetPhraseSlop(int phraseSlop)
  205. {
  206. this.phraseSlop = phraseSlop;
  207. }
  208. /// <summary> Gets the default slop for phrases.</summary>
  209. public virtual int GetPhraseSlop()
  210. {
  211. return phraseSlop;
  212. }
  213. /// <summary> Sets the boolean operator of the QueryParser.
  214. /// In default mode (<code>DEFAULT_OPERATOR_OR</code>) terms without any modifiers
  215. /// are considered optional: for example <code>capital of Hungary</code> is equal to
  216. /// <code>capital OR of OR Hungary</code>.<br/>
  217. /// In <code>DEFAULT_OPERATOR_AND</code> terms are considered to be in conjuction: the
  218. /// above mentioned query is parsed as <code>capital AND of AND Hungary</code>
  219. /// </summary>
  220. /// <deprecated> use {@link #SetDefaultOperator(QueryParser.Operator)} instead
  221. /// </deprecated>
  222. public virtual void  SetOperator(int op)
  223. {
  224. if (op == DEFAULT_OPERATOR_AND)
  225. this.operator_Renamed = AND_OPERATOR;
  226. else if (op == DEFAULT_OPERATOR_OR)
  227. this.operator_Renamed = OR_OPERATOR;
  228. else
  229. throw new System.ArgumentException("Unknown operator " + op);
  230. }
  231. /// <summary> Sets the boolean operator of the QueryParser.
  232. /// In default mode (<code>OR_OPERATOR</code>) terms without any modifiers
  233. /// are considered optional: for example <code>capital of Hungary</code> is equal to
  234. /// <code>capital OR of OR Hungary</code>.<br/>
  235. /// In <code>AND_OPERATOR</code> mode terms are considered to be in conjuction: the
  236. /// above mentioned query is parsed as <code>capital AND of AND Hungary</code>
  237. /// </summary>
  238. public virtual void  SetDefaultOperator(Operator op)
  239. {
  240. this.operator_Renamed = op;
  241. }
  242. /// <summary> Gets implicit operator setting, which will be either DEFAULT_OPERATOR_AND
  243. /// or DEFAULT_OPERATOR_OR.
  244. /// </summary>
  245. /// <deprecated> use {@link #GetDefaultOperator()} instead
  246. /// </deprecated>
  247. public virtual int GetOperator()
  248. {
  249. if (operator_Renamed == AND_OPERATOR)
  250. return DEFAULT_OPERATOR_AND;
  251. else if (operator_Renamed == OR_OPERATOR)
  252. return DEFAULT_OPERATOR_OR;
  253. else
  254. {
  255. throw new System.SystemException("Unknown operator " + operator_Renamed);
  256. }
  257. }
  258. /// <summary> Gets implicit operator setting, which will be either AND_OPERATOR
  259. /// or OR_OPERATOR.
  260. /// </summary>
  261. public virtual Operator GetDefaultOperator()
  262. {
  263. return operator_Renamed;
  264. }
  265. /// <summary> Whether terms of wildcard, prefix, fuzzy and range queries are to be automatically
  266. /// lower-cased or not.  Default is <code>true</code>.
  267. /// </summary>
  268. /// <deprecated> use {@link #SetLowercaseExpandedTerms(boolean)} instead
  269. /// </deprecated>
  270. public virtual void  SetLowercaseWildcardTerms(bool lowercaseExpandedTerms)
  271. {
  272. this.lowercaseExpandedTerms = lowercaseExpandedTerms;
  273. }
  274. /// <summary> Whether terms of wildcard, prefix, fuzzy and range queries are to be automatically
  275. /// lower-cased or not.  Default is <code>true</code>.
  276. /// </summary>
  277. public virtual void  SetLowercaseExpandedTerms(bool lowercaseExpandedTerms)
  278. {
  279. this.lowercaseExpandedTerms = lowercaseExpandedTerms;
  280. }
  281. /// <deprecated> use {@link #GetLowercaseExpandedTerms()} instead
  282. /// </deprecated>
  283. public virtual bool GetLowercaseWildcardTerms()
  284. {
  285. return lowercaseExpandedTerms;
  286. }
  287. /// <seealso cref="SetLowercaseExpandedTerms(boolean)">
  288. /// </seealso>
  289. public virtual bool GetLowercaseExpandedTerms()
  290. {
  291. return lowercaseExpandedTerms;
  292. }
  293. /// <summary> Set locale used by date range parsing.</summary>
  294. public virtual void  SetLocale(System.Globalization.CultureInfo locale)
  295. {
  296. this.locale = locale;
  297. }
  298. /// <summary> Returns current locale, allowing access by subclasses.</summary>
  299. public virtual System.Globalization.CultureInfo GetLocale()
  300. {
  301. return locale;
  302. }
  303. protected internal virtual void  AddClause(System.Collections.ArrayList clauses, int conj, int mods, Query q)
  304. {
  305. bool required, prohibited;
  306. // If this term is introduced by AND, make the preceding term required,
  307. // unless it's already prohibited
  308. if (clauses.Count > 0 && conj == CONJ_AND)
  309. {
  310. BooleanClause c = (BooleanClause) clauses[clauses.Count - 1];
  311. if (!c.IsProhibited())
  312. c.SetOccur(BooleanClause.Occur.MUST);
  313. }
  314. if (clauses.Count > 0 && operator_Renamed == AND_OPERATOR && conj == CONJ_OR)
  315. {
  316. // If this term is introduced by OR, make the preceding term optional,
  317. // unless it's prohibited (that means we leave -a OR b but +a OR b-->a OR b)
  318. // notice if the input is a OR b, first term is parsed as required; without
  319. // this modification a OR b would parsed as +a OR b
  320. BooleanClause c = (BooleanClause) clauses[clauses.Count - 1];
  321. if (!c.IsProhibited())
  322. c.SetOccur(BooleanClause.Occur.SHOULD);
  323. }
  324. // We might have been passed a null query; the term might have been
  325. // filtered away by the analyzer.
  326. if (q == null)
  327. return ;
  328. if (operator_Renamed == OR_OPERATOR)
  329. {
  330. // We set REQUIRED if we're introduced by AND or +; PROHIBITED if
  331. // introduced by NOT or -; make sure not to set both.
  332. prohibited = (mods == MOD_NOT);
  333. required = (mods == MOD_REQ);
  334. if (conj == CONJ_AND && !prohibited)
  335. {
  336. required = true;
  337. }
  338. }
  339. else
  340. {
  341. // We set PROHIBITED if we're introduced by NOT or -; We set REQUIRED
  342. // if not PROHIBITED and not introduced by OR
  343. prohibited = (mods == MOD_NOT);
  344. required = (!prohibited && conj != CONJ_OR);
  345. }
  346. if (required && !prohibited)
  347. clauses.Add(new BooleanClause(q, BooleanClause.Occur.MUST));
  348. else if (!required && !prohibited)
  349. clauses.Add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
  350. else if (!required && prohibited)
  351. clauses.Add(new BooleanClause(q, BooleanClause.Occur.MUST_NOT));
  352. else
  353. throw new System.SystemException("Clause cannot be both required and prohibited");
  354. }
  355. /// <summary> Note that parameter analyzer is ignored. Calls inside the parser always
  356. /// use class member analyzer.
  357. /// 
  358. /// </summary>
  359. /// <exception cref="ParseException">throw in overridden method to disallow
  360. /// </exception>
  361. /// <deprecated> use {@link #GetFieldQuery(String, String)}
  362. /// </deprecated>
  363. protected internal virtual Query GetFieldQuery(System.String field, Analyzer analyzer, System.String queryText)
  364. {
  365. return GetFieldQuery(field, queryText);
  366. }
  367. /// <exception cref="ParseException">throw in overridden method to disallow
  368. /// </exception>
  369. protected internal virtual Query GetFieldQuery(System.String field, System.String queryText)
  370. {
  371. // Use the analyzer to get all the tokens, and then build a TermQuery,
  372. // PhraseQuery, or nothing based on the term count
  373. TokenStream source = analyzer.TokenStream(field, new System.IO.StringReader(queryText));
  374. System.Collections.ArrayList v = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10));
  375. Lucene.Net.Analysis.Token t;
  376. int positionCount = 0;
  377. bool severalTokensAtSamePosition = false;
  378. while (true)
  379. {
  380. try
  381. {
  382. t = source.Next();
  383. }
  384. catch (System.IO.IOException e)
  385. {
  386. t = null;
  387. }
  388. if (t == null)
  389. break;
  390. v.Add(t);
  391. if (t.GetPositionIncrement() != 0)
  392. positionCount += t.GetPositionIncrement();
  393. else
  394. severalTokensAtSamePosition = true;
  395. }
  396. try
  397. {
  398. source.Close();
  399. }
  400. catch (System.IO.IOException e)
  401. {
  402. // ignore
  403. }
  404. if (v.Count == 0)
  405. return null;
  406. else if (v.Count == 1)
  407. {
  408. t = (Lucene.Net.Analysis.Token) v[0];
  409. return new TermQuery(new Term(field, t.TermText()));
  410. }
  411. else
  412. {
  413. if (severalTokensAtSamePosition)
  414. {
  415. if (positionCount == 1)
  416. {
  417. // no phrase query:
  418. BooleanQuery q = new BooleanQuery(true);
  419. for (int i = 0; i < v.Count; i++)
  420. {
  421. t = (Lucene.Net.Analysis.Token) v[i];
  422. TermQuery currentQuery = new TermQuery(new Term(field, t.TermText()));
  423. q.Add(currentQuery, BooleanClause.Occur.SHOULD);
  424. }
  425. return q;
  426. }
  427. else
  428. {
  429. // phrase query:
  430. MultiPhraseQuery mpq = new MultiPhraseQuery();
  431. System.Collections.ArrayList multiTerms = new System.Collections.ArrayList();
  432. for (int i = 0; i < v.Count; i++)
  433. {
  434. t = (Lucene.Net.Analysis.Token) v[i];
  435. if (t.GetPositionIncrement() == 1 && multiTerms.Count > 0)
  436. {
  437. mpq.Add((Term[]) multiTerms.ToArray(typeof(Term)));
  438. multiTerms.Clear();
  439. }
  440. multiTerms.Add(new Term(field, t.TermText()));
  441. }
  442. mpq.Add((Term[]) multiTerms.ToArray(typeof(Term)));
  443. return mpq;
  444. }
  445. }
  446. else
  447. {
  448. PhraseQuery q = new PhraseQuery();
  449. q.SetSlop(phraseSlop);
  450. for (int i = 0; i < v.Count; i++)
  451. {
  452. q.Add(new Term(field, ((Lucene.Net.Analysis.Token) v[i]).TermText()));
  453. }
  454. return q;
  455. }
  456. }
  457. }
  458. /// <summary> Note that parameter analyzer is ignored. Calls inside the parser always
  459. /// use class member analyzer.
  460. /// 
  461. /// </summary>
  462. /// <exception cref="ParseException">throw in overridden method to disallow
  463. /// </exception>
  464. /// <deprecated> use {@link #GetFieldQuery(String, String, int)}
  465. /// </deprecated>
  466. protected internal virtual Query GetFieldQuery(System.String field, Analyzer analyzer, System.String queryText, int slop)
  467. {
  468. return GetFieldQuery(field, queryText, slop);
  469. }
  470. /// <summary> Base implementation delegates to {@link #GetFieldQuery(String,String)}.
  471. /// This method may be overridden, for example, to return
  472. /// a SpanNearQuery instead of a PhraseQuery.
  473. /// 
  474. /// </summary>
  475. /// <exception cref="ParseException">throw in overridden method to disallow
  476. /// </exception>
  477. protected internal virtual Query GetFieldQuery(System.String field, System.String queryText, int slop)
  478. {
  479. Query query = GetFieldQuery(field, queryText);
  480. if (query is PhraseQuery)
  481. {
  482. ((PhraseQuery) query).SetSlop(slop);
  483. }
  484. if (query is MultiPhraseQuery)
  485. {
  486. ((MultiPhraseQuery) query).SetSlop(slop);
  487. }
  488. return query;
  489. }
  490. /// <summary> Note that parameter analyzer is ignored. Calls inside the parser always
  491. /// use class member analyzer.
  492. /// 
  493. /// </summary>
  494. /// <exception cref="ParseException">throw in overridden method to disallow
  495. /// </exception>
  496. /// <deprecated> use {@link #GetRangeQuery(String, String, String, boolean)}
  497. /// </deprecated>
  498. protected internal virtual Query GetRangeQuery(System.String field, Analyzer analyzer, System.String part1, System.String part2, bool inclusive)
  499. {
  500. return GetRangeQuery(field, part1, part2, inclusive);
  501. }
  502. /// <exception cref="ParseException">throw in overridden method to disallow
  503. /// </exception>
  504. protected internal virtual Query GetRangeQuery(System.String field, System.String part1, System.String part2, bool inclusive)
  505. {
  506. if (lowercaseExpandedTerms)
  507. {
  508. part1 = part1.ToLower();
  509. part2 = part2.ToLower();
  510. }
  511. try
  512. {
  513.                 System.DateTime d1 = System.DateTime.Parse(part1, locale);
  514.                 System.DateTime d2 = System.DateTime.Parse(part2, locale);
  515.                 part1 = DateField.DateToString(d1);
  516.                 part2 = DateField.DateToString(d2);
  517.             }
  518. catch (System.Exception e)
  519. {
  520. }
  521. return new RangeQuery(new Term(field, part1), new Term(field, part2), inclusive);
  522. }
  523. /// <summary> Factory method for generating query, given a set of clauses.
  524. /// By default creates a boolean query composed of clauses passed in.
  525. /// 
  526. /// Can be overridden by extending classes, to modify query being
  527. /// returned.
  528. /// 
  529. /// </summary>
  530. /// <param name="clauses">Vector that contains {@link BooleanClause} instances
  531. /// to join.
  532. /// 
  533. /// </param>
  534. /// <returns> Resulting {@link Query} object.
  535. /// </returns>
  536. /// <exception cref="ParseException">throw in overridden method to disallow
  537. /// </exception>
  538. protected internal virtual Query GetBooleanQuery(System.Collections.ArrayList clauses)
  539. {
  540. return GetBooleanQuery(clauses, false);
  541. }
  542. /// <summary> Factory method for generating query, given a set of clauses.
  543. /// By default creates a boolean query composed of clauses passed in.
  544. /// 
  545. /// Can be overridden by extending classes, to modify query being
  546. /// returned.
  547. /// 
  548. /// </summary>
  549. /// <param name="clauses">Vector that contains {@link BooleanClause} instances
  550. /// to join.
  551. /// </param>
  552. /// <param name="disableCoord">true if coord scoring should be disabled.
  553. /// 
  554. /// </param>
  555. /// <returns> Resulting {@link Query} object.
  556. /// </returns>
  557. /// <exception cref="ParseException">throw in overridden method to disallow
  558. /// </exception>
  559. protected internal virtual Query GetBooleanQuery(System.Collections.ArrayList clauses, bool disableCoord)
  560. {
  561. BooleanQuery query = new BooleanQuery(disableCoord);
  562. for (int i = 0; i < clauses.Count; i++)
  563. {
  564. query.Add((BooleanClause) clauses[i]);
  565. }
  566. return query;
  567. }
  568. /// <summary> Factory method for generating a query. Called when parser
  569. /// parses an input term token that contains one or more wildcard
  570. /// characters (? and *), but is not a prefix term token (one
  571. /// that has just a single * character at the end)
  572. /// <p>
  573. /// Depending on settings, prefix term may be lower-cased
  574. /// automatically. It will not go through the default Analyzer,
  575. /// however, since normal Analyzers are unlikely to work properly
  576. /// with wildcard templates.
  577. /// <p>
  578. /// Can be overridden by extending classes, to provide custom handling for
  579. /// wildcard queries, which may be necessary due to missing analyzer calls.
  580. /// 
  581. /// </summary>
  582. /// <param name="field">Name of the field query will use.
  583. /// </param>
  584. /// <param name="termStr">Term token that contains one or more wild card
  585. /// characters (? or *), but is not simple prefix term
  586. /// 
  587. /// </param>
  588. /// <returns> Resulting {@link Query} built for the term
  589. /// </returns>
  590. /// <exception cref="ParseException">throw in overridden method to disallow
  591. /// </exception>
  592. protected internal virtual Query GetWildcardQuery(System.String field, System.String termStr)
  593. {
  594. if (lowercaseExpandedTerms)
  595. {
  596. termStr = termStr.ToLower();
  597. }
  598. Term t = new Term(field, termStr);
  599. return new WildcardQuery(t);
  600. }
  601. /// <summary> Factory method for generating a query (similar to
  602. /// {@link #getWildcardQuery}). Called when parser parses an input term
  603. /// token that uses prefix notation; that is, contains a single '*' wildcard
  604. /// character as its last character. Since this is a special case
  605. /// of generic wildcard term, and such a query can be optimized easily,
  606. /// this usually results in a different query object.
  607. /// <p>
  608. /// Depending on settings, a prefix term may be lower-cased
  609. /// automatically. It will not go through the default Analyzer,
  610. /// however, since normal Analyzers are unlikely to work properly
  611. /// with wildcard templates.
  612. /// <p>
  613. /// Can be overridden by extending classes, to provide custom handling for
  614. /// wild card queries, which may be necessary due to missing analyzer calls.
  615. /// 
  616. /// </summary>
  617. /// <param name="field">Name of the field query will use.
  618. /// </param>
  619. /// <param name="termStr">Term token to use for building term for the query
  620. /// (<b>without</b> trailing '*' character!)
  621. /// 
  622. /// </param>
  623. /// <returns> Resulting {@link Query} built for the term
  624. /// </returns>
  625. /// <exception cref="ParseException">throw in overridden method to disallow
  626. /// </exception>
  627. protected internal virtual Query GetPrefixQuery(System.String field, System.String termStr)
  628. {
  629. if (lowercaseExpandedTerms)
  630. {
  631. termStr = termStr.ToLower();
  632. }
  633. Term t = new Term(field, termStr);
  634. return new PrefixQuery(t);
  635. }
  636. /// <deprecated> use {@link #GetFuzzyQuery(String, String, float)}
  637. /// </deprecated>
  638. protected internal virtual Query GetFuzzyQuery(System.String field, System.String termStr)
  639. {
  640. return GetFuzzyQuery(field, termStr, fuzzyMinSim);
  641. }
  642. /// <summary> Factory method for generating a query (similar to
  643. /// {@link #getWildcardQuery}). Called when parser parses
  644. /// an input term token that has the fuzzy suffix (~) appended.
  645. /// 
  646. /// </summary>
  647. /// <param name="field">Name of the field query will use.
  648. /// </param>
  649. /// <param name="termStr">Term token to use for building term for the query
  650. /// 
  651. /// </param>
  652. /// <returns> Resulting {@link Query} built for the term
  653. /// </returns>
  654. /// <exception cref="ParseException">throw in overridden method to disallow
  655. /// </exception>
  656. protected internal virtual Query GetFuzzyQuery(System.String field, System.String termStr, float minSimilarity)
  657. {
  658. if (lowercaseExpandedTerms)
  659. {
  660. termStr = termStr.ToLower();
  661. }
  662. Term t = new Term(field, termStr);
  663. return new FuzzyQuery(t, minSimilarity, fuzzyPrefixLength);
  664. }
  665. /// <summary> Returns a String where the escape char has been
  666. /// removed, or kept only once if there was a double escape.
  667. /// </summary>
  668. private System.String DiscardEscapeChar(System.String input)
  669. {
  670. char[] caSource = input.ToCharArray();
  671. char[] caDest = new char[caSource.Length];
  672. int j = 0;
  673. for (int i = 0; i < caSource.Length; i++)
  674. {
  675. if ((caSource[i] != '\') || (i > 0 && caSource[i - 1] == '\'))
  676. {
  677. caDest[j++] = caSource[i];
  678. }
  679. }
  680. return new System.String(caDest, 0, j);
  681. }
  682. /// <summary> Returns a String where those characters that QueryParser
  683. /// expects to be escaped are escaped by a preceding <code></code>.
  684. /// </summary>
  685. public static System.String Escape(System.String s)
  686. {
  687. System.Text.StringBuilder sb = new System.Text.StringBuilder();
  688. for (int i = 0; i < s.Length; i++)
  689. {
  690. char c = s[i];
  691. // NOTE: keep this in sync with _ESCAPED_CHAR below!
  692. if (c == '\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':' || c == '^' || c == '[' || c == ']' || c == '"' || c == '{' || c == '}' || c == '~' || c == '*' || c == '?')
  693. {
  694. sb.Append('\');
  695. }
  696. sb.Append(c);
  697. }
  698. return sb.ToString();
  699. }
  700. /// <summary> Command line tool to test QueryParser, using {@link Lucene.Net.analysis.SimpleAnalyzer}.
  701. /// Usage:<br>
  702. /// <code>java Lucene.Net.queryParser.QueryParser &lt;input&gt;</code>
  703. /// </summary>
  704. [STAThread]
  705. public static void  Main(System.String[] args)
  706. {
  707. if (args.Length == 0)
  708. {
  709. System.Console.Out.WriteLine("Usage: java Lucene.Net.queryParser.QueryParser <input>");
  710. System.Environment.Exit(0);
  711. }
  712. QueryParser qp = new QueryParser("field", new Lucene.Net.Analysis.SimpleAnalyzer());
  713. Query q = qp.Parse(args[0]);
  714. System.Console.Out.WriteLine(q.ToString("field"));
  715. }
  716. // *   Query  ::= ( Clause )*
  717. // *   Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" )
  718. public int Conjunction()
  719. {
  720. int ret = CONJ_NONE;
  721. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  722. {
  723. case Lucene.Net.QueryParsers.QueryParserConstants.AND: 
  724. case Lucene.Net.QueryParsers.QueryParserConstants.OR: 
  725. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  726. {
  727. case Lucene.Net.QueryParsers.QueryParserConstants.AND: 
  728. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.AND);
  729. ret = CONJ_AND;
  730. break;
  731. case Lucene.Net.QueryParsers.QueryParserConstants.OR: 
  732. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.OR);
  733. ret = CONJ_OR;
  734. break;
  735. default: 
  736. jj_la1[0] = jj_gen;
  737. Jj_consume_token(- 1);
  738. throw new ParseException();
  739. }
  740. break;
  741. default: 
  742. jj_la1[1] = jj_gen;
  743. ;
  744. break;
  745. }
  746. {
  747. if (true)
  748. return ret;
  749. }
  750. throw new System.ApplicationException("Missing return statement in function");
  751. }
  752. public int Modifiers()
  753. {
  754. int ret = MOD_NONE;
  755. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  756. {
  757. case Lucene.Net.QueryParsers.QueryParserConstants.NOT: 
  758. case Lucene.Net.QueryParsers.QueryParserConstants.PLUS: 
  759. case Lucene.Net.QueryParsers.QueryParserConstants.MINUS: 
  760. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  761. {
  762. case Lucene.Net.QueryParsers.QueryParserConstants.PLUS: 
  763. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.PLUS);
  764. ret = MOD_REQ;
  765. break;
  766. case Lucene.Net.QueryParsers.QueryParserConstants.MINUS: 
  767. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.MINUS);
  768. ret = MOD_NOT;
  769. break;
  770. case Lucene.Net.QueryParsers.QueryParserConstants.NOT: 
  771. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NOT);
  772. ret = MOD_NOT;
  773. break;
  774. default: 
  775. jj_la1[2] = jj_gen;
  776. Jj_consume_token(- 1);
  777. throw new ParseException();
  778. }
  779. break;
  780. default: 
  781. jj_la1[3] = jj_gen;
  782. ;
  783. break;
  784. }
  785. {
  786. if (true)
  787. return ret;
  788. }
  789. throw new System.ApplicationException("Missing return statement in function");
  790. }
  791. public Query Query(System.String field)
  792. {
  793. System.Collections.ArrayList clauses = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10));
  794. Query q, firstQuery = null;
  795. int conj, mods;
  796. mods = Modifiers();
  797. q = Clause(field);
  798. AddClause(clauses, CONJ_NONE, mods, q);
  799. if (mods == MOD_NONE)
  800. firstQuery = q;
  801. while (true)
  802. {
  803. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  804. {
  805. case Lucene.Net.QueryParsers.QueryParserConstants.AND: 
  806. case Lucene.Net.QueryParsers.QueryParserConstants.OR: 
  807. case Lucene.Net.QueryParsers.QueryParserConstants.NOT: 
  808. case Lucene.Net.QueryParsers.QueryParserConstants.PLUS: 
  809. case Lucene.Net.QueryParsers.QueryParserConstants.MINUS: 
  810. case Lucene.Net.QueryParsers.QueryParserConstants.LPAREN: 
  811. case Lucene.Net.QueryParsers.QueryParserConstants.QUOTED: 
  812. case Lucene.Net.QueryParsers.QueryParserConstants.TERM: 
  813. case Lucene.Net.QueryParsers.QueryParserConstants.PREFIXTERM: 
  814. case Lucene.Net.QueryParsers.QueryParserConstants.WILDTERM: 
  815. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_START: 
  816. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_START: 
  817. case Lucene.Net.QueryParsers.QueryParserConstants.NUMBER: 
  818. ;
  819. break;
  820. default: 
  821. jj_la1[4] = jj_gen;
  822. goto label_1_brk;
  823. }
  824. conj = Conjunction();
  825. mods = Modifiers();
  826. q = Clause(field);
  827. AddClause(clauses, conj, mods, q);
  828. }
  829. label_1_brk: ;
  830. if (clauses.Count == 1 && firstQuery != null)
  831. {
  832. if (true)
  833. return firstQuery;
  834. }
  835. else
  836. {
  837. {
  838. if (true)
  839. return GetBooleanQuery(clauses);
  840. }
  841. }
  842. throw new System.ApplicationException("Missing return statement in function");
  843. }
  844. public Query Clause(System.String field)
  845. {
  846. Query q;
  847. Token fieldToken = null, boost = null;
  848. if (Jj_2_1(2))
  849. {
  850. fieldToken = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.TERM);
  851. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.COLON);
  852. field = DiscardEscapeChar(fieldToken.image);
  853. }
  854. else
  855. {
  856. ;
  857. }
  858. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  859. {
  860. case Lucene.Net.QueryParsers.QueryParserConstants.QUOTED: 
  861. case Lucene.Net.QueryParsers.QueryParserConstants.TERM: 
  862. case Lucene.Net.QueryParsers.QueryParserConstants.PREFIXTERM: 
  863. case Lucene.Net.QueryParsers.QueryParserConstants.WILDTERM: 
  864. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_START: 
  865. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_START: 
  866. case Lucene.Net.QueryParsers.QueryParserConstants.NUMBER: 
  867. q = Term(field);
  868. break;
  869. case Lucene.Net.QueryParsers.QueryParserConstants.LPAREN: 
  870. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.LPAREN);
  871. q = Query(field);
  872. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RPAREN);
  873. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  874. {
  875. case Lucene.Net.QueryParsers.QueryParserConstants.CARAT: 
  876. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.CARAT);
  877. boost = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  878. break;
  879. default: 
  880. jj_la1[5] = jj_gen;
  881. ;
  882. break;
  883. }
  884. break;
  885. default: 
  886. jj_la1[6] = jj_gen;
  887. Jj_consume_token(- 1);
  888. throw new ParseException();
  889. }
  890. if (boost != null)
  891. {
  892. float f = (float) 1.0;
  893. try
  894. {
  895. f = (float) System.Single.Parse(boost.image);
  896. q.SetBoost(f);
  897. }
  898. catch (System.Exception ignored)
  899. {
  900. }
  901. }
  902. {
  903. if (true)
  904. return q;
  905. }
  906. throw new System.ApplicationException("Missing return statement in function");
  907. }
  908. public Query Term(System.String field)
  909. {
  910. Token term, boost = null, fuzzySlop = null, goop1, goop2;
  911. bool prefix = false;
  912. bool wildcard = false;
  913. bool fuzzy = false;
  914. bool rangein = false;
  915. Query q;
  916. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  917. {
  918. case Lucene.Net.QueryParsers.QueryParserConstants.TERM: 
  919. case Lucene.Net.QueryParsers.QueryParserConstants.PREFIXTERM: 
  920. case Lucene.Net.QueryParsers.QueryParserConstants.WILDTERM: 
  921. case Lucene.Net.QueryParsers.QueryParserConstants.NUMBER: 
  922. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  923. {
  924. case Lucene.Net.QueryParsers.QueryParserConstants.TERM: 
  925. term = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.TERM);
  926. break;
  927. case Lucene.Net.QueryParsers.QueryParserConstants.PREFIXTERM: 
  928. term = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.PREFIXTERM);
  929. prefix = true;
  930. break;
  931. case Lucene.Net.QueryParsers.QueryParserConstants.WILDTERM: 
  932. term = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.WILDTERM);
  933. wildcard = true;
  934. break;
  935. case Lucene.Net.QueryParsers.QueryParserConstants.NUMBER: 
  936. term = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  937. break;
  938. default: 
  939. jj_la1[7] = jj_gen;
  940. Jj_consume_token(- 1);
  941. throw new ParseException();
  942. }
  943. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  944. {
  945. case Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP: 
  946. fuzzySlop = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP);
  947. fuzzy = true;
  948. break;
  949. default: 
  950. jj_la1[8] = jj_gen;
  951. ;
  952. break;
  953. }
  954. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  955. {
  956. case Lucene.Net.QueryParsers.QueryParserConstants.CARAT: 
  957. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.CARAT);
  958. boost = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  959. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  960. {
  961. case Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP: 
  962. fuzzySlop = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP);
  963. fuzzy = true;
  964. break;
  965. default: 
  966. jj_la1[9] = jj_gen;
  967. ;
  968. break;
  969. }
  970. break;
  971. default: 
  972. jj_la1[10] = jj_gen;
  973. ;
  974. break;
  975. }
  976. System.String termImage = DiscardEscapeChar(term.image);
  977. if (wildcard)
  978. {
  979. q = GetWildcardQuery(field, termImage);
  980. }
  981. else if (prefix)
  982. {
  983. q = GetPrefixQuery(field, DiscardEscapeChar(term.image.Substring(0, (term.image.Length - 1) - (0))));
  984. }
  985. else if (fuzzy)
  986. {
  987. float fms = fuzzyMinSim;
  988. try
  989. {
  990. fms = (float) System.Single.Parse(fuzzySlop.image.Substring(1));
  991. }
  992. catch (System.Exception ignored)
  993. {
  994. }
  995. if (fms < 0.0f || fms > 1.0f)
  996. {
  997. {
  998. if (true)
  999. throw new ParseException("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !");
  1000. }
  1001. }
  1002. if (fms == fuzzyMinSim)
  1003. q = GetFuzzyQuery(field, termImage);
  1004. else
  1005. q = GetFuzzyQuery(field, termImage, fms);
  1006. }
  1007. else
  1008. {
  1009. q = GetFieldQuery(field, analyzer, termImage);
  1010. }
  1011. break;
  1012. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_START: 
  1013. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_START);
  1014. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1015. {
  1016. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_GOOP: 
  1017. goop1 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_GOOP);
  1018. break;
  1019. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED: 
  1020. goop1 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED);
  1021. break;
  1022. default: 
  1023. jj_la1[11] = jj_gen;
  1024. Jj_consume_token(- 1);
  1025. throw new ParseException();
  1026. }
  1027. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1028. {
  1029. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_TO: 
  1030. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_TO);
  1031. break;
  1032. default: 
  1033. jj_la1[12] = jj_gen;
  1034. ;
  1035. break;
  1036. }
  1037. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1038. {
  1039. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_GOOP: 
  1040. goop2 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_GOOP);
  1041. break;
  1042. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED: 
  1043. goop2 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED);
  1044. break;
  1045. default: 
  1046. jj_la1[13] = jj_gen;
  1047. Jj_consume_token(- 1);
  1048. throw new ParseException();
  1049. }
  1050. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_END);
  1051. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1052. {
  1053. case Lucene.Net.QueryParsers.QueryParserConstants.CARAT: 
  1054. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.CARAT);
  1055. boost = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  1056. break;
  1057. default: 
  1058. jj_la1[14] = jj_gen;
  1059. ;
  1060. break;
  1061. }
  1062. if (goop1.kind == Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED)
  1063. {
  1064. goop1.image = goop1.image.Substring(1, (goop1.image.Length - 1) - (1));
  1065. }
  1066. else
  1067. {
  1068. goop1.image = DiscardEscapeChar(goop1.image);
  1069. }
  1070. if (goop2.kind == Lucene.Net.QueryParsers.QueryParserConstants.RANGEIN_QUOTED)
  1071. {
  1072. goop2.image = goop2.image.Substring(1, (goop2.image.Length - 1) - (1));
  1073. }
  1074. else
  1075. {
  1076. goop2.image = DiscardEscapeChar(goop2.image);
  1077. }
  1078. q = GetRangeQuery(field, analyzer, goop1.image, goop2.image, true);
  1079. break;
  1080. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_START: 
  1081. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_START);
  1082. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1083. {
  1084. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_GOOP: 
  1085. goop1 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_GOOP);
  1086. break;
  1087. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED: 
  1088. goop1 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED);
  1089. break;
  1090. default: 
  1091. jj_la1[15] = jj_gen;
  1092. Jj_consume_token(- 1);
  1093. throw new ParseException();
  1094. }
  1095. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1096. {
  1097. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_TO: 
  1098. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_TO);
  1099. break;
  1100. default: 
  1101. jj_la1[16] = jj_gen;
  1102. ;
  1103. break;
  1104. }
  1105. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1106. {
  1107. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_GOOP: 
  1108. goop2 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_GOOP);
  1109. break;
  1110. case Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED: 
  1111. goop2 = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED);
  1112. break;
  1113. default: 
  1114. jj_la1[17] = jj_gen;
  1115. Jj_consume_token(- 1);
  1116. throw new ParseException();
  1117. }
  1118. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_END);
  1119. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1120. {
  1121. case Lucene.Net.QueryParsers.QueryParserConstants.CARAT: 
  1122. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.CARAT);
  1123. boost = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  1124. break;
  1125. default: 
  1126. jj_la1[18] = jj_gen;
  1127. ;
  1128. break;
  1129. }
  1130. if (goop1.kind == Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED)
  1131. {
  1132. goop1.image = goop1.image.Substring(1, (goop1.image.Length - 1) - (1));
  1133. }
  1134. else
  1135. {
  1136. goop1.image = DiscardEscapeChar(goop1.image);
  1137. }
  1138. if (goop2.kind == Lucene.Net.QueryParsers.QueryParserConstants.RANGEEX_QUOTED)
  1139. {
  1140. goop2.image = goop2.image.Substring(1, (goop2.image.Length - 1) - (1));
  1141. }
  1142. else
  1143. {
  1144. goop2.image = DiscardEscapeChar(goop2.image);
  1145. }
  1146. q = GetRangeQuery(field, analyzer, goop1.image, goop2.image, false);
  1147. break;
  1148. case Lucene.Net.QueryParsers.QueryParserConstants.QUOTED: 
  1149. term = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.QUOTED);
  1150. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1151. {
  1152. case Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP: 
  1153. fuzzySlop = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.FUZZY_SLOP);
  1154. break;
  1155. default: 
  1156. jj_la1[19] = jj_gen;
  1157. ;
  1158. break;
  1159. }
  1160. switch ((jj_ntk == - 1) ? Jj_ntk() : jj_ntk)
  1161. {
  1162. case Lucene.Net.QueryParsers.QueryParserConstants.CARAT: 
  1163. Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.CARAT);
  1164. boost = Jj_consume_token(Lucene.Net.QueryParsers.QueryParserConstants.NUMBER);
  1165. break;
  1166. default: 
  1167. jj_la1[20] = jj_gen;
  1168. ;
  1169. break;
  1170. }
  1171. int s = phraseSlop;
  1172. if (fuzzySlop != null)
  1173. {
  1174. try
  1175. {
  1176. s = (int) System.Single.Parse(fuzzySlop.image.Substring(1));
  1177. }
  1178. catch (System.Exception ignored)
  1179. {
  1180. }
  1181. }
  1182. q = GetFieldQuery(field, analyzer, term.image.Substring(1, (term.image.Length - 1) - (1)), s);
  1183. break;
  1184. default: 
  1185. jj_la1[21] = jj_gen;
  1186. Jj_consume_token(- 1);
  1187. throw new ParseException();
  1188. }
  1189. if (boost != null)
  1190. {
  1191. float f = (float) 1.0;
  1192. try
  1193. {
  1194. f = (float) System.Single.Parse(boost.image);
  1195. }
  1196. catch (System.Exception ignored)
  1197. {
  1198. /* Should this be handled somehow? (defaults to "no boost", if
  1199. * boost number is invalid)
  1200. */
  1201. }
  1202. // avoid boosting null queries, such as those caused by stop words
  1203. if (q != null)
  1204. {
  1205. q.SetBoost(f);
  1206. }
  1207. }
  1208. {
  1209. if (true)
  1210. return q;
  1211. }
  1212. throw new System.ApplicationException("Missing return statement in function");
  1213. }
  1214. private bool Jj_2_1(int xla)
  1215. {
  1216. jj_la = xla; jj_lastpos = jj_scanpos = token;
  1217. try
  1218. {
  1219. return !Jj_3_1();
  1220. }
  1221. catch (LookaheadSuccess ls)
  1222. {
  1223. return true;
  1224. }
  1225. finally
  1226. {
  1227. Jj_save(0, xla);
  1228. }
  1229. }
  1230. private bool Jj_3_1()
  1231. {
  1232. if (Jj_scan_token(Lucene.Net.QueryParsers.QueryParserConstants.TERM))
  1233. return true;
  1234. if (Jj_scan_token(Lucene.Net.QueryParsers.QueryParserConstants.COLON))
  1235. return true;
  1236. return false;
  1237. }
  1238. public QueryParserTokenManager token_source;
  1239. public Token token, jj_nt;
  1240. private int jj_ntk;
  1241. private Token jj_scanpos, jj_lastpos;
  1242. private int jj_la;
  1243. public bool lookingAhead = false;
  1244. private bool jj_semLA;
  1245. private int jj_gen;
  1246. private int[] jj_la1 = new int[22];
  1247. private static uint[] jj_la1_0;
  1248. private static void  Jj_la1_0()
  1249. {
  1250. jj_la1_0 = new uint[]{0x180, 0x180, 0xe00, 0xe00, 0xfb1f80, 0x8000, 0xfb1000, 0x9a0000, 0x40000, 0x40000, 0x8000, 0xc000000, 0x1000000, 0xc000000, 0x8000, 0xc0000000, 0x10000000, 0xc0000000, 0x8000, 0x40000, 0x8000, 0xfb0000};
  1251. }
  1252. private JJCalls[] jj_2_rtns;
  1253. private bool jj_rescan = false;
  1254. private int jj_gc = 0;
  1255. public QueryParser(CharStream stream)
  1256. {
  1257. InitBlock();
  1258. token_source = new QueryParserTokenManager(stream);
  1259. token = new Token();
  1260. jj_ntk = - 1;
  1261. jj_gen = 0;
  1262. for (int i = 0; i < 22; i++)
  1263. jj_la1[i] = - 1;
  1264. for (int i = 0; i < jj_2_rtns.Length; i++)
  1265. jj_2_rtns[i] = new JJCalls();
  1266. }
  1267. public virtual void  ReInit(CharStream stream)
  1268. {
  1269. token_source.ReInit(stream);
  1270. token = new Token();
  1271. jj_ntk = - 1;
  1272. jj_gen = 0;
  1273. for (int i = 0; i < 22; i++)
  1274. jj_la1[i] = - 1;
  1275. for (int i = 0; i < jj_2_rtns.Length; i++)
  1276. jj_2_rtns[i] = new JJCalls();
  1277. }
  1278. public QueryParser(QueryParserTokenManager tm)
  1279. {
  1280. InitBlock();
  1281. token_source = tm;
  1282. token = new Token();
  1283. jj_ntk = - 1;
  1284. jj_gen = 0;
  1285. for (int i = 0; i < 22; i++)
  1286. jj_la1[i] = - 1;
  1287. for (int i = 0; i < jj_2_rtns.Length; i++)
  1288. jj_2_rtns[i] = new JJCalls();
  1289. }
  1290. public virtual void  ReInit(QueryParserTokenManager tm)
  1291. {
  1292. token_source = tm;
  1293. token = new Token();
  1294. jj_ntk = - 1;
  1295. jj_gen = 0;
  1296. for (int i = 0; i < 22; i++)
  1297. jj_la1[i] = - 1;
  1298. for (int i = 0; i < jj_2_rtns.Length; i++)
  1299. jj_2_rtns[i] = new JJCalls();
  1300. }
  1301. private Token Jj_consume_token(int kind)
  1302. {
  1303. Token oldToken;
  1304. if ((oldToken = token).next != null)
  1305. token = token.next;
  1306. else
  1307. token = token.next = token_source.GetNextToken();
  1308. jj_ntk = - 1;
  1309. if (token.kind == kind)
  1310. {
  1311. jj_gen++;
  1312. if (++jj_gc > 100)
  1313. {
  1314. jj_gc = 0;
  1315. for (int i = 0; i < jj_2_rtns.Length; i++)
  1316. {
  1317. JJCalls c = jj_2_rtns[i];
  1318. while (c != null)
  1319. {
  1320. if (c.gen < jj_gen)
  1321. c.first = null;
  1322. c = c.next;
  1323. }
  1324. }
  1325. }
  1326. return token;
  1327. }
  1328. token = oldToken;
  1329. jj_kind = kind;
  1330. throw GenerateParseException();
  1331. }
  1332. [Serializable]
  1333. private sealed class LookaheadSuccess:System.ApplicationException
  1334. {
  1335. }
  1336. private LookaheadSuccess jj_ls;
  1337. private bool Jj_scan_token(int kind)
  1338. {
  1339. if (jj_scanpos == jj_lastpos)
  1340. {
  1341. jj_la--;
  1342. if (jj_scanpos.next == null)
  1343. {
  1344. jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.GetNextToken();
  1345. }
  1346. else
  1347. {
  1348. jj_lastpos = jj_scanpos = jj_scanpos.next;
  1349. }
  1350. }
  1351. else
  1352. {
  1353. jj_scanpos = jj_scanpos.next;
  1354. }
  1355. if (jj_rescan)
  1356. {
  1357. int i = 0; Token tok = token;
  1358. while (tok != null && tok != jj_scanpos)
  1359. {
  1360. i++; tok = tok.next;
  1361. }
  1362. if (tok != null)
  1363. Jj_add_error_token(kind, i);
  1364. }
  1365. if (jj_scanpos.kind != kind)
  1366. return true;
  1367. if (jj_la == 0 && jj_scanpos == jj_lastpos)
  1368. throw jj_ls;
  1369. return false;
  1370. }
  1371. public Token GetNextToken()
  1372. {
  1373. if (token.next != null)
  1374. token = token.next;
  1375. else
  1376. token = token.next = token_source.GetNextToken();
  1377. jj_ntk = - 1;
  1378. jj_gen++;
  1379. return token;
  1380. }
  1381. public Token GetToken(int index)
  1382. {
  1383. Token t = lookingAhead ? jj_scanpos : token;
  1384. for (int i = 0; i < index; i++)
  1385. {
  1386. if (t.next != null)
  1387. t = t.next;
  1388. else
  1389. t = t.next = token_source.GetNextToken();
  1390. }
  1391. return t;
  1392. }
  1393. private int Jj_ntk()
  1394. {
  1395. if ((jj_nt = token.next) == null)
  1396. return (jj_ntk = (token.next = token_source.GetNextToken()).kind);
  1397. else
  1398. return (jj_ntk = jj_nt.kind);
  1399. }
  1400. private System.Collections.ArrayList jj_expentries = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10));
  1401. private int[] jj_expentry;
  1402. private int jj_kind = - 1;
  1403. private int[] jj_lasttokens = new int[100];
  1404. private int jj_endpos;
  1405. private void  Jj_add_error_token(int kind, int pos)
  1406. {
  1407. if (pos >= 100)
  1408. return ;
  1409. if (pos == jj_endpos + 1)
  1410. {
  1411. jj_lasttokens[jj_endpos++] = kind;
  1412. }
  1413. else if (jj_endpos != 0)
  1414. {
  1415. jj_expentry = new int[jj_endpos];
  1416. for (int i = 0; i < jj_endpos; i++)
  1417. {
  1418. jj_expentry[i] = jj_lasttokens[i];
  1419. }
  1420. bool exists = false;
  1421. for (System.Collections.IEnumerator e = jj_expentries.GetEnumerator(); e.MoveNext(); )
  1422. {
  1423. int[] oldentry = (int[]) (e.Current);
  1424. if (oldentry.Length == jj_expentry.Length)
  1425. {
  1426. exists = true;
  1427. for (int i = 0; i < jj_expentry.Length; i++)
  1428. {
  1429. if (oldentry[i] != jj_expentry[i])
  1430. {
  1431. exists = false;
  1432. break;
  1433. }
  1434. }
  1435. if (exists)
  1436. break;
  1437. }
  1438. }
  1439. if (!exists)
  1440. jj_expentries.Add(jj_expentry);
  1441. if (pos != 0)
  1442. jj_lasttokens[(jj_endpos = pos) - 1] = kind;
  1443. }
  1444. }
  1445. public virtual ParseException GenerateParseException()
  1446. {
  1447. jj_expentries.Clear();
  1448. bool[] la1tokens = new bool[32];
  1449. for (int i = 0; i < 32; i++)
  1450. {
  1451. la1tokens[i] = false;
  1452. }
  1453. if (jj_kind >= 0)
  1454. {
  1455. la1tokens[jj_kind] = true;
  1456. jj_kind = - 1;
  1457. }
  1458. for (int i = 0; i < 22; i++)
  1459. {
  1460. if (jj_la1[i] == jj_gen)
  1461. {
  1462. for (int j = 0; j < 32; j++)
  1463. {
  1464. if ((jj_la1_0[i] & (1 << j)) != 0)
  1465. {
  1466. la1tokens[j] = true;
  1467. }
  1468. }
  1469. }
  1470. }
  1471. for (int i = 0; i < 32; i++)
  1472. {
  1473. if (la1tokens[i])
  1474. {
  1475. jj_expentry = new int[1];
  1476. jj_expentry[0] = i;
  1477. jj_expentries.Add(jj_expentry);
  1478. }
  1479. }
  1480. jj_endpos = 0;
  1481. Jj_rescan_token();
  1482. Jj_add_error_token(0, 0);
  1483. int[][] exptokseq = new int[jj_expentries.Count][];
  1484. for (int i = 0; i < jj_expentries.Count; i++)
  1485. {
  1486. exptokseq[i] = (int[]) jj_expentries[i];
  1487. }
  1488. return new ParseException(token, exptokseq, Lucene.Net.QueryParsers.QueryParserConstants.tokenImage);
  1489. }
  1490. public void  Enable_tracing()
  1491. {
  1492. }
  1493. public void  Disable_tracing()
  1494. {
  1495. }
  1496. private void  Jj_rescan_token()
  1497. {
  1498. jj_rescan = true;
  1499. for (int i = 0; i < 1; i++)
  1500. {
  1501. JJCalls p = jj_2_rtns[i];
  1502. do 
  1503. {
  1504. if (p.gen > jj_gen)
  1505. {
  1506. jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
  1507. switch (i)
  1508. {
  1509. case 0:  Jj_3_1(); break;
  1510. }
  1511. }
  1512. p = p.next;
  1513. }
  1514. while (p != null);
  1515. }
  1516. jj_rescan = false;
  1517. }
  1518. private void  Jj_save(int index, int xla)
  1519. {
  1520. JJCalls p = jj_2_rtns[index];
  1521. while (p.gen > jj_gen)
  1522. {
  1523. if (p.next == null)
  1524. {
  1525. p = p.next = new JJCalls(); break;
  1526. }
  1527. p = p.next;
  1528. }
  1529. p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
  1530. }
  1531. internal sealed class JJCalls
  1532. {
  1533. internal int gen;
  1534. internal Token first;
  1535. internal int arg;
  1536. internal JJCalls next;
  1537. }
  1538. static QueryParser()
  1539. {
  1540. {
  1541. Jj_la1_0();
  1542. }
  1543. }
  1544. }
  1545. }