public virtual Query Build(IQueryNode queryNode) { NumericRangeQueryNode numericRangeNode = (NumericRangeQueryNode)queryNode; NumericQueryNode lowerNumericNode = (NumericQueryNode)numericRangeNode.LowerBound; NumericQueryNode upperNumericNode = (NumericQueryNode)numericRangeNode.UpperBound; J2N.Numerics.Number lowerNumber = lowerNumericNode.Value; J2N.Numerics.Number upperNumber = upperNumericNode.Value; NumericConfig numericConfig = numericRangeNode.NumericConfig; NumericType numberType = numericConfig.Type; string field = StringUtils.ToString(numericRangeNode.Field); bool minInclusive = numericRangeNode.IsLowerInclusive; bool maxInclusive = numericRangeNode.IsUpperInclusive; int precisionStep = numericConfig.PrecisionStep; switch (numberType) { case NumericType.INT64: return(NumericRangeQuery.NewInt64Range(field, precisionStep, lowerNumber?.ToInt64(), upperNumber?.ToInt64(), minInclusive, maxInclusive)); case NumericType.INT32: return(NumericRangeQuery.NewInt32Range(field, precisionStep, lowerNumber?.ToInt32(), upperNumber?.ToInt32(), minInclusive, maxInclusive)); case NumericType.SINGLE: return(NumericRangeQuery.NewSingleRange(field, precisionStep, lowerNumber?.ToSingle(), upperNumber?.ToSingle(), minInclusive, maxInclusive)); case NumericType.DOUBLE: return(NumericRangeQuery.NewDoubleRange(field, precisionStep, lowerNumber?.ToDouble(), upperNumber?.ToDouble(), minInclusive, maxInclusive)); default: // LUCENENET: Factored out NLS/Message/IMessage so end users can optionally utilize the built-in .NET localization. throw new QueryNodeException(string.Format( QueryParserMessages.UNSUPPORTED_NUMERIC_DATA_TYPE, numberType)); } }