Esempio n. 1
0
 public void Visit(AndOperator op)
 {
     EnterContext(op, () =>
     {
         op.Left.Visit(this);
         op.Right.Visit(this);
     });
 }
Esempio n. 2
0
 public virtual IExpression Clone(AndOperator op)
 {
     return(new AndOperator()
     {
         Left = CloneAndReturn(op.Left),
         Right = CloneAndReturn(op.Right)
     }.Normalize());
 }
Esempio n. 3
0
 public virtual void Visit(AndOperator op)
 {
     AddParenthesesIfNeeded(op, () =>
     {
         op.Left.Visit(this);
         Writer.Write(" and ");
         op.Right.Visit(this);
     });
 }
 public void Visit(AndOperator op)
 {
     _conditionWriter.WriteStartElement("and");
     foreach (var part in BinaryOperator.Flatten(op))
     {
         part.Visit(this);
     }
     _conditionWriter.WriteEndElement();
 }
 public void Visit(AndOperator op)
 {
     if (Criteria.Count > 0)
     {
         throw new NotSupportedException();
     }
     foreach (var criteria in BinaryOperator.Flatten(op))
     {
         criteria.Visit(this);
     }
 }
Esempio n. 6
0
 /// <summary>
 /// Add a condition to the <see cref="Where"/> clause using an <see cref="AndOperator"/>.
 /// </summary>
 /// <param name="expr">Expression to add</param>
 public void AddCondition(IExpression expr)
 {
     if (Where == null)
     {
         Where = expr;
     }
     else
     {
         Where = new AndOperator()
         {
             Left  = Where,
             Right = expr
         }.Normalize();
     }
 }
Esempio n. 7
0
        private void VisitWhere(List <IExpression> criteria)
        {
            if (criteria.Count > 0)
            {
                var expr = criteria[0];
                foreach (var otherExpr in criteria.Skip(1))
                {
                    expr = new AndOperator()
                    {
                        Left  = expr,
                        Right = otherExpr
                    };
                }

                if (_hasFromOrSelect)
                {
                    Writer.Write(" where ");
                }
                expr.Visit(this);
            }
        }
Esempio n. 8
0
        private IExpression ProcessFilter(XElement elem, FilterSettings settings, PropertyReference prop)
        {
            var elemName = elem.Name.LocalName.ToLowerInvariant();

            switch (elemName)
            {
            case "property":
                return(settings.ItemCallback(elem.Attribute("query_items_xpath")?.Value)
                       .GetProperty(new[] { elem.Attribute("name")?.Value }));

            case "constant":
                if (long.TryParse(elem.Value, out var lng) ||
                    double.TryParse(elem.Value, out var dbl) ||
                    DateTime.TryParse(elem.Value, out var date))
                {
                    return(new ObjectLiteral(elem.Value, prop, _context));
                }
                else if (elem.Value.IndexOf('$') >= 0)
                {
                    return(ReplaceParameters(elem.Value));
                }
                else
                {
                    return(new StringLiteral(elem.Value));
                }

            case "count":
                var path = elem.Element("query_reference_path").Value.Split('/');

                var result = new CountAggregate();
                foreach (var table in path.Select(s => settings.Joins[s].Right))
                {
                    result.TablePath.Add(table);
                }
                return(result);

            case "eq":
            case "ne":
            case "gt":
            case "ge":
            case "lt":
            case "le":
            case "like":
                var left  = ProcessFilter(elem.Elements().First(), settings, prop);
                var right = ProcessFilter(elem.Elements().ElementAt(1), settings, left as PropertyReference);

                if (left is CountAggregate cnt &&
                    right is IntegerLiteral iLit &&
                    Parents(elem)
                    .All(p => string.Equals(p.Name.LocalName, "condition", StringComparison.OrdinalIgnoreCase) ||
                         string.Equals(p.Name.LocalName, "and", StringComparison.OrdinalIgnoreCase)) &&
                    ((elemName == "gt" && iLit.Value == 0) ||
                     (elemName == "ge" && iLit.Value == 1)))
                {
                    var refPath = elem.Element("count").Element("query_reference_path").Value.Split('/');
                    foreach (var join in refPath.Select(s => settings.Joins[s]))
                    {
                        join.Type = JoinType.Inner;
                    }
                    return(IgnoreNode.Instance);
                }

                switch (elemName)
                {
                case "eq":
                    return(new EqualsOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "ne":
                    return(new NotEqualsOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "gt":
                    return(new GreaterThanOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "ge":
                    return(new GreaterThanOrEqualsOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "lt":
                    return(new LessThanOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "le":
                    return(new LessThanOrEqualsOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                case "like":
                    right = AmlLikeParser.Instance.Parse(right.ToString());
                    return(new LikeOperator()
                    {
                        Left = left, Right = right
                    }.Normalize());

                default:
                    throw new InvalidOperationException();
                }

            case "null":
                return(new IsOperator()
                {
                    Left = ProcessFilter(elem.Elements().First(), settings, prop),
                    Right = IsOperand.Null
                }.Normalize());

            case "and":
            case "or":
                var children = elem.Elements()
                               .Select(e => ProcessFilter(e, settings, prop))
                               .ToArray();
                if (children.Length < 1)
                {
                    throw new InvalidOperationException();
                }
                else if (children.Length == 1)
                {
                    return(children[0]);
                }
                else if (string.Equals(elem.Name.LocalName, "and", StringComparison.OrdinalIgnoreCase))
                {
                    var expr = new AndOperator()
                    {
                        Left  = children[0],
                        Right = children[1]
                    }.Normalize();
                    for (var i = 2; i < children.Length; i++)
                    {
                        expr = new AndOperator()
                        {
                            Left  = expr,
                            Right = children[i]
                        }.Normalize();
                    }
                    return(expr);
                }
                else if (string.Equals(elem.Name.LocalName, "or", StringComparison.OrdinalIgnoreCase))
                {
                    var expr = new OrOperator()
                    {
                        Left  = children[0],
                        Right = children[1]
                    }.Normalize();
                    for (var i = 2; i < children.Length; i++)
                    {
                        expr = new OrOperator()
                        {
                            Left  = expr,
                            Right = children[i]
                        }.Normalize();
                    }
                    return(expr);
                }
                break;

            case "not":
                return(new NotOperator()
                {
                    Arg = ProcessFilter(elem.Elements().First(), settings, prop)
                }.Normalize());

            case "condition":
                return(ProcessFilter(elem.Elements().First(), settings, prop));
            }
            throw new InvalidOperationException();
        }
Esempio n. 9
0
 public virtual void Visit(AndOperator op)
 {
     op.Left.Visit(this);
     op.Right.Visit(this);
 }
        public void Visit(QueryItem query)
        {
            var refId = Guid.NewGuid().ToArasId();

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryDefinition");
            _writer.WriteAttributeString("action", "qry_ExecuteQueryDefinition");

            _writer.WriteStartElement("Relationships");

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryItem");
            _writer.WriteElementString("alias", query.Alias);
            _writer.WriteStartElement("item_type");
            _writer.WriteAttributeString("keyed_name", query.Type);
            _writer.WriteEndElement();
            _writer.WriteElementString("ref_id", refId);

            if (!query.Select.All(s => s.Expression is PropertyReference))
            {
                throw new NotSupportedException();
            }

            if (!query.OrderBy.All(s => s.Expression is PropertyReference))
            {
                throw new NotSupportedException();
            }

            _writer.WriteStartElement("Relationships");

            foreach (var select in query.Select)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryItemSelectProperty");
                _writer.WriteElementString("property_name", ((PropertyReference)select.Expression).Name);
                _writer.WriteEndElement(); // Item
            }

            var idx = 10;

            foreach (var orderBy in query.OrderBy)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryItemSortProperty");
                _writer.WriteElementString("property_name", ((PropertyReference)orderBy.Expression).Name);
                _writer.WriteElementString("sort_order_direction", orderBy.Ascending ? "asc" : "desc");
                _writer.WriteElementString("sort_order", _context.Format(idx));
                _writer.WriteEndElement(); // Item
                idx += 10;
            }

            _writer.WriteEndElement(); // Relationships

            var where = query.Where;
            if (query.Version is CurrentVersion)
            {
                where = new AndOperator()
                {
                    Left  = where,
                    Right = new EqualsOperator()
                    {
                        Left  = new PropertyReference("is_current", query),
                        Right = new BooleanLiteral(true)
                    }.Normalize()
                }.Normalize();
            }

            if (where != null)
            {
                using (var strWriter = new StringWriter())
                    using (_conditionWriter = XmlWriter.Create(strWriter, new XmlWriterSettings()
                    {
                        OmitXmlDeclaration = true
                    }))
                    {
                        _conditionWriter.WriteStartElement("condition");
                        query.Where.Visit(this);
                        _conditionWriter.WriteEndElement();

                        _conditionWriter.Flush();
                        strWriter.Flush();

                        _writer.WriteStartElement("filter_xml");
                        _writer.WriteCData(strWriter.ToString());
                        _writer.WriteEndElement();
                    }
                _conditionWriter = null;
            }

            if (query.Offset.HasValue || query.Fetch.HasValue)
            {
                using (var strWriter = new StringWriter())
                    using (_conditionWriter = XmlWriter.Create(strWriter, new XmlWriterSettings()
                    {
                        OmitXmlDeclaration = true
                    }))
                    {
                        _conditionWriter.WriteStartElement("configuration");
                        _conditionWriter.WriteStartElement("option");
                        if (query.Offset.HasValue)
                        {
                            _conditionWriter.WriteElementString("offset", _context.Format(query.Offset));
                        }
                        if (query.Fetch.HasValue)
                        {
                            _conditionWriter.WriteElementString("fetch", _context.Format(query.Fetch));
                        }
                        _conditionWriter.WriteEndElement();
                        _conditionWriter.WriteEndElement();

                        _conditionWriter.Flush();
                        strWriter.Flush();

                        _writer.WriteStartElement("offset_fetch_xml");
                        _writer.WriteCData(strWriter.ToString());
                        _writer.WriteEndElement();
                    }
                _conditionWriter = null;
            }

            _writer.WriteEndElement(); // Item

            foreach (var param in _parameters)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryParameter");
                _writer.WriteElementString("name", param.Name);
                _writer.WriteEndElement(); // Item
            }

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryReference");
            _writer.WriteElementString("child_ref_id", refId);
            _writer.WriteEndElement(); // Item

            _writer.WriteEndElement(); // Relationships
            _writer.WriteEndElement(); // Item
        }
Esempio n. 11
0
 void IExpressionVisitor.Visit(AndOperator op)
 {
     _clone = Clone(op);
 }