Beispiel #1
0
 private void PrintTableReferenceRecurse(TableReference aTableReference)
 {
     if (aTableReference.GetType() == typeof(NamedTableReference))
     {
         NamedTableReference aNamedTableReference = (NamedTableReference)aTableReference;
         Identifier          aAliasIdentifier     = aNamedTableReference.Alias;
         SchemaObjectName    aSchemaObjectName    = aNamedTableReference.SchemaObject;
         AddLogText(string.Format("Table Reference Schema.Base={0}.{1}",
                                  (aSchemaObjectName.SchemaIdentifier != null) ? aSchemaObjectName.SchemaIdentifier.Value : "",
                                  (aSchemaObjectName.BaseIdentifier != null) ? aSchemaObjectName.BaseIdentifier.Value : "")
                    );
         //foreach (Identifier aSchemaObjectNameIdentifier in aSchemaObjectName.Identifiers)
         //{
         //    AddText(string.Format("Table Reference Identifier={0}", aSchemaObjectNameIdentifier.Value));
         //}
         if (aAliasIdentifier != null)
         {
             AddLogText(string.Format("Table Reference Alias:{0}", aAliasIdentifier.Value));
         }
         aColumnInfoList.AddTableReference(aSchemaObjectName, aAliasIdentifier);
     }
     if (aTableReference.GetType() == typeof(QualifiedJoin))
     {
         QualifiedJoin aQualifiedJoin = (QualifiedJoin)aTableReference;
         AddLogText(string.Format("Table Reference QualifiedJoinType ={0}", aQualifiedJoin.QualifiedJoinType));
         PrintTableReferenceRecurse(aQualifiedJoin.FirstTableReference);
         PrintTableReferenceRecurse(aQualifiedJoin.SecondTableReference);
     }
     if (aTableReference.GetType() == typeof(JoinTableReference))
     {
         JoinTableReference aJoinTableReference = (JoinTableReference)aTableReference;
         PrintTableReferenceRecurse(aJoinTableReference.FirstTableReference);
         PrintTableReferenceRecurse(aJoinTableReference.SecondTableReference);
     }
 }
Beispiel #2
0
        public override void ExplicitVisit(QualifiedJoin aQualifiedJoin)
        {
            ScalarExpressionVisitor seVisitor = new ScalarExpressionVisitor(Context);

            aQualifiedJoin.AcceptChildren(seVisitor);
            AddJoin(aQualifiedJoin.QualifiedJoinType, seVisitor.Columns);
        }
        private void Pro(QualifiedJoin join)
        {
            if (join != null)
            {
                if (join.FirstTableReference is QualifiedJoin)
                {
                    this.Pro(join.FirstTableReference as QualifiedJoin);
                }

                if (join.FirstTableReference is NamedTableReference)
                {
                    this.Process(join.FirstTableReference as NamedTableReference);
                }

                if (join.SecondTableReference is QualifiedJoin)
                {
                    this.Pro(join.SecondTableReference as QualifiedJoin);
                }

                if (join.SecondTableReference is NamedTableReference)
                {
                    this.Process(join.SecondTableReference as NamedTableReference);
                }
            }
        }
Beispiel #4
0
        /*A chaque join trouvé dans la requête*/
        public override void Visit(QualifiedJoin node)
        {
            /*On récupére l'information en un string pour pouvoir effectuer des opérations dessus
             * On enlève toutes les majuscules*/
            string study = GetNodeTokenText(node).ToLower();

            /*Inialisation de la regex pour trouver les sélections, tout ce qu'il y a après le "on" d'un join*/
            Regex regex = new Regex(@"[(/r)|\s+]+on[^A-z].*((\s+)*(substring\([A-z.,'\s+\(\)0-9]*\))|(\s+)*[A-z.0-9]*[\s+]*=[\s+]*[A-z_.0-9]*|(\s+)*[A-z.0-9]*[\s+]=[\s+]*\([A-z\s+0-9.=!\(\]]*\)|(\s+)*[A-z.(\s+)]*=[\s+]*\([A-z\s+0-9 .\[\]=!><\(\),']*\)|((\s+)*(and|or).*)*)?");
            Match match = regex.Match(study);

            /*Tant qu'on trouve une clause sélection à récupérer*/
            while (match.Success)
            {
                /*On l'extrait de la chaine de caractère*/
                string tmp = study.Substring(match.Index, match.Length);
                /*Si la selection contient un or ou un and, on appelle la méthode seperate qui va séparer les clauses*/
                if (tmp.Contains("or") || tmp.Contains("and"))
                {
                    seperate(tmp);
                }
                else
                {
                    /*Sinon, on enleve toute les informations superflux ex : "on" du join
                     * avant de l'ajouter à selection, on regarde si elle y est déjà*/
                    if (!selection.Contains(tmp.Substring(tmp.IndexOf("on ") + 2, tmp.Length - tmp.IndexOf("on ") - 2)))
                    {
                        selection += "|" + tmp.Substring(tmp.IndexOf("on ") + 2, tmp.Length - tmp.IndexOf("on ") - 2);
                    }
                }
                /*On enlève la selection trouvée de la chaine initiale et on cherche si il en existe une autre*/
                study = study.Substring(0, match.Index) + " " + study.Substring(match.Index + match.Length, study.Length - (match.Index + match.Length));
                match = regex.Match(study);
            }
        }
        internal void GetJoins(QualifiedJoin qualifiedJoin)
        {
            gsJoin join = new gsJoin();

            join.JoinType = qualifiedJoin.QualifiedJoinType.ToJoinType();

            if (qualifiedJoin.FirstTableReference is QualifiedJoin)
            {
                GetJoins(qualifiedJoin.FirstTableReference as QualifiedJoin);
            }
            else if (qualifiedJoin.FirstTableReference is NamedTableReference)
            {
                join.TableA = GetTable(qualifiedJoin.FirstTableReference as NamedTableReference);
            }
            else if (qualifiedJoin.FirstTableReference is QueryDerivedTable)
            {
                join.TableA = GetTable(qualifiedJoin.FirstTableReference as QueryDerivedTable);
            }
            else
            {
                throw new NotImplementedException($"Join table reference of type {qualifiedJoin.FirstTableReference.GetType().Name} not supported");
            }

            if (qualifiedJoin.SecondTableReference is QualifiedJoin)
            {
                GetJoins(qualifiedJoin.SecondTableReference as QualifiedJoin);
            }
            else if (qualifiedJoin.SecondTableReference is NamedTableReference)
            {
                join.TableB = GetTable(qualifiedJoin.SecondTableReference as NamedTableReference);
            }
            else if (qualifiedJoin.SecondTableReference is QueryDerivedTable)
            {
                join.TableB = GetTable(qualifiedJoin.SecondTableReference as QueryDerivedTable);
            }
            else
            {
                throw new NotImplementedException($"Join table reference of type {qualifiedJoin.SecondTableReference.GetType().Name} not supported");
            }

            join.JoinClause = new gsWhereClauseParser().GetWhereClause(qualifiedJoin.SearchCondition);

            // SqlOm Join syntax is problematic when using the overload with WhereClause.
            // Left table is not needed, so we pass the last right table just to be valid for compilation.
            try {
                if (join.TableA == null)
                {
                    join.TableA = Joins.Last().TableB;
                }
                if (join.TableB == null)
                {
                    join.TableB = Joins.Last().TableB;
                }
            }
            catch {
                throw new NotImplementedException("Join.JoinClause.Terms is only supported as WhereTermCompare");
            }

            Joins.Add(join);
        }
Beispiel #6
0
        protected override object InternalVisit(QualifiedJoin node)
        {
            //this should return a tuple of string,recordtable
            //the name will probably be null, i dont seem to have access to the alias here.
            var first  = Visit <IResultTable>(node.FirstTableReference);
            var second = Visit <IResultTable>(node.SecondTableReference);

            var env = Database.GlobalEnvironment.NewChild();

            var where = new WhereClause()
            {
                SearchCondition = node.SearchCondition
            };
            var predicate = EvaluateExpression <Func <IResultRow, bool> >(where, env, row => true);

            if (predicate == null)
            {
                predicate = (row) => true;
            }
            if (node.QualifiedJoinType == QualifiedJoinType.Inner)
            {
                return(new InnerJoinedTable(first, second, predicate));
            }
            else
            {
                return(new OuterJoinedTable(node.QualifiedJoinType, first, second, predicate));
            }
        }
Beispiel #7
0
 private void PrintTableReferenceRecurse(TableReference aTableReference)
 {
     if (aTableReference.GetType() == typeof(NamedTableReference))
     {
         NamedTableReference aNamedTableReference = (NamedTableReference)aTableReference;
         Identifier          aAliasIdentifier     = aNamedTableReference.Alias;
         SchemaObjectName    aSchemaObjectName    = aNamedTableReference.SchemaObject;
         AddLogText(string.Format("Table Reference Server.Database.Schema.Base={0}.{1}.{2}.{3}",
                                  (aSchemaObjectName.ServerIdentifier != null) ? aSchemaObjectName.ServerIdentifier.Value : "",
                                  (aSchemaObjectName.DatabaseIdentifier != null) ? aSchemaObjectName.DatabaseIdentifier.Value : "",
                                  (aSchemaObjectName.SchemaIdentifier != null) ? aSchemaObjectName.SchemaIdentifier.Value : "",
                                  (aSchemaObjectName.BaseIdentifier != null) ? aSchemaObjectName.BaseIdentifier.Value : "")
                    );
         if (aAliasIdentifier != null)
         {
             AddLogText(string.Format("Table Reference Alias:{0}", aAliasIdentifier.Value));
         }
         AddTableReference(aSchemaObjectName, aAliasIdentifier);
     }
     if (aTableReference.GetType() == typeof(QualifiedJoin))
     {
         QualifiedJoin aQualifiedJoin = (QualifiedJoin)aTableReference;
         AddLogText(string.Format("Table Reference QualifiedJoinType ={0}", aQualifiedJoin.QualifiedJoinType.ToString()));
         PrintTableReferenceRecurse(aQualifiedJoin.FirstTableReference);
         PrintTableReferenceRecurse(aQualifiedJoin.SecondTableReference);
     }
     if (aTableReference.GetType() == typeof(JoinTableReference))
     {
         JoinTableReference aJoinTableReference = (JoinTableReference)aTableReference;
         PrintTableReferenceRecurse(aJoinTableReference.FirstTableReference);
         PrintTableReferenceRecurse(aJoinTableReference.SecondTableReference);
     }
 }
 //JOINが発生する場合に呼び出される。
 public override void ExplicitVisit(QualifiedJoin node)
 {
     if (candidateStack.Count > 0)
     {
         TableNameIllegalCandidate candidate = candidateStack.Peek();
         candidate.hasJoin = true;
     }
     base.ExplicitVisit(node);
 }
Beispiel #9
0
        /// <summary>
        /// WHERE句 にコンストラクタで指定された条件式を追加する。
        /// </summary>
        /// <param name="node">WHERE句</param>
        public override void ExplicitVisit(Microsoft.SqlServer.TransactSql.ScriptDom.FromClause node)
        {
            try
            {
                var tableReference = FindTableReference.Compile().Invoke(node);
                if (tableReference != null && QualifiedJoinType.HasValue)
                {
                    tableReference = new QualifiedJoin()
                    {
                        QualifiedJoinType    = QualifiedJoinType.Value,
                        FirstTableReference  = tableReference,
                        SecondTableReference = TableReference,
                        JoinHint             = JoinHint.Value,
                        SearchCondition      = BooleanExpression,
                    };
                }
                else if (tableReference != null && UnqualifiedJoinType.HasValue)
                {
                    tableReference = new UnqualifiedJoin()
                    {
                        UnqualifiedJoinType  = UnqualifiedJoinType.Value,
                        FirstTableReference  = tableReference,
                        SecondTableReference = TableReference,
                    };
                }
                else
                {
                    tableReference = TableReference;
                }

                if (FindTableReference.Body is MemberExpression member)
                {
                    var param = Expression.Parameter(typeof(TableReference), "value");
                    var set   = Expression.Lambda <Action <Microsoft.SqlServer.TransactSql.ScriptDom.FromClause, TableReference> >(
                        Expression.Assign(member, param), FindTableReference.Parameters[0], param);
                    set.Compile().Invoke(node, tableReference);
                }
                else
                {
                    var methodCall = ((MethodCallExpression)FindTableReference.Body).Object;
                    var param      = Expression.Parameter(typeof(TableReference), "value");
                    var set        = Expression.Lambda <Action <Microsoft.SqlServer.TransactSql.ScriptDom.FromClause, TableReference> >(
                        Expression.Assign(Expression.MakeIndex(methodCall, typeof(IList <TableReference>).GetProperty("Item"), new List <Expression>()
                    {
                        ((IArgumentProvider)FindTableReference.Body).GetArgument(0)
                    }), param), FindTableReference.Parameters[0], param);
                    set.Compile().Invoke(node, tableReference);
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("指定された結合条件は追加できません。", e);
            }
        }
Beispiel #10
0
        private void ProcessTableReference(TableReference TableRef)
        {
            string Type = GetFragmentType(TableRef);

            switch (Type)
            {
            case "FullTextTableReference":
                break;

            case "NamedTableReference":
                var    NamedTableRef = (NamedTableReference)TableRef;
                var    Naming        = NamedTableRef.SchemaObject;
                string ObjectName    = (Naming.DatabaseIdentifier == null ? this.databaseName : Naming.DatabaseIdentifier.Value) + "." +
                                       (Naming.SchemaIdentifier == null ? this.schemaName : Naming.SchemaIdentifier.Value) + "." +
                                       (Naming.BaseIdentifier == null ? "" : Naming.BaseIdentifier.Value);
                addSourcetoCurrentObject(ObjectName);

                break;

            case "QueryDerivedTable":
                QueryDerivedTable qdt = (QueryDerivedTable)TableRef;
                ProcessQueryExpression(qdt.QueryExpression);
                break;

            case "QualifiedJoin":
                QualifiedJoin qj = (QualifiedJoin)TableRef;
                ProcessTableReference(qj.FirstTableReference);
                ProcessTableReference(qj.SecondTableReference);
                break;

            case "UnqualifiedJoin":
                UnqualifiedJoin uqj = (UnqualifiedJoin)TableRef;
                ProcessTableReference(uqj.FirstTableReference);
                ProcessTableReference(uqj.SecondTableReference);
                break;

            case "SchemaObjectFunctionTableReference":
                SchemaObjectFunctionTableReference ftr = (SchemaObjectFunctionTableReference)TableRef;
                break;

            case "PivotedTableReference":
                PivotedTableReference pvt = (PivotedTableReference)TableRef;
                ProcessTableReference(pvt.TableReference);
                break;

            default:
                break;
            }
        }
 public override void Visit(QualifiedJoin qualifiedJoin)
 {
     var findEqualityComparisonVisitor = new FindEqualityComparisonVisitor();
     qualifiedJoin.SearchCondition.Accept(findEqualityComparisonVisitor);
     foreach (var equalityComparison in findEqualityComparisonVisitor.Comparisons)
     {
         var firstColumnReferenceExpression = equalityComparison.FirstExpression as ColumnReferenceExpression;
         var secondColumnReferenceExpression = equalityComparison.SecondExpression as ColumnReferenceExpression;
         if (firstColumnReferenceExpression != null && secondColumnReferenceExpression != null)
         {
             var firstColumnResolved = resolveMultiPartIdentifier(firstColumnReferenceExpression.MultiPartIdentifier);
             var secondColumnResolved = resolveMultiPartIdentifier(secondColumnReferenceExpression.MultiPartIdentifier);
             EqualityJoins.Add(new EqualityJoin(firstColumnResolved, secondColumnResolved));
         }
     }
 }
Beispiel #12
0
        /// <summary>
        /// Traverses the joins and gets a list of tables that have been outer joined.
        /// </summary>
        /// <param name="outerJoinedTables">The outer joined tables list.</param>
        /// <param name="qualifiedJoin">The qualified join.</param>
        /// <param name="isParentOuterJoined">if set to <c>true</c> a parent join was outer joined.</param>
        private void FillOuterJoins(List <string> outerJoinedTables, QualifiedJoin qualifiedJoin, bool isParentOuterJoined)
        {
            var tableReferences = new List <TableReference>();

            if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.LeftOuter)
            {
                if (isParentOuterJoined)
                {
                    tableReferences.Add(qualifiedJoin.FirstTableReference);
                }
                tableReferences.Add(qualifiedJoin.SecondTableReference);
            }
            else if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.RightOuter)
            {
                if (isParentOuterJoined)
                {
                    tableReferences.Add(qualifiedJoin.SecondTableReference);
                }
                tableReferences.Add(qualifiedJoin.FirstTableReference);
            }
            else if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.FullOuter || qualifiedJoin.QualifiedJoinType == QualifiedJoinType.Inner)
            {
                if (isParentOuterJoined)
                {
                    tableReferences.Add(qualifiedJoin.FirstTableReference);
                    tableReferences.Add(qualifiedJoin.SecondTableReference);
                }
            }

            foreach (var tableReference in tableReferences)
            {
                var nestedQualifiedJoin = tableReference as QualifiedJoin;
                var namedTableReference = tableReference as NamedTableReference;
                if (nestedQualifiedJoin != null)
                {
                    FillOuterJoins(outerJoinedTables, nestedQualifiedJoin, true);
                }
                else if (namedTableReference != null)
                {
                    var aliasOrName = namedTableReference.Alias != null && !string.IsNullOrEmpty(namedTableReference.Alias.Value)
                        ? namedTableReference.Alias.Value
                        : namedTableReference.SchemaObject.BaseIdentifier.Value;
                    outerJoinedTables.Add(aliasOrName);
                }
            }
        }
        public override void Visit(QualifiedJoin qualifiedJoin)
        {
            var findEqualityComparisonVisitor = new FindEqualityComparisonVisitor();

            qualifiedJoin.SearchCondition.Accept(findEqualityComparisonVisitor);
            foreach (var equalityComparison in findEqualityComparisonVisitor.Comparisons)
            {
                var firstColumnReferenceExpression  = equalityComparison.FirstExpression as ColumnReferenceExpression;
                var secondColumnReferenceExpression = equalityComparison.SecondExpression as ColumnReferenceExpression;
                if (firstColumnReferenceExpression != null && secondColumnReferenceExpression != null)
                {
                    var firstColumnResolved  = resolveMultiPartIdentifier(firstColumnReferenceExpression.MultiPartIdentifier);
                    var secondColumnResolved = resolveMultiPartIdentifier(secondColumnReferenceExpression.MultiPartIdentifier);
                    EqualityJoins.Add(new EqualityJoin(firstColumnResolved, secondColumnResolved));
                }
            }
        }
        /// <inheritdoc />
        public override void ExplicitVisit(QualifiedJoin node)
        {
            if (toRemove.Count > 0)
            {
                node.FirstTableReference  = RemoveReference(node.FirstTableReference);
                node.SecondTableReference = RemoveReference(node.SecondTableReference);
            }

            if (toReplace.TryGetValue(node.FirstTableReference, out var replacement))
            {
                toReplace.Remove(node.FirstTableReference);
                node.FirstTableReference = replacement;
            }

            if (toReplace.TryGetValue(node.SecondTableReference, out replacement))
            {
                toReplace.Remove(node.SecondTableReference);
                node.SecondTableReference = replacement;
            }

            base.ExplicitVisit(node);
        }
Beispiel #15
0
        public override void Visit(QualifiedJoin node)
        {
            string study = GetNodeTokenText(node).ToLower();
            Regex  regex = new Regex(@"[(/r)\s+]+on[^A-z].*((\s+)*(substring\([A-z.,'\s+\(\)0-9]*\))|(\s+)*[A-z.0-9]*[\s+]*=[\s+]*[A-z_.0-9]*|(\s+)*[A-z.0-9]*[\s+]=[\s+]*\([A-z\s+0-9.=!\(\]]*\)|(\s+)*[A-z.(\s+)]*=[\s+]*\([A-z\s+0-9.\[\]=!><\(\),']*\)|((\s+)*(and|or).*)*)?");
            Match  match = regex.Match(study);

            while (match.Success)
            {
                string tmp = study.Substring(match.Index, match.Length);
                if (tmp.Contains("or") || tmp.Contains("and"))
                {
                    seperate(tmp);
                }
                else
                {
                    selection += "|" + tmp.Substring(tmp.IndexOf("on ") + 2, tmp.Length - tmp.IndexOf("on ") - 2);
                }
                study = study.Substring(0, match.Index) + " " + study.Substring(match.Index + match.Length, study.Length - (match.Index + match.Length));
                match = regex.Match(study);
            }
            study = study.Substring(study.IndexOf("on ") + 2, study.Length - study.IndexOf("on ") - 2);
        }
Beispiel #16
0
        public ISyntaxNode Visit(TSqlFragment node, TSqlFragment parent, string sourceProperty, ISyntaxNode result)
        {
            QualifiedJoin join = node as QualifiedJoin;

            if (join == null)
            {
                return(result);
            }

            StatementNode statement = result as StatementNode;

            if (statement == null)
            {
                return(result);
            }

            statement.VisitContext = join; // set current visiting context
            // TODO: how to set VisitingContext to null when QualifiedJoin visiting scope is missed ???
            // TODO: EnterContext !?
            // TODO: ExitContext  !?

            return(result);
        }
Beispiel #17
0
        private IList <TableIdentifier> ProcessJoin(QualifiedJoin joinRef, SqlAction action)
        {
            var identifiers = new List <TableIdentifier>();

            if (joinRef != null)
            {
                HashSet <string> tables;
                switch (action)
                {
                case SqlAction.Delete:
                    tables = DeleteTables;
                    break;

                default:
                    tables = SelectTables;
                    break;
                }

                identifiers.AddRange(ProcessTableReference(joinRef.FirstTableReference, action, tables));

                identifiers.AddRange(ProcessTableReference(joinRef.SecondTableReference, SqlAction.Select));
            }
            return(identifiers);
        }
 public override void ExplicitVisit(QualifiedJoin fragment)
 {
     _fragments.Add(fragment);
 }
Beispiel #19
0
        /// <summary>
        /// Recurse through link-entities to add joins to FROM clause and update SELECT clause
        /// </summary>
        /// <param name="metadata">The metadata cache to use for the conversion</param>
        /// <param name="dataSource">The current data source of the SQL query</param>
        /// <param name="parentTable">The details of the table that this new table is being linked to</param>
        /// <param name="items">The FetchXML items in this entity</param>
        /// <param name="query">The current state of the SQL query being built</param>
        /// <param name="aliasToLogicalName">A mapping of table aliases to the logical name</param>
        /// <param name="nolock">Indicates if the NOLOCK table hint should be applied</param>
        /// <returns>The data source including any required joins</returns>
        private static TableReference BuildJoins(IAttributeMetadataCache metadata, TableReference dataSource, NamedTableReference parentTable, object[] items, QuerySpecification query, IDictionary <string, string> aliasToLogicalName, bool nolock)
        {
            if (items == null)
            {
                return(dataSource);
            }

            // Find any <link-entity> elements to process
            foreach (var link in items.OfType <FetchLinkEntityType>())
            {
                // Store the alias of this link
                if (!String.IsNullOrEmpty(link.alias))
                {
                    aliasToLogicalName[link.alias] = link.name;
                }

                // Create the new table reference
                var table = new NamedTableReference
                {
                    SchemaObject = new SchemaObjectName
                    {
                        Identifiers =
                        {
                            new Identifier
                            {
                                Value = link.name
                            }
                        }
                    },
                    Alias = String.IsNullOrEmpty(link.alias) ? null : new Identifier {
                        Value = link.alias
                    }
                };

                if (nolock)
                {
                    table.TableHints.Add(new TableHint {
                        HintKind = TableHintKind.NoLock
                    });
                }

                // Add the join from the current data source to the new table
                var join = new QualifiedJoin
                {
                    FirstTableReference  = dataSource,
                    SecondTableReference = table,
                    QualifiedJoinType    = link.linktype == "outer" ? QualifiedJoinType.LeftOuter : QualifiedJoinType.Inner,
                    SearchCondition      = new BooleanComparisonExpression
                    {
                        FirstExpression = new ColumnReferenceExpression
                        {
                            MultiPartIdentifier = new MultiPartIdentifier
                            {
                                Identifiers =
                                {
                                    new Identifier {
                                        Value = parentTable.Alias?.Value ?? parentTable.SchemaObject.Identifiers.Last().Value
                                    },
                                    new Identifier {
                                        Value = link.to
                                    }
                                }
                            }
                        },
                        ComparisonType   = BooleanComparisonType.Equals,
                        SecondExpression = new ColumnReferenceExpression
                        {
                            MultiPartIdentifier = new MultiPartIdentifier
                            {
                                Identifiers =
                                {
                                    new Identifier {
                                        Value = link.alias ?? link.name
                                    },
                                    new Identifier {
                                        Value = link.from
                                    }
                                }
                            }
                        }
                    }
                };

                // Update the SELECT clause
                AddSelectElements(query, link.Items, link.alias ?? link.name);

                // Handle any filters within the <link-entity> as additional join criteria
                var filter = GetFilter(metadata, link.Items, link.alias ?? link.name, aliasToLogicalName);
                if (filter != null)
                {
                    var finalFilter = new BooleanBinaryExpression
                    {
                        FirstExpression      = join.SearchCondition,
                        BinaryExpressionType = BooleanBinaryExpressionType.And,
                        SecondExpression     = filter
                    };

                    join.SearchCondition = finalFilter;
                }

                // Recurse into any other links
                dataSource = BuildJoins(metadata, join, (NamedTableReference)join.SecondTableReference, link.Items, query, aliasToLogicalName, nolock);
            }

            return(dataSource);
        }
 private static string JoinTypeName(QualifiedJoin join)
 {
     return Enum.GetName(typeof (QualifiedJoinType), join.QualifiedJoinType).ToLower();
 }
Beispiel #21
0
 public override void ExplicitVisit(QualifiedJoin node)
 {
 }
Beispiel #22
0
        private void recursifRecuperationProjection(QuerySpecification node)
        {
            bool starExpression = false;

            if (node.SelectElements != null)
            {
                foreach (TSqlFragment selectElement in node.SelectElements)
                {
                    if (selectElement is SelectStarExpression)
                    {
                        starExpression = true;
                        if (node.SelectElements.Count > 1)
                        {
                            //Lever une exception qui dit que c'est non géré*

                            break;
                        }
                        else
                        {
                            if (node.FromClause != null)
                            {
                                foreach (TSqlFragment fromElement in node.FromClause.TableReferences)
                                {
                                    if (fromElement is NamedTableReference)
                                    {
                                        String namedTableReferenceText = GetNodeTokenText(fromElement);
                                        projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText));
                                    }
                                    if (fromElement is QualifiedJoin)
                                    {
                                        QualifiedJoin currQualifiedJoin = (QualifiedJoin)fromElement;
                                        if (currQualifiedJoin.FirstTableReference is NamedTableReference && currQualifiedJoin.SecondTableReference is NamedTableReference)
                                        {
                                            String namedTableReferenceText1 = GetNodeTokenText(currQualifiedJoin.FirstTableReference);
                                            projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText1));

                                            String namedTableReferenceText2 = GetNodeTokenText(currQualifiedJoin.SecondTableReference);
                                            projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText2));
                                        }
                                    }
                                    if (fromElement is PivotedTableReference)
                                    {
                                        PivotedTableReference currPivotedTable = (PivotedTableReference)fromElement;
                                        if (currPivotedTable.TableReference is NamedTableReference)
                                        {
                                            String namedTableReferenceText = GetNodeTokenText(currPivotedTable.TableReference);
                                            projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText));
                                        }
                                    }
                                    if (fromElement is QueryDerivedTable)
                                    {
                                        QueryDerivedTable currQueryDerivedTable = (QueryDerivedTable)fromElement;
                                        if (currQueryDerivedTable.QueryExpression is QuerySpecification)
                                        {
                                            QuerySpecification currQuerySpecification = (QuerySpecification)currQueryDerivedTable.QueryExpression;
                                            recursifRecuperationProjection(currQuerySpecification);
                                        }
                                        if (currQueryDerivedTable.QueryExpression is BinaryQueryExpression)
                                        {
                                            //BinaryQueryExpression représente un union entre deux requête donc si on veut les projections dans le cas ou
                                            //Il y à un * il faut prendre les projections de la première requête d'union ou intersection
                                            BinaryQueryExpression currBinaryQueryExpression = (BinaryQueryExpression)currQueryDerivedTable.QueryExpression;


                                            while (currBinaryQueryExpression.FirstQueryExpression is BinaryQueryExpression)
                                            {
                                                currBinaryQueryExpression = (BinaryQueryExpression)currBinaryQueryExpression.FirstQueryExpression;
                                            }
                                            if (currBinaryQueryExpression.FirstQueryExpression is QuerySpecification)
                                            {
                                                QuerySpecification currQuerySpecification = (QuerySpecification)currBinaryQueryExpression.FirstQueryExpression;
                                                recursifRecuperationProjection(currQuerySpecification);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (starExpression == false)
                {
                    foreach (SelectElement selectElement in node.SelectElements)
                    {
                        projectionList.Add(GetNodeTokenText(selectElement));
                    }
                }
            }
        }
Beispiel #23
0
        /// <summary>
        /// Traverses the joins and gets a list of tables that have been outer joined.
        /// </summary>
        /// <param name="outerJoinedTables">The outer joined tables list.</param>
        /// <param name="qualifiedJoin">The qualified join.</param>
        /// <param name="isParentOuterJoined">if set to <c>true</c> a parent join was outer joined.</param>
        private void FillOuterJoins(List<string> outerJoinedTables, QualifiedJoin qualifiedJoin, bool isParentOuterJoined)
        {
            var tableReferences = new List<TableReference>();
            if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.LeftOuter)
            {
                if (isParentOuterJoined) tableReferences.Add(qualifiedJoin.FirstTableReference);
                tableReferences.Add(qualifiedJoin.SecondTableReference);
            }
            else if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.RightOuter)
            {
                if (isParentOuterJoined) tableReferences.Add(qualifiedJoin.SecondTableReference);
                tableReferences.Add(qualifiedJoin.FirstTableReference);
            }
            else if (qualifiedJoin.QualifiedJoinType == QualifiedJoinType.FullOuter || qualifiedJoin.QualifiedJoinType == QualifiedJoinType.Inner)
            {
                if (isParentOuterJoined)
                {
                    tableReferences.Add(qualifiedJoin.FirstTableReference);
                    tableReferences.Add(qualifiedJoin.SecondTableReference);
                }
            }

            foreach (var tableReference in tableReferences)
            {
                var nestedQualifiedJoin = tableReference as QualifiedJoin;
                var namedTableReference = tableReference as NamedTableReference;
                if (nestedQualifiedJoin != null)
                {
                    FillOuterJoins(outerJoinedTables, nestedQualifiedJoin, true);
                }
                else if (namedTableReference != null)
                {
                    var aliasOrName = namedTableReference.Alias != null && !string.IsNullOrEmpty(namedTableReference.Alias.Value)
                        ? namedTableReference.Alias.Value
                        : namedTableReference.SchemaObject.BaseIdentifier.Value;
                    outerJoinedTables.Add(aliasOrName);
                }
            }
        }
Beispiel #24
0
 public override void Visit(QualifiedJoin node) { this.action(node); }
 public override void ExplicitVisit(QualifiedJoin node)
 {
     CommandStatistics.JoinsCount++;
     base.ExplicitVisit(node);
 }
Beispiel #26
0
 public override void ExplicitVisit(QualifiedJoin node)
 {
     CommandStatistics.JoinsCount++;
     base.ExplicitVisit(node);
 }