public virtual IExpression Clone(InOperator op) { _prop = op.Left as PropertyReference; return(new InOperator() { Left = CloneAndReturn(op.Left), Right = CloneAndReturn(op.Right) }.Normalize()); }
protected virtual void Visit(InOperator op, bool not) { AddParenthesesIfNeeded(op, () => { op.Left.Visit(this); Writer.Write((not ? " not" : "") + " in "); op.Right.Visit(this); }); }
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); }
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(); }