Beispiel #1
0
        /// <summary>
        /// Sets the upper and lower bounds of this range query node and the
        /// <see cref="Config.NumericConfig"/> associated with these bounds.
        /// </summary>
        /// <param name="lower">the lower bound</param>
        /// <param name="upper">the upper bound</param>
        /// <param name="lowerInclusive"><c>true</c> if the lower bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="upperInclusive"><c>true</c> if the upper bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="numericConfig">the <see cref="Config.NumericConfig"/> that represents associated with the upper and lower bounds</param>
        public virtual void SetBounds(NumericQueryNode lower, NumericQueryNode upper,
                                      bool lowerInclusive, bool upperInclusive, NumericConfig numericConfig)
        {
            if (numericConfig is null)
            {
                throw new ArgumentNullException(nameof(numericConfig), "numericConfig cannot be null!"); // LUCENENET specific - changed from IllegalArgumentException to ArgumentNullException (.NET convention)
            }

            NumericType lowerNumberType, upperNumberType;

            if (lower != null && lower.Value != null)
            {
                lowerNumberType = GetNumericDataType(lower.Value);
            }
            else
            {
                lowerNumberType = NumericType.NONE;
            }

            if (upper != null && upper.Value != null)
            {
                upperNumberType = GetNumericDataType(upper.Value);
            }
            else
            {
                upperNumberType = NumericType.NONE;
            }

            if (lowerNumberType != NumericType.NONE &&
                !lowerNumberType.Equals(numericConfig.Type))
            {
                throw new ArgumentException(
                          "lower value's type should be the same as numericConfig type: "
                          + lowerNumberType + " != " + numericConfig.Type);
            }

            if (upperNumberType != NumericType.NONE &&
                !upperNumberType.Equals(numericConfig.Type))
            {
                throw new ArgumentException(
                          "upper value's type should be the same as numericConfig type: "
                          + upperNumberType + " != " + numericConfig.Type);
            }

            base.SetBounds(lower, upper, lowerInclusive, upperInclusive);
            this.numericConfig = numericConfig;
        }
Beispiel #2
0
        /// <summary>
        /// Sets the upper and lower bounds of this range query node and the
        /// <see cref="Config.NumericConfig"/> associated with these bounds.
        /// </summary>
        /// <param name="lower">the lower bound</param>
        /// <param name="upper">the upper bound</param>
        /// <param name="lowerInclusive"><c>true</c> if the lower bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="upperInclusive"><c>true</c> if the upper bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="numericConfig">the <see cref="Config.NumericConfig"/> that represents associated with the upper and lower bounds</param>
        public virtual void SetBounds(NumericQueryNode lower, NumericQueryNode upper,
                                      bool lowerInclusive, bool upperInclusive, NumericConfig numericConfig)
        {
            if (numericConfig == null)
            {
                throw new ArgumentException("numericConfig cannot be null!");
            }

            NumericType?lowerNumberType, upperNumberType;

            if (lower != null && lower.Value != null)
            {
                lowerNumberType = GetNumericDataType(lower.Value);
            }
            else
            {
                lowerNumberType = null;
            }

            if (upper != null && upper.Value != null)
            {
                upperNumberType = GetNumericDataType(upper.Value);
            }
            else
            {
                upperNumberType = null;
            }

            if (lowerNumberType != null &&
                !lowerNumberType.Equals(numericConfig.Type))
            {
                throw new ArgumentException(
                          "lower value's type should be the same as numericConfig type: "
                          + lowerNumberType + " != " + numericConfig.Type);
            }

            if (upperNumberType != null &&
                !upperNumberType.Equals(numericConfig.Type))
            {
                throw new ArgumentException(
                          "upper value's type should be the same as numericConfig type: "
                          + upperNumberType + " != " + numericConfig.Type);
            }

            base.SetBounds(lower, upper, lowerInclusive, upperInclusive);
            this.numericConfig = numericConfig;
        }
Beispiel #3
0
        public virtual Query Build(IQueryNode queryNode)
        {
            NumericRangeQueryNode numericRangeNode = (NumericRangeQueryNode)queryNode;

            NumericQueryNode lowerNumericNode = (NumericQueryNode)numericRangeNode.LowerBound;
            NumericQueryNode upperNumericNode = (NumericQueryNode)numericRangeNode.UpperBound;

            /*Number*/
            object lowerNumber = lowerNumericNode.Value;
            /*Number*/
            object 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,
                                                       (long?)lowerNumber, (long?)upperNumber, minInclusive, maxInclusive));

            case NumericType.INT32:
                return(NumericRangeQuery.NewInt32Range(field, precisionStep,
                                                       (int?)lowerNumber, (int?)upperNumber, minInclusive,
                                                       maxInclusive));

            case NumericType.SINGLE:
                return(NumericRangeQuery.NewSingleRange(field, precisionStep,
                                                        (float?)lowerNumber, (float?)upperNumber, minInclusive,
                                                        maxInclusive));

            case NumericType.DOUBLE:
                return(NumericRangeQuery.NewDoubleRange(field, precisionStep,
                                                        (double?)lowerNumber, (double?)upperNumber, 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));
            }
        }
        public virtual Query Build(IQueryNode queryNode)
        {
            NumericRangeQueryNode numericRangeNode = (NumericRangeQueryNode)queryNode;

            NumericQueryNode lowerNumericNode = (NumericQueryNode)numericRangeNode.LowerBound;
            NumericQueryNode upperNumericNode = (NumericQueryNode)numericRangeNode.UpperBound;

            /*Number*/
            object lowerNumber = lowerNumericNode.Value;
            /*Number*/
            object upperNumber = upperNumericNode.Value;

            NumericConfig numericConfig = numericRangeNode.NumericConfig;

            FieldType.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 FieldType.NumericType.LONG:
                return(NumericRangeQuery.NewLongRange(field, precisionStep,
                                                      (long?)lowerNumber, (long?)upperNumber, minInclusive, maxInclusive));

            case FieldType.NumericType.INT:
                return(NumericRangeQuery.NewIntRange(field, precisionStep,
                                                     (int?)lowerNumber, (int?)upperNumber, minInclusive,
                                                     maxInclusive));

            case FieldType.NumericType.FLOAT:
                return(NumericRangeQuery.NewFloatRange(field, precisionStep,
                                                       (float?)lowerNumber, (float?)upperNumber, minInclusive,
                                                       maxInclusive));

            case FieldType.NumericType.DOUBLE:
                return(NumericRangeQuery.NewDoubleRange(field, precisionStep,
                                                        (double?)lowerNumber, (double?)upperNumber, minInclusive,
                                                        maxInclusive));

            default:
                throw new QueryNodeException(new MessageImpl(
                                                 QueryParserMessages.UNSUPPORTED_NUMERIC_DATA_TYPE, numberType));
            }
        }
        protected override IQueryNode PostProcessNode(IQueryNode node)
        {
            if (node is FieldQueryNode &&
                !(node.Parent is IRangeQueryNode))
            {
                QueryConfigHandler config = GetQueryConfigHandler();

                if (config != null)
                {
                    FieldQueryNode fieldNode   = (FieldQueryNode)node;
                    FieldConfig    fieldConfig = config.GetFieldConfig(fieldNode
                                                                       .GetFieldAsString());

                    if (fieldConfig != null)
                    {
                        NumericConfig numericConfig = fieldConfig
                                                      .Get(ConfigurationKeys.NUMERIC_CONFIG);

                        if (numericConfig != null)
                        {
                            NumberFormat numberFormat = numericConfig.NumberFormat;
                            string       text         = fieldNode.GetTextAsString();
                            /*Number*/
                            object number = null;

                            if (text.Length > 0)
                            {
                                try
                                {
                                    number = numberFormat.Parse(text);
                                }
                                catch (FormatException e)
                                {
                                    throw new QueryNodeParseException(new MessageImpl(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, fieldNode
                                                                          .GetTextAsString(), numberFormat.GetType()
                                                                          .AssemblyQualifiedName), e);
                                }

                                switch (numericConfig.Type)
                                {
                                case FieldType.NumericType.LONG:
                                    number = Convert.ToInt64(number);
                                    break;

                                case FieldType.NumericType.INT:
                                    number = Convert.ToInt32(number);
                                    break;

                                case FieldType.NumericType.DOUBLE:
                                    number = Convert.ToDouble(number);
                                    break;

                                case FieldType.NumericType.FLOAT:
                                    number = Convert.ToSingle(number);
                                    break;
                                }
                            }
                            else
                            {
                                throw new QueryNodeParseException(new MessageImpl(
                                                                      QueryParserMessages.NUMERIC_CANNOT_BE_EMPTY, fieldNode.GetFieldAsString()));
                            }

                            NumericQueryNode lowerNode = new NumericQueryNode(fieldNode
                                                                              .Field, number, numberFormat);
                            NumericQueryNode upperNode = new NumericQueryNode(fieldNode
                                                                              .Field, number, numberFormat);

                            return(new NumericRangeQueryNode(lowerNode, upperNode, true, true,
                                                             numericConfig));
                        }
                    }
                }
            }

            return(node);
        }
Beispiel #6
0
        private NumericConfig numericConfig; // LUCENENET specific: made private and added a public setter to the property

        /// <summary>
        /// Constructs a <see cref="NumericRangeQueryNode"/> object using the given
        /// <see cref="NumericQueryNode"/> as its bounds and <see cref="Config.NumericConfig"/>.
        /// </summary>
        /// <param name="lower">the lower bound</param>
        /// <param name="upper">the upper bound</param>
        /// <param name="lowerInclusive"><c>true</c> if the lower bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="upperInclusive"><c>true</c> if the upper bound is inclusive, otherwise, <c>false</c></param>
        /// <param name="numericConfig">the <see cref="Config.NumericConfig"/> that represents associated with the upper and lower bounds</param>
        /// <seealso cref="SetBounds(NumericQueryNode, NumericQueryNode, bool, bool, NumericConfig)"/>
        public NumericRangeQueryNode(NumericQueryNode lower, NumericQueryNode upper,
                                     bool lowerInclusive, bool upperInclusive, NumericConfig numericConfig)
        {
            SetBounds(lower, upper, lowerInclusive, upperInclusive, numericConfig);
        }
        protected override IQueryNode PostProcessNode(IQueryNode node)
        {
            if (node is TermRangeQueryNode)
            {
                QueryConfigHandler config = GetQueryConfigHandler();

                if (config != null)
                {
                    TermRangeQueryNode termRangeNode = (TermRangeQueryNode)node;
                    FieldConfig        fieldConfig   = config.GetFieldConfig(StringUtils
                                                                             .ToString(termRangeNode.Field));

                    if (fieldConfig != null)
                    {
                        NumericConfig numericConfig = fieldConfig
                                                      .Get(ConfigurationKeys.NUMERIC_CONFIG);

                        if (numericConfig != null)
                        {
                            FieldQueryNode lower = (FieldQueryNode)termRangeNode.LowerBound;
                            FieldQueryNode upper = (FieldQueryNode)termRangeNode.UpperBound;

                            string       lowerText    = lower.GetTextAsString();
                            string       upperText    = upper.GetTextAsString();
                            NumberFormat numberFormat = numericConfig.NumberFormat;
                            /*Number*/
                            object lowerNumber = null, upperNumber = null;

                            if (lowerText.Length > 0)
                            {
                                try
                                {
                                    lowerNumber = numberFormat.Parse(lowerText);
                                }
                                catch (FormatException e)
                                {
                                    throw new QueryNodeParseException(new Message(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, lower
                                                                          .GetTextAsString(), numberFormat.ToString()), e);
                                }
                            }

                            if (upperText.Length > 0)
                            {
                                try
                                {
                                    upperNumber = numberFormat.Parse(upperText);
                                }
                                catch (FormatException e)
                                {
                                    throw new QueryNodeParseException(new Message(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, upper
                                                                          .GetTextAsString(), numberFormat.ToString()), e);
                                }
                            }

                            switch (numericConfig.Type)
                            {
                            case NumericType.INT64:
                                if (upperNumber != null)
                                {
                                    upperNumber = Convert.ToInt64(upperNumber);                          // LUCENENET TODO: Find a way to pass culture
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = Convert.ToInt64(lowerNumber);
                                }
                                break;

                            case NumericType.INT32:
                                if (upperNumber != null)
                                {
                                    upperNumber = Convert.ToInt32(upperNumber);                          // LUCENENET TODO: Find a way to pass culture
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = Convert.ToInt32(lowerNumber);
                                }
                                break;

                            case NumericType.DOUBLE:
                                if (upperNumber != null)
                                {
                                    upperNumber = Convert.ToDouble(upperNumber);                          // LUCENENET TODO: Find a way to pass culture
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = Convert.ToDouble(lowerNumber);
                                }
                                break;

                            case NumericType.SINGLE:
                                if (upperNumber != null)
                                {
                                    upperNumber = Convert.ToSingle(upperNumber);                          // LUCENENET TODO: Find a way to pass culture
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = Convert.ToSingle(lowerNumber);
                                }
                                break;
                            }

                            NumericQueryNode lowerNode = new NumericQueryNode(
                                termRangeNode.Field, lowerNumber, numberFormat);
                            NumericQueryNode upperNode = new NumericQueryNode(
                                termRangeNode.Field, upperNumber, numberFormat);

                            bool lowerInclusive = termRangeNode.IsLowerInclusive;
                            bool upperInclusive = termRangeNode.IsUpperInclusive;

                            return(new NumericRangeQueryNode(lowerNode, upperNode,
                                                             lowerInclusive, upperInclusive, numericConfig));
                        }
                    }
                }
            }

            return(node);
        }
Beispiel #8
0
        protected override IQueryNode PostProcessNode(IQueryNode node)
        {
            if (node is TermRangeQueryNode termRangeNode)
            {
                QueryConfigHandler config = GetQueryConfigHandler();

                if (config != null)
                {
                    FieldConfig fieldConfig = config.GetFieldConfig(StringUtils
                                                                    .ToString(termRangeNode.Field));

                    if (fieldConfig != null)
                    {
                        NumericConfig numericConfig = fieldConfig
                                                      .Get(ConfigurationKeys.NUMERIC_CONFIG);

                        if (numericConfig != null)
                        {
                            FieldQueryNode lower = (FieldQueryNode)termRangeNode.LowerBound;
                            FieldQueryNode upper = (FieldQueryNode)termRangeNode.UpperBound;

                            string              lowerText = lower.GetTextAsString();
                            string              upperText = upper.GetTextAsString();
                            NumberFormat        numberFormat = numericConfig.NumberFormat;
                            J2N.Numerics.Number lowerNumber = null, upperNumber = null;

                            if (lowerText.Length > 0)
                            {
                                try
                                {
                                    lowerNumber = numberFormat.Parse(lowerText);
                                }
                                catch (FormatException e) // LUCENENET: In .NET we are expecting the framework to throw FormatException, not ParseException
                                {
                                    // LUCENENET: Factored out NLS/Message/IMessage so end users can optionally utilize the built-in .NET localization.
                                    throw new QueryNodeParseException(string.Format(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, lower
                                                                          .GetTextAsString(), numberFormat.ToString()), e);
                                }
                            }

                            if (upperText.Length > 0)
                            {
                                try
                                {
                                    upperNumber = numberFormat.Parse(upperText);
                                }
                                catch (FormatException e) // LUCENENET: In .NET we are expecting the framework to throw FormatException, not ParseException
                                {
                                    // LUCENENET: Factored out NLS/Message/IMessage so end users can optionally utilize the built-in .NET localization.
                                    throw new QueryNodeParseException(string.Format(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, upper
                                                                          .GetTextAsString(), numberFormat.ToString()), e);
                                }
                            }

                            switch (numericConfig.Type)
                            {
                            case NumericType.INT64:
                                if (upperNumber != null)
                                {
                                    upperNumber = J2N.Numerics.Int64.GetInstance(upperNumber.ToInt64());
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = J2N.Numerics.Int64.GetInstance(lowerNumber.ToInt64());
                                }
                                break;

                            case NumericType.INT32:
                                if (upperNumber != null)
                                {
                                    upperNumber = J2N.Numerics.Int32.GetInstance(upperNumber.ToInt32());
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = J2N.Numerics.Int32.GetInstance(lowerNumber.ToInt32());
                                }
                                break;

                            case NumericType.DOUBLE:
                                if (upperNumber != null)
                                {
                                    upperNumber = J2N.Numerics.Double.GetInstance(upperNumber.ToDouble());
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = J2N.Numerics.Double.GetInstance(lowerNumber.ToDouble());
                                }
                                break;

                            case NumericType.SINGLE:
                                if (upperNumber != null)
                                {
                                    upperNumber = J2N.Numerics.Single.GetInstance(upperNumber.ToSingle());
                                }
                                if (lowerNumber != null)
                                {
                                    lowerNumber = J2N.Numerics.Single.GetInstance(lowerNumber.ToSingle());
                                }
                                break;
                            }

                            NumericQueryNode lowerNode = new NumericQueryNode(
                                termRangeNode.Field, lowerNumber, numberFormat);
                            NumericQueryNode upperNode = new NumericQueryNode(
                                termRangeNode.Field, upperNumber, numberFormat);

                            bool lowerInclusive = termRangeNode.IsLowerInclusive;
                            bool upperInclusive = termRangeNode.IsUpperInclusive;

                            return(new NumericRangeQueryNode(lowerNode, upperNode,
                                                             lowerInclusive, upperInclusive, numericConfig));
                        }
                    }
                }
            }

            return(node);
        }
        protected override IQueryNode PostProcessNode(IQueryNode node)
        {
            if (node is FieldQueryNode fieldNode &&
                !(node.Parent is IRangeQueryNode))
            {
                QueryConfigHandler config = GetQueryConfigHandler();

                if (config != null)
                {
                    FieldConfig fieldConfig = config.GetFieldConfig(fieldNode
                                                                    .GetFieldAsString());

                    if (fieldConfig != null)
                    {
                        NumericConfig numericConfig = fieldConfig
                                                      .Get(ConfigurationKeys.NUMERIC_CONFIG);

                        if (numericConfig != null)
                        {
                            NumberFormat numberFormat = numericConfig.NumberFormat;
                            string       text         = fieldNode.GetTextAsString();
                            Number       number; // LUCENENET: IDE0059: Remove unnecessary value assignment

                            if (text.Length > 0)
                            {
                                try
                                {
                                    number = numberFormat.Parse(text);
                                }
                                catch (FormatException e) // LUCENENET: In .NET we are expecting the framework to throw FormatException, not ParseException
                                {
                                    // LUCENENET: Factored out NLS/Message/IMessage so end users can optionally utilize the built-in .NET localization.
                                    throw new QueryNodeParseException(string.Format(
                                                                          QueryParserMessages.COULD_NOT_PARSE_NUMBER, fieldNode
                                                                          .GetTextAsString(), numberFormat.GetType()
                                                                          .AssemblyQualifiedName), e);
                                }

                                switch (numericConfig.Type)
                                {
                                case NumericType.INT64:
                                    number = J2N.Numerics.Int64.GetInstance(number.ToInt64());
                                    break;

                                case NumericType.INT32:
                                    number = J2N.Numerics.Int32.GetInstance(number.ToInt32());
                                    break;

                                case NumericType.DOUBLE:
                                    number = J2N.Numerics.Double.GetInstance(number.ToDouble());
                                    break;

                                case NumericType.SINGLE:
                                    number = J2N.Numerics.Single.GetInstance(number.ToSingle());
                                    break;
                                }
                            }
                            else
                            {
                                // LUCENENET: Factored out NLS/Message/IMessage so end users can optionally utilize the built-in .NET localization.
                                throw new QueryNodeParseException(string.Format(
                                                                      QueryParserMessages.NUMERIC_CANNOT_BE_EMPTY, fieldNode.GetFieldAsString()));
                            }

                            NumericQueryNode lowerNode = new NumericQueryNode(fieldNode
                                                                              .Field, number, numberFormat);
                            NumericQueryNode upperNode = new NumericQueryNode(fieldNode
                                                                              .Field, number, numberFormat);

                            return(new NumericRangeQueryNode(lowerNode, upperNode, true, true,
                                                             numericConfig));
                        }
                    }
                }
            }

            return(node);
        }