/*
* 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 NumericTokenStream = Lucene.Net.Analysis.NumericTokenStream;
using NumericField = Lucene.Net.Documents.NumericField;
using NumericUtils = Lucene.Net.Util.NumericUtils;
namespace Lucene.Net.Search
{
/// A that only accepts numeric values within
/// a specified range. To use this, you must first index the
/// numeric values using (expert:
///).
///
/// You create a new NumericRangeFilter with the static
/// factory methods, eg:
///
///
/// Filter f = NumericRangeFilter.newFloatRange("weight",
/// new Float(0.3f), new Float(0.10f),
/// true, true);
///
///
/// accepts all documents whose float valued "weight" field
/// ranges from 0.3 to 0.10, inclusive.
/// See for details on how Lucene
/// indexes and searches numeric valued fields.
///
/// NOTE: This API is experimental and
/// might change in incompatible ways in the next
/// release.
///
///
/// 2.9
///
///
[Serializable]
public sealed class NumericRangeFilter : MultiTermQueryWrapperFilter>
where T : struct, IComparable
// real numbers in C# are structs and IComparable with themselves, best constraint we have
{
internal NumericRangeFilter(NumericRangeQuery query)
: base(query)
{
}
/// Returns the field name for this filter
public string Field
{
get { return query.Field; }
}
/// Returns true if the lower endpoint is inclusive
public bool IncludesMin
{
get { return query.IncludesMin; }
}
/// Returns true if the upper endpoint is inclusive
public bool IncludesMax
{
get { return query.IncludesMax; }
}
/// Returns the lower value of this range filter
public T? Min
{
get { return query.Min; }
}
/// Returns the upper value of this range filter
public T? Max
{
get { return query.Max; }
}
}
public static class NumericRangeFilter
{
/// Factory that creates a NumericRangeFilter, that filters a long
/// range using the given precisionStep.
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewLongRange(System.String field, int precisionStep, long? min, long? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewLongRange(field, precisionStep, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that queries a long
/// range using the default precisionStep (4).
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewLongRange(System.String field, long? min, long? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewLongRange(field, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that filters a int
/// range using the given precisionStep.
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewIntRange(System.String field, int precisionStep, int? min, int? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewIntRange(field, precisionStep, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that queries a int
/// range using the default precisionStep (4).
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewIntRange(System.String field, int? min, int? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewIntRange(field, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that filters a double
/// range using the given precisionStep.
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewDoubleRange(System.String field, int precisionStep, double? min, double? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewDoubleRange(field, precisionStep, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that queries a double
/// range using the default precisionStep (4).
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewDoubleRange(System.String field, double? min, double? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewDoubleRange(field, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that filters a float
/// range using the given precisionStep.
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewFloatRange(System.String field, int precisionStep, float? min, float? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewFloatRange(field, precisionStep, min, max, minInclusive, maxInclusive));
}
/// Factory that creates a NumericRangeFilter, that queries a float
/// range using the default precisionStep (4).
/// You can have half-open ranges (which are in fact </≤ or >/≥ queries)
/// by setting the min or max value to null. By setting inclusive to false, it will
/// match all documents excluding the bounds, with inclusive on, the boundaries are hits, too.
///
public static NumericRangeFilter NewFloatRange(System.String field, float? min, float? max, bool minInclusive, bool maxInclusive)
{
return new NumericRangeFilter(NumericRangeQuery.NewFloatRange(field, min, max, minInclusive, maxInclusive));
}
}
}