Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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();
                }
            }
        }
Exemple #4
0
 public SubQueryExists(Join join)
 {
     Join = join;
 }