상속: BranchQueryPlanNode
        protected override IQueryPlanNode VisitJoin(JoinNode node)
        {
            if (node.RightExpression != null)
            {
                node.RightExpression.DiscoverAccessedResources(tableNames);
            }

            return(base.VisitJoin(node));
        }
예제 #2
0
            public override void AddToPlanTree()
            {
                var op      = expression.ExpressionType;
                var lhsVar  = expression.Left.AsReferenceName();
                var rhsVar  = expression.Right.AsReferenceName();
                var lhsVars = expression.Left.DiscoverReferences();
                var rhsVars = expression.Right.DiscoverReferences();

                var lhsPlan = planner.JoinPlansForColumns(lhsVars);
                var rhsPlan = planner.JoinPlansForColumns(rhsVars);

                if (lhsPlan != rhsPlan)
                {
                    // If either the LHS or the RHS is a single column then we can
                    // optimize the join.

                    if (lhsVar != null || rhsVar != null)
                    {
                        // If right column is a single and left column is not then we must
                        // reverse the expression.
                        JoinNode joinNode;
                        if (lhsVar == null)
                        {
                            // Reverse the expressions and the operator
                            joinNode = new JoinNode(rhsPlan.Plan, lhsPlan.Plan, rhsVar, op.Reverse(), expression.Left);
                            planner.MergePlans(rhsPlan, lhsPlan, joinNode);
                        }
                        else
                        {
                            // Otherwise, use it as it is.
                            joinNode = new JoinNode(lhsPlan.Plan, rhsPlan.Plan, lhsVar, op, expression.Right);
                            planner.MergePlans(lhsPlan, rhsPlan, joinNode);
                        }

                        // Return because we are done
                        return;
                    }
                }

                // If we get here either both the lhs and rhs are complex expressions
                // or the lhs and rhs of the variable are not different plans, or
                // the operator is not a conditional.  Either way, we must evaluate
                // this via a natural join of the variables involved coupled with an
                // exhaustive select.  These types of queries are poor performing.

                var columnNames = expression.DiscoverReferences();
                var tablePlan   = planner.JoinPlansForColumns(columnNames);

                tablePlan.UpdatePlan(new ExhaustiveSelectNode(tablePlan.Plan, expression));
            }
예제 #3
0
        protected virtual IQueryPlanNode VisitJoin(JoinNode node)
        {
            var left  = node.Left;
            var right = node.Right;

            if (left != null)
            {
                left = VisitNode(left);
            }
            if (right != null)
            {
                right = VisitNode(right);
            }

            return(new JoinNode(left, right, node.LeftColumnName, node.Operator, node.RightExpression));
        }
예제 #4
0
            public override void AddToPlanTree()
            {
                var op = expression.ExpressionType;
                var lhsVar = expression.Left.AsReferenceName();
                var rhsVar = expression.Right.AsReferenceName();
                var lhsVars = expression.Left.DiscoverReferences();
                var rhsVars = expression.Right.DiscoverReferences();

                var lhsPlan = planner.JoinPlansForColumns(lhsVars);
                var rhsPlan = planner.JoinPlansForColumns(rhsVars);

                if (lhsPlan != rhsPlan) {
                    // If either the LHS or the RHS is a single column then we can
                    // optimize the join.

                    if (lhsVar != null || rhsVar != null) {
                        // If right column is a single and left column is not then we must
                        // reverse the expression.
                        JoinNode joinNode;
                        if (lhsVar == null) {
                            // Reverse the expressions and the operator
                            joinNode = new JoinNode(rhsPlan.Plan, lhsPlan.Plan, rhsVar, op.Reverse(), expression.Left);
                            planner.MergePlans(rhsPlan, lhsPlan, joinNode);
                        } else {
                            // Otherwise, use it as it is.
                            joinNode = new JoinNode(lhsPlan.Plan, rhsPlan.Plan, lhsVar, op, expression.Right);
                            planner.MergePlans(lhsPlan, rhsPlan, joinNode);
                        }

                        // Return because we are done
                        return;
                    }
                }

                // If we get here either both the lhs and rhs are complex expressions
                // or the lhs and rhs of the variable are not different plans, or
                // the operator is not a conditional.  Either way, we must evaluate
                // this via a natural join of the variables involved coupled with an
                // exhaustive select.  These types of queries are poor performing.

                var columnNames = expression.DiscoverReferences();
                var tablePlan = planner.JoinPlansForColumns(columnNames);
                tablePlan.UpdatePlan(new ExhaustiveSelectNode(tablePlan.Plan, expression));
            }
예제 #5
0
        protected virtual IQueryPlanNode VisitJoin(JoinNode node)
        {
            var left = node.Left;
            var right = node.Right;
            if (left != null)
                left = VisitNode(left);
            if (right != null)
                right = VisitNode(right);

            return new JoinNode(left, right, node.LeftColumnName, node.Operator, node.RightExpression);
        }
예제 #6
0
        protected override IQueryPlanNode VisitJoin(JoinNode node)
        {
            if (node.RightExpression != null)
                node.RightExpression.DiscoverTableNames(tableNames);

            return base.VisitJoin(node);
        }