示例#1
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);
        }
        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);
        }
示例#5
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 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 MessageImpl(
                                        QueryParserMessages.COULD_NOT_PARSE_NUMBER, lower
                                            .GetTextAsString(), numberFormat.GetType()
                                            .AssemblyQualifiedName), e);
                                }
                            }

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

                            switch (numericConfig.Type)
                            {
                                case FieldType.NumericType.LONG:
                                    if (upperNumber != null) upperNumber = Convert.ToInt64(upperNumber);
                                    if (lowerNumber != null) lowerNumber = Convert.ToInt64(lowerNumber);
                                    break;
                                case FieldType.NumericType.INT:
                                    if (upperNumber != null) upperNumber = Convert.ToInt32(upperNumber);
                                    if (lowerNumber != null) lowerNumber = Convert.ToInt32(lowerNumber);
                                    break;
                                case FieldType.NumericType.DOUBLE:
                                    if (upperNumber != null) upperNumber = Convert.ToDouble(upperNumber);
                                    if (lowerNumber != null) lowerNumber = Convert.ToDouble(lowerNumber);
                                    break;
                                case FieldType.NumericType.FLOAT:
                                    if (upperNumber != null) upperNumber = Convert.ToSingle(upperNumber);
                                    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;
        }
        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);
        }
        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;
        }