public virtual IExpression Clone(InOperator op)
 {
     _prop = op.Left as PropertyReference;
     return(new InOperator()
     {
         Left = CloneAndReturn(op.Left),
         Right = CloneAndReturn(op.Right)
     }.Normalize());
 }
Exemple #2
0
 protected virtual void Visit(InOperator op, bool not)
 {
     AddParenthesesIfNeeded(op, () =>
     {
         op.Left.Visit(this);
         Writer.Write((not ? " not" : "") + " in ");
         op.Right.Visit(this);
     });
 }
Exemple #3
0
 public void Visit(InOperator op)
 {
     Visit(op, false);
 }
 public virtual void Visit(InOperator op)
 {
     op.Left.Visit(this);
     op.Right.Visit(this);
 }
 public void Visit(InOperator op)
 {
     op.ToConditional().Visit(this);
 }
 void IExpressionVisitor.Visit(InOperator op)
 {
     _clone = Clone(op);
 }
Exemple #7
0
        internal IExpression Parse(QueryItem table, IPropertyDefinition prop, string value, Condition condition = Condition.Undefined)
        {
            var propRef = new PropertyReference(prop.NameProp().Value
                                                ?? prop.KeyedName().Value
                                                ?? prop.IdProp().KeyedName().Value, table);
            var meta = prop.Metadata();

            if (meta.DataType().Value == "item")
            {
                propRef = new PropertyReference("keyed_name", propRef.GetOrAddTable(table.Context));
            }

            var expressions = new List <IExpression>();
            var values      = default(IEnumerable <string>);

            switch (condition)
            {
            case Condition.Undefined:
            case Condition.Equal:
            case Condition.NotEqual:
            case Condition.Like:
            case Condition.NotLike:
                values = SplitOr(value);
                break;

            default:
                values = new[] { value };
                break;
            }

            foreach (var val in values)
            {
                if ((val == "*" || (val == "%" && String.IsPercentWildcard)) && condition == Condition.Undefined)
                {
                    expressions.Add(new LikeOperator()
                    {
                        Left  = propRef,
                        Right = AmlLikeParser.Instance.Parse("%")
                    }.Normalize());
                }
                else if (condition == Condition.IsNotNull)
                {
                    return(new IsOperator()
                    {
                        Left = propRef,
                        Right = IsOperand.NotNull
                    }.Normalize());
                }
                else if (condition == Condition.IsNull)
                {
                    return(new IsOperator()
                    {
                        Left = propRef,
                        Right = IsOperand.Null
                    }.Normalize());
                }
                else
                {
                    switch (meta.DataType().AsString("").ToLowerInvariant())
                    {
                    case "boolean":
                        expressions.Add(Boolean.Parse(propRef, val, condition));
                        break;

                    case "date":
                        expressions.Add(Date.Parse(propRef, val, condition));
                        break;

                    case "decimal":
                    case "float":
                    case "integer":
                        expressions.Add(Number.Parse(propRef, val, condition));
                        break;

                    default:
                        expressions.Add(String.Parse(propRef, val, condition));
                        break;
                    }
                }
            }

            var addNotOperator = expressions.Count > 0 && expressions.All(e => e is NotOperator);

            if (addNotOperator)
            {
                expressions = expressions.Cast <NotOperator>().Select(n => n.Arg).ToList();
            }

            var result = default(IExpression);

            if (expressions.Count > 0 && expressions.All(e => e is EqualsOperator eq && eq.Right is IOperand))
            {
                var list = new ListExpression();
                foreach (var op in expressions.Cast <EqualsOperator>().Select(e => (IOperand)e.Right))
                {
                    list.Values.Add(op);
                }
                result = new InOperator()
                {
                    Left  = propRef,
                    Right = list
                }.Normalize();
            }