/// <summary> /// Is this an equi-join predicate involving columns from the specified tables? /// On output, if this was indeed an equijoin predicate, "leftVar" is the /// column of the left table, while "rightVar" is the column of the right table /// and the predicate itself is of the form "leftVar = rightVar" /// </summary> /// <param name="simplePredicateNode">the simple predicate node</param> /// <param name="leftTableDefinitions">interesting columns of the left table</param> /// <param name="rightTableDefinitions">interesting columns of the right table</param> /// <param name="leftVar">join column of the left table</param> /// <param name="rightVar">join column of the right table</param> /// <returns>true, if this is an equijoin predicate involving columns from the 2 tables</returns> private static bool IsEquiJoinPredicate(Node simplePredicateNode, VarVec leftTableDefinitions, VarVec rightTableDefinitions, out Var leftVar, out Var rightVar) { Var tempLeftVar; Var tempRightVar; leftVar = null; rightVar = null; if (!Predicate.IsEquiJoinPredicate(simplePredicateNode, out tempLeftVar, out tempRightVar)) { return(false); } if (leftTableDefinitions.IsSet(tempLeftVar) && rightTableDefinitions.IsSet(tempRightVar)) { leftVar = tempLeftVar; rightVar = tempRightVar; } else if (leftTableDefinitions.IsSet(tempRightVar) && rightTableDefinitions.IsSet(tempLeftVar)) { leftVar = tempRightVar; rightVar = tempLeftVar; } else { return(false); } return(true); }
internal Predicate GetJoinPredicates(VarVec leftTableDefinitions, VarVec rightTableDefinitions, out Predicate otherPredicates) { Predicate joinPredicate = new Predicate(m_command); otherPredicates = new Predicate(m_command); foreach (Node part in m_parts) { Var leftTableVar; Var rightTableVar; if (Predicate.IsEquiJoinPredicate(part, leftTableDefinitions, rightTableDefinitions, out leftTableVar, out rightTableVar)) { joinPredicate.AddPart(part); } else { otherPredicates.AddPart(part); } } return(joinPredicate); }