/* * 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 Parameter = Lucene.Net.Util.Parameter; namespace Lucene.Net.Search { /// A clause in a BooleanQuery. [Serializable] public class BooleanClause { [Serializable] public sealed class Occur : Parameter { internal Occur(System.String name):base(name) { } public override System.String ToString() { if (this == MUST) return "+"; if (this == MUST_NOT) return "-"; return ""; } /// Use this operator for terms that must appear in the matching documents. public static readonly Occur MUST = new Occur("MUST"); /// Use this operator for terms that should appear in the /// matching documents. For a BooleanQuery with two SHOULD /// subqueries, at least one of the queries must appear in the matching documents. /// public static readonly Occur SHOULD = new Occur("SHOULD"); /// Use this operator for terms that must not appear in the matching documents. /// Note that it is not possible to search for queries that only consist /// of a MUST_NOT query. /// public static readonly Occur MUST_NOT = new Occur("MUST_NOT"); } /// The query whose matching documents are combined by the boolean query. /// use {@link #SetQuery(Query)} instead /// public Query query; // TODO: decrease visibility for Lucene 2.0 /// If true, documents documents which do not /// match this sub-query will not match the boolean query. /// /// use {@link #SetOccur(BooleanClause.Occur)} instead /// public bool required = false; // TODO: decrease visibility for Lucene 2.0 /// If true, documents documents which do /// match this sub-query will not match the boolean query. /// /// use {@link #SetOccur(BooleanClause.Occur)} instead /// public bool prohibited = false; // TODO: decrease visibility for Lucene 2.0 private Occur occur = Occur.SHOULD; /// Constructs a BooleanClause with query q, required /// r and prohibited p. /// /// use BooleanClause(Query, Occur) instead /// /// public BooleanClause(Query q, bool r, bool p) { // TODO: remove for Lucene 2.0 query = q; required = r; prohibited = p; if (required) { if (prohibited) { // prohibited && required doesn't make sense, but we want the old behaviour: occur = Occur.MUST_NOT; } else { occur = Occur.MUST; } } else { if (prohibited) { occur = Occur.MUST_NOT; } else { occur = Occur.SHOULD; } } } /// Constructs a BooleanClause. public BooleanClause(Query query, Occur occur) { this.query = query; this.occur = occur; SetFields(occur); } public virtual Occur GetOccur() { return occur; } public virtual void SetOccur(Occur occur) { this.occur = occur; SetFields(occur); } public virtual Query GetQuery() { return query; } public virtual void SetQuery(Query query) { this.query = query; } public virtual bool IsProhibited() { return prohibited; } public virtual bool IsRequired() { return required; } private void SetFields(Occur occur) { if (occur == Occur.MUST) { required = true; prohibited = false; } else if (occur == Occur.SHOULD) { required = false; prohibited = false; } else if (occur == Occur.MUST_NOT) { required = false; prohibited = true; } else { throw new System.ArgumentException("Unknown operator " + occur); } } /// Returns true iff o is equal to this. public override bool Equals(System.Object o) { if (!(o is BooleanClause)) return false; BooleanClause other = (BooleanClause) o; return this.query.Equals(other.query) && (this.required == other.required) && (this.prohibited == other.prohibited); } /// Returns a hash code value for this object. public override int GetHashCode() { return query.GetHashCode() ^ (this.required?1:0) ^ (this.prohibited?2:0); } public override System.String ToString() { return occur.ToString() + query.ToString(); } } }