/* * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using IndexReader = Lucene.Net.Index.IndexReader; namespace Lucene.Net.Search { /// The abstract base class for queries. ///

Instantiable subclasses are: ///

///

A parser for queries is contained in: ///

///
[Serializable] public abstract class Query : System.ICloneable { private float boost = 1.0f; // query boost factor /// Sets the boost for this query clause to b. Documents /// matching this clause will (in addition to the normal weightings) have /// their score multiplied by b. /// public virtual void SetBoost(float b) { boost = b; } /// Gets the boost for this clause. Documents matching /// this clause will (in addition to the normal weightings) have their score /// multiplied by b. The boost is 1.0 by default. /// public virtual float GetBoost() { return boost; } /// Prints a query to a string, with Field as the default Field /// for terms.

The representation used is one that is readable by /// {@link Lucene.Net.QueryParser.QueryParser QueryParser} /// (although, if the query was created by the parser, the printed /// representation may not be exactly what was parsed). ///

public abstract System.String ToString(System.String field); /// Prints a query to a string. public override System.String ToString() { return ToString(""); } /// Expert: Constructs an appropriate Weight implementation for this query. /// ///

Only implemented by primitive queries, which re-write to themselves. ///

protected internal virtual Weight CreateWeight(Searcher searcher) { throw new System.NotSupportedException(); } /// Expert: Constructs an initializes a Weight for a top-level query. public virtual Weight Weight(Searcher searcher) { Query query = searcher.Rewrite(this); Weight weight = query.CreateWeight(searcher); float sum = weight.SumOfSquaredWeights(); float norm = GetSimilarity(searcher).QueryNorm(sum); weight.Normalize(norm); return weight; } /// Expert: called to re-write queries into primitive queries. public virtual Query Rewrite(IndexReader reader) { return this; } /// Expert: called when re-writing queries under MultiSearcher. /// ///

Only implemented by derived queries, with no /// {@link #CreateWeight(Searcher)} implementatation. ///

public virtual Query Combine(Query[] queries) { throw new System.NotSupportedException(); } /// Expert: merges the clauses of a set of BooleanQuery's into a single /// BooleanQuery. /// ///

A utility for use by {@link #Combine(Query[])} implementations. ///

public static Query MergeBooleanQueries(Query[] queries) { System.Collections.Hashtable allClauses = new System.Collections.Hashtable(); for (int i = 0; i < queries.Length; i++) { BooleanClause[] clauses = ((BooleanQuery) queries[i]).GetClauses(); for (int j = 0; j < clauses.Length; j++) { allClauses.Add(clauses[j], clauses[j]); } } BooleanQuery result = new BooleanQuery(); foreach (BooleanClause booleanClause in allClauses.Keys) { result.Add(booleanClause); } return result; } /// Expert: Returns the Similarity implementation to be used for this query. /// Subclasses may override this method to specify their own Similarity /// implementation, perhaps one that delegates through that of the Searcher. /// By default the Searcher's Similarity implementation is returned. /// public virtual Similarity GetSimilarity(Searcher searcher) { return searcher.GetSimilarity(); } /// Returns a clone of this query. public virtual System.Object Clone() { try { return (Query) this.MemberwiseClone(); } catch (System.Exception e) { throw new System.SystemException("Clone not supported: " + e.Message); } } } }