protected virtual void VisitJoin(Join join) { if (join.Type == JoinType.Inner) { Writer.Write(" inner join "); } else { Writer.Write(" left join "); } WriteTableDefinition(join.Right); Writer.Write(" on "); join.Condition.Visit(this); foreach (var otherJoin in join.Right.Joins.Where(j => j.GetCardinality() == Cardinality.OneToOne)) { VisitJoin(otherJoin); } }
public static bool TryCreate(QueryItem parent, Join join, out AmlJoin amlJoin) { amlJoin = new AmlJoin(); if (!(join.Condition is EqualsOperator eq)) { return(false); } var props = new[] { eq.Left, eq.Right } .OfType <PropertyReference>() .ToArray(); if (props.Length != 2) { return(false); } amlJoin.CurrentProp = props.Single(p => ReferenceEquals(p.Table, parent)); amlJoin.OtherProp = props.Single(p => !ReferenceEquals(p.Table, parent)); amlJoin.Table = amlJoin.OtherProp.Table; return(true); }
public override void WriteEndElement() { var elem = _meta.Count < 1 ? null : _meta.Pop(); var value = _buffer.ToString() ?? ""; _buffer.Length = 0; if (elem is string name) { if (_meta.Peek() is QueryItem item) { switch (elem) { case "alias": item.Alias = value; break; case "item_type": if (_attrBuffer.TryGetValue("keyed_name", out var keyedName)) { item.Type = keyedName; } else if (_attrBuffer.TryGetValue("name", out var type)) { item.Type = type; } else { item.Attributes["typeId"] = value; } break; case "ref_id": item.Attributes["ref_id"] = value; break; case "filter_xml": item.Attributes["filter_xml"] = value; break; case "offset_fetch_xml": var offsetXml = XElement.Parse(value); item.Offset = (int?)offsetXml.Element("option")?.Element("offset"); item.Fetch = (int?)offsetXml.Element("option")?.Element("fetch"); break; } } else if (_meta.Peek() is SelectExpression select) { if (name == "property_name") { item = _meta.OfType <QueryItem>().Last(); select.Expression = new PropertyReference(value, item); } } else if (_meta.Peek() is SortedOrderBy orderBy) { switch (name) { case "property_name": item = _meta.OfType <QueryItem>().Last(); orderBy.Expression = new PropertyReference(value, item); break; case "sort_order": orderBy.SortOrder = int.Parse(value); break; case "sort_order_direction": orderBy.Ascending = value != "desc"; break; } } else if (_meta.Peek() is ParameterReference param) { switch (name) { case "name": param.Name = value; break; case "value": param.DefaultValue = value; break; } } else if (_meta.Peek() is QueryReference queryRef) { switch (name) { case "child_ref_id": queryRef.ChildRefId = value; break; case "filter_xml": queryRef.FilterXml = value; break; case "parent_ref_id": queryRef.ParentRefId = value; break; case "ref_id": queryRef.RefId = value; break; case "start_query_reference_path": queryRef.StartQueryReferencePath = value; break; } } else if (name == "qry_QueryDefinition") { var settings = new FilterSettings() { Items = _items .Where(i => i.Attributes.ContainsKey("ref_id")) .ToDictionary(i => i.Attributes["ref_id"]), }; foreach (var reference in _refs.Where(r => !string.IsNullOrEmpty(r.ParentRefId))) { var parent = settings.Items[reference.ParentRefId]; var child = settings.Items[reference.ChildRefId]; settings.ItemCallback = x => { if (string.Equals(x, "parent::Item", StringComparison.OrdinalIgnoreCase)) { return(parent); } return(child); }; var join = new Join() { Condition = ProcessFilter(XElement.Parse(reference.FilterXml), settings, null), Left = parent, Right = child, Type = JoinType.LeftOuter }; parent.Joins.Add(join); settings.Joins[reference.RefId] = join; } foreach (var i in _items) { if (i.Attributes.TryGetValue("filter_xml", out var filter)) { settings.ItemCallback = x => { if (string.Equals(x, "child::Item", StringComparison.OrdinalIgnoreCase)) { return(i.Joins[0].Right); } return(i); }; i.Attributes.Remove(filter); i.Where = ProcessFilter(XElement.Parse(filter), settings, null); } } var rootRef = _refs.First(r => string.IsNullOrEmpty(r.ParentRefId)); Query = settings.Items[rootRef.ChildRefId]; if (!string.IsNullOrEmpty(rootRef.FilterXml)) { settings.ItemCallback = x => { if (string.Equals(x, "child::Item", StringComparison.OrdinalIgnoreCase)) { return(Query.Joins[0].Right); } return(Query); }; Query.AddCondition(ProcessFilter(XElement.Parse(rootRef.FilterXml), settings, null)); } Query.RebalanceCriteria(); } } }
public SubQueryExists(Join join) { Join = join; }