public static QueryIterator join(QueryIterator left, Table right, ExprList condition, ExecutionContext execCxt) { return joinWorker(left, right, INNER, condition, execCxt) ; }
public static QueryIterator joinWorker(QueryIterator left, Table right, JoinType joinType, ExprList conditions, ExecutionContext execCxt) { if ( right.isEmpty() ) { if ( joinType == INNER ) { // No rows - no match left.close() ; return QueryIterNullIterator.create(execCxt) ; } else // Left join - pass out left rows regardless of conditions. return left ; } if ( TableUnit.isTableUnit(right) ) return applyConditions(left, conditions, execCxt) ; return joinWorkerN(left, right, joinType, conditions, execCxt) ; }
private void test(Table left, Table right, boolean normalJoin, ExprList exprs, Table expected) { ExecutionContext execCxt = new ExecutionContext(ARQ.getContext(), null, null, null) ; QueryIterator leftIter = left.iterator(execCxt) ; QueryIterator qIter = normalJoin ? TableJoin.join(leftIter, right, exprs, execCxt) : TableJoin.leftJoin(leftIter, right, exprs, execCxt) ; // Order issues Set<String> vars1 = new HashSet<>() ; vars1.addAll(left.getVarNames()) ; vars1.addAll(right.getVarNames()) ; TableN results = new TableN(qIter) ; boolean b = TableCompare.equalsByTerm(expected, results) ; if ( !b ) { System.out.println("** Expected") ; System.out.println(expected) ; System.out.println("** Actual") ; System.out.println(results) ; } assertTrue(b) ; }
@Override public QueryIterator join(JoinKey joinKey, Table left, Table right, ExprList conditions) { return TableJoin.leftJoin(left.iterator(null), right, conditions, null) ; } }
@Override public QueryIterator join(JoinKey joinKey, Table left, Table right, ExprList conditions) { return TableJoin.join(left.iterator(null), right, null, null) ; }
public static QueryIterator leftJoin(QueryIterator left, Table right, ExprList condition, ExecutionContext execCxt) { return joinWorker(left, right, LEFT, condition, execCxt) ; }
private Table joinWorker(Table tableLeft, Table tableRight, boolean leftJoin, ExprList conditions) { QueryIterator left = tableLeft.iterator(execCxt) ; JoinType joinType = (leftJoin? JoinType.LEFT : JoinType.INNER ) ; QueryIterator qIter = TableJoin.joinWorker(left, tableRight, joinType, conditions, execCxt) ; tableLeft.close() ; tableRight.close() ; // qIter and left should be properly closed by use or called code. return new TableN(qIter) ; }