/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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;
using Term = Lucene.Net.Index.Term;
using StringHelper = Lucene.Net.Util.StringHelper;
namespace Lucene.Net.Search
{
/// Subclass of FilteredTermEnum for enumerating all terms that match the
/// specified range parameters.
///
/// Term enumerations are always ordered by Term.compareTo(). Each term in
/// the enumeration is greater than all that precede it.
///
/// 2.9
///
public class TermRangeTermEnum:FilteredTermEnum
{
private System.Globalization.CompareInfo collator = null;
private bool endEnum = false;
private System.String field;
private System.String upperTermText;
private System.String lowerTermText;
private bool includeLower;
private bool includeUpper;
/// Enumerates all terms greater/equal than lowerTerm
/// but less/equal than upperTerm.
///
/// If an endpoint is null, it is said to be "open". Either or both
/// endpoints may be open. Open endpoints may not be exclusive
/// (you can't select all but the first or last term without
/// explicitly specifying the term to exclude.)
///
///
///
///
/// An interned field that holds both lower and upper terms.
///
/// The term text at the lower end of the range
///
/// The term text at the upper end of the range
///
/// If true, the lowerTerm is included in the range.
///
/// If true, the upperTerm is included in the range.
///
/// The collator to use to collate index Terms, to determine their
/// membership in the range bounded by lowerTerm and
/// upperTerm.
///
///
/// IOException
public TermRangeTermEnum(IndexReader reader, System.String field, System.String lowerTermText, System.String upperTermText, bool includeLower, bool includeUpper, System.Globalization.CompareInfo collator)
{
this.collator = collator;
this.upperTermText = upperTermText;
this.lowerTermText = lowerTermText;
this.includeLower = includeLower;
this.includeUpper = includeUpper;
this.field = StringHelper.Intern(field);
// do a little bit of normalization...
// open ended range queries should always be inclusive.
if (this.lowerTermText == null)
{
this.lowerTermText = "";
this.includeLower = true;
}
if (this.upperTermText == null)
{
this.includeUpper = true;
}
System.String startTermText = collator == null?this.lowerTermText:"";
SetEnum(reader.Terms(new Term(this.field, startTermText)));
}
public override float Difference()
{
return 1.0f;
}
public override bool EndEnum()
{
return endEnum;
}
protected internal override bool TermCompare(Term term)
{
if (collator == null)
{
// Use Unicode code point ordering
bool checkLower = !includeLower;
if (term != null && (System.Object) term.Field == (System.Object) field)
{
// interned comparison
if (!checkLower || null == lowerTermText || String.CompareOrdinal(term.Text, lowerTermText) > 0)
{
checkLower = false;
if (upperTermText != null)
{
int compare = String.CompareOrdinal(upperTermText, term.Text);
/*
* if beyond the upper term, or is exclusive and this is equal to
* the upper term, break out
*/
if ((compare < 0) || (!includeUpper && compare == 0))
{
endEnum = true;
return false;
}
}
return true;
}
}
else
{
// break
endEnum = true;
return false;
}
return false;
}
else
{
if (term != null && (System.Object) term.Field == (System.Object) field)
{
// interned comparison
if ((lowerTermText == null || (includeLower?collator.Compare(term.Text.ToString(), lowerTermText.ToString()) >= 0:collator.Compare(term.Text.ToString(), lowerTermText.ToString()) > 0)) && (upperTermText == null || (includeUpper?collator.Compare(term.Text.ToString(), upperTermText.ToString()) <= 0:collator.Compare(term.Text.ToString(), upperTermText.ToString()) < 0)))
{
return true;
}
return false;
}
endEnum = true;
return false;
}
}
}
}