Exemplo n.º 1
0
        public static object GetAlphabeticValue <T>(ParameterExpression parameter, ExpressionValue expressionValue,
                                                    RSqlQueryParser.ComparisonContext context,
                                                    JsonNamingPolicy jsonNamingPolicy = null)
        {
            if (IsChar(expressionValue.Property.PropertyType))
            {
                return(GetChar <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            return(GetString <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
        }
Exemplo n.º 2
0
        public static object GetTemporalValue <T>(ParameterExpression parameter, ExpressionValue expressionValue,
                                                  RSqlQueryParser.ComparisonContext context,
                                                  JsonNamingPolicy jsonNamingPolicy = null)
        {
            if (IsDateTimeOffset(expressionValue.Property.PropertyType))
            {
                return(GetDateTimeOffset <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            return(GetDateTime <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
        }
Exemplo n.º 3
0
        public static object GetValue <T>(ParameterExpression parameter, ExpressionValue expressionValue,
                                          RSqlQueryParser.ComparisonContext context,
                                          JsonNamingPolicy jsonNamingPolicy = null)
        {
            CheckParameters(parameter, expressionValue, context);

            if (IsNumeric(expressionValue.Property.PropertyType))
            {
                return(GetNumericValue <T>(parameter, expressionValue, context, jsonNamingPolicy));
            }

            if (IsTemporal(expressionValue.Property.PropertyType))
            {
                return(GetTemporalValue <T>(parameter, expressionValue, context, jsonNamingPolicy));
            }

            if (IsAlphabetic(expressionValue.Property.PropertyType))
            {
                return(GetAlphabeticValue <T>(parameter, expressionValue, context, jsonNamingPolicy));
            }

            if (IsBool(expressionValue.Property.PropertyType))
            {
                return(GetBoolean <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsEnum(expressionValue.Property.PropertyType))
            {
                return(GetEnum <T>(parameter, context.arguments().value()[0],
                                   expressionValue.Property.PropertyType, jsonNamingPolicy));
            }

            if (IsGuid(expressionValue.Property.PropertyType))
            {
                return(GetGuid <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            return(null);
        }
        /// <summary>
        /// extract the unique value
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="expressionValue"></param>
        /// <param name="context"></param>
        /// <param name="jsonNamingPolicy"></param>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        /// <exception cref="ComparisonNotEnoughArgumentException"></exception>
        /// <exception cref="ComparisonTooManyArgumentException"></exception>
        private static object GetUniqueValue <T>(ParameterExpression parameter, ExpressionValue expressionValue,
                                                 RSqlQueryParser.ComparisonContext context,
                                                 JsonNamingPolicy jsonNamingPolicy = null)
        {
            var value = context.arguments().value();

            if (value.Length > 1)
            {
                throw new ComparisonTooManyArgumentException(context);
            }

            return(RSqlQueryGetValueHelper.GetValue <T>(parameter, expressionValue, context, jsonNamingPolicy));
        }
        /// <summary>
        ///     create is null expression ( operator "=is-null=" or "=nil=" )
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="context"></param>
        /// <param name="jsonNamingPolicy"></param>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression <Func <T, bool> > GetIsNullExpression <T>(ParameterExpression parameter,
                                                                           RSqlQueryParser.ComparisonContext context,
                                                                           JsonNamingPolicy jsonNamingPolicy = null)
        {
            var expressionValue = GetSelector <T>(parameter, context, jsonNamingPolicy);

            if (!RSqlQueryGetValueHelper.IsNullableComparisonType(expressionValue.Property.PropertyType))
            {
                throw new ComparisonInvalidComparatorSelectionException(context);
            }

            var values = RSqlQueryGetValueHelper.GetValues(typeof(bool), context.arguments());

            if (!values.Any())
            {
                throw new ComparisonNotEnoughArgumentException(context);
            }

            if (values.Count > 1)
            {
                throw new ComparisonTooManyArgumentException(context);
            }

            var result = Expression.Lambda <Func <T, bool> >(Expression.Equal(
                                                                 expressionValue.Expression,
                                                                 Expression.Constant(null, typeof(object))), parameter);

            if ((bool)values[0])
            {
                return(result);
            }

            var body = Expression.Not(result.Body);

            result = Expression.Lambda <Func <T, bool> >(body, parameter);
            return(result);
        }
Exemplo n.º 6
0
        public static object GetNumericValue <T>(ParameterExpression parameter, ExpressionValue expressionValue,
                                                 RSqlQueryParser.ComparisonContext context,
                                                 JsonNamingPolicy jsonNamingPolicy = null)
        {
            if (IsShort(expressionValue.Property.PropertyType))
            {
                return(GetShort <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsLong(expressionValue.Property.PropertyType))
            {
                return(GetLong <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsFloat(expressionValue.Property.PropertyType))
            {
                return(GetFloat <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsDouble(expressionValue.Property.PropertyType))
            {
                return(GetDouble <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsDecimal(expressionValue.Property.PropertyType))
            {
                return(GetDecimal <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            if (IsByte(expressionValue.Property.PropertyType))
            {
                return(GetByte <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
            }

            return(GetInt <T>(parameter, context.arguments().value()[0], jsonNamingPolicy));
        }
 public ComparisonInvalidMatchTypeException(RSqlQueryParser.ComparisonContext origin,
                                            Exception innerException = null) : base(origin,
                                                                                    $"Invalid comparison match type : {origin?.selector()?.GetText()} and {origin?.arguments()?.GetText()}",
                                                                                    innerException)
 {
 }
        /// <summary>
        ///     create like expression
        /// </summary>
        /// <returns></returns>
        private static Expression <Func <T, bool> > GetLkExpression <T>(ParameterExpression parameter,
                                                                        RSqlQueryParser.ComparisonContext context,
                                                                        JsonNamingPolicy jsonNamingPolicy = null)
        {
            var expressionValue = GetSelector <T>(parameter, context, jsonNamingPolicy);
            var values          = RSqlQueryGetValueHelper.GetValues(expressionValue.Property.PropertyType, context.arguments());

            if (values.Count > 1)
            {
                throw new ComparisonTooManyArgumentException(context);
            }

            var criteria = Convert.ToString(values[0]) ?? string.Empty;
            var maskStar = "{" + Guid.NewGuid() + "}";

            criteria = criteria.Replace(@"\*", maskStar);
            MethodInfo method;

            if (!criteria.Contains('*'))
            {
                criteria += '*';
            }

            if (criteria.StartsWith("*", StringComparison.Ordinal) && criteria.EndsWith("*", StringComparison.Ordinal))
            {
                method = QueryReflectionHelper.MethodStringContains;
            }
            else if (criteria.StartsWith("*", StringComparison.Ordinal))
            {
                method = QueryReflectionHelper.MethodStringEndsWith;
            }
            else
            {
                method = QueryReflectionHelper.MethodStringStartsWith;
            }

            criteria = criteria.Replace("*", "").Replace(maskStar, "*");
            return(Expression.Lambda <Func <T, bool> >(Expression.Call(expressionValue.Expression,
                                                                       method,
                                                                       Expression.Constant(criteria, expressionValue.Property.PropertyType)), parameter));
        }
 /// <summary>
 /// extract the multi value
 /// </summary>
 /// <param name="expressionValue"></param>
 /// <param name="context"></param>
 /// <returns></returns>
 /// <exception cref="ComparisonNotEnoughArgumentException"></exception>
 private static List <object> GetMultipleValue(ExpressionValue expressionValue,
                                               RSqlQueryParser.ComparisonContext context)
 {
     return(RSqlQueryGetValueHelper.GetValues(expressionValue.Property.PropertyType, context.arguments()));
 }