public void Visit(AndOperator op) { EnterContext(op, () => { op.Left.Visit(this); op.Right.Visit(this); }); }
public virtual IExpression Clone(AndOperator op) { return(new AndOperator() { Left = CloneAndReturn(op.Left), Right = CloneAndReturn(op.Right) }.Normalize()); }
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); } }
/// <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(); } }
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); } }
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(); }
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 }
void IExpressionVisitor.Visit(AndOperator op) { _clone = Clone(op); }