/*
* 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:
///
/// - {@link TermQuery}
///
- {@link MultiTermQuery}
///
- {@link BooleanQuery}
///
- {@link WildcardQuery}
///
- {@link PhraseQuery}
///
- {@link PrefixQuery}
///
- {@link PhrasePrefixQuery}
///
- {@link FuzzyQuery}
///
- {@link RangeQuery}
///
- {@link Lucene.Net.Search.Spans.SpanQuery}
///
/// A parser for queries is contained in:
///
/// - {@link Lucene.Net.QueryParser.QueryParser QueryParser}
///
///
[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);
}
}
}
}