Search in sources :

Example 1 with SEMI

use of org.apache.calcite.rel.core.JoinRelType.SEMI in project ignite-3 by apache.

the class MergeJoinExecutionTest method verifyJoin.

/**
 * Creates execution tree and executes it. Then compares the result of the execution with the given one.
 *
 * @param left     Data for left table.
 * @param right    Data for right table.
 * @param joinType Join type.
 * @param expRes   Expected result.
 */
private void verifyJoin(Object[][] left, Object[][] right, JoinRelType joinType, Object[][] expRes) {
    ExecutionContext<Object[]> ctx = executionContext(true);
    RelDataType leftType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class);
    ScanNode<Object[]> leftNode = new ScanNode<>(ctx, leftType, Arrays.asList(left));
    RelDataType rightType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class);
    ScanNode<Object[]> rightNode = new ScanNode<>(ctx, rightType, Arrays.asList(right));
    RelDataType outType;
    if (setOf(SEMI, ANTI).contains(joinType)) {
        outType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class);
    } else {
        outType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class, int.class, String.class);
    }
    MergeJoinNode<Object[]> join = MergeJoinNode.create(ctx, outType, leftType, rightType, joinType, (r1, r2) -> {
        Object o1 = r1[2];
        Object o2 = r2[0];
        if (o1 == null || o2 == null) {
            if (o1 != null) {
                return 1;
            } else if (o2 != null) {
                return -1;
            } else {
                return 0;
            }
        }
        return Integer.compare((Integer) o1, (Integer) o2);
    });
    join.register(asList(leftNode, rightNode));
    RelDataType rowType;
    ProjectNode<Object[]> project;
    if (setOf(SEMI, ANTI).contains(joinType)) {
        rowType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class);
        project = new ProjectNode<>(ctx, rowType, r -> new Object[] { r[0], r[1] });
    } else {
        rowType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, String.class);
        project = new ProjectNode<>(ctx, rowType, r -> new Object[] { r[0], r[1], r[4] });
    }
    project.register(join);
    RootNode<Object[]> node = new RootNode<>(ctx, rowType);
    node.register(project);
    ArrayList<Object[]> rows = new ArrayList<>();
    while (node.hasNext()) {
        rows.add(node.next());
    }
    assertThat(rows.toArray(EMPTY), equalTo(expRes));
}
Also used : ArrayUtils.asList(org.apache.ignite.internal.util.ArrayUtils.asList) RelDataType(org.apache.calcite.rel.type.RelDataType) LEFT(org.apache.calcite.rel.core.JoinRelType.LEFT) Arrays(java.util.Arrays) ANTI(org.apache.calcite.rel.core.JoinRelType.ANTI) INNER(org.apache.calcite.rel.core.JoinRelType.INNER) SEMI(org.apache.calcite.rel.core.JoinRelType.SEMI) IsEqual.equalTo(org.hamcrest.core.IsEqual.equalTo) Set(java.util.Set) TypeUtils(org.apache.ignite.internal.sql.engine.util.TypeUtils) FULL(org.apache.calcite.rel.core.JoinRelType.FULL) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test) RIGHT(org.apache.calcite.rel.core.JoinRelType.RIGHT) JoinRelType(org.apache.calcite.rel.core.JoinRelType) ExecutionContext(org.apache.ignite.internal.sql.engine.exec.ExecutionContext) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) ArrayList(java.util.ArrayList) RelDataType(org.apache.calcite.rel.type.RelDataType)

Example 2 with SEMI

use of org.apache.calcite.rel.core.JoinRelType.SEMI in project ignite-3 by apache.

the class NestedLoopJoinExecutionTest method verifyJoin.

/**
 * Creates execution tree and executes it. Then compares the result of the execution with the given one.
 *
 * @param left     Data for left table.
 * @param right    Data for right table.
 * @param joinType Join type.
 * @param expRes   Expected result.
 */
private void verifyJoin(Object[][] left, Object[][] right, JoinRelType joinType, Object[][] expRes) {
    ExecutionContext<Object[]> ctx = executionContext(true);
    RelDataType leftType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class);
    ScanNode<Object[]> leftNode = new ScanNode<>(ctx, leftType, Arrays.asList(left));
    RelDataType rightType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class);
    ScanNode<Object[]> rightNode = new ScanNode<>(ctx, rightType, Arrays.asList(right));
    RelDataType outType;
    if (setOf(SEMI, ANTI).contains(joinType)) {
        outType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class);
    } else {
        outType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, Integer.class, int.class, String.class);
    }
    RowHandler<Object[]> hnd = ctx.rowHandler();
    NestedLoopJoinNode<Object[]> join = NestedLoopJoinNode.create(ctx, outType, leftType, rightType, joinType, (r1, r2) -> getFieldFromBiRows(hnd, 2, r1, r2) == getFieldFromBiRows(hnd, 3, r1, r2));
    join.register(asList(leftNode, rightNode));
    RelDataType rowType;
    ProjectNode<Object[]> project;
    if (setOf(SEMI, ANTI).contains(joinType)) {
        rowType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class);
        project = new ProjectNode<>(ctx, rowType, r -> new Object[] { r[0], r[1] });
    } else {
        rowType = TypeUtils.createRowType(ctx.getTypeFactory(), int.class, String.class, String.class);
        project = new ProjectNode<>(ctx, rowType, r -> new Object[] { r[0], r[1], r[4] });
    }
    project.register(join);
    RootNode<Object[]> node = new RootNode<>(ctx, rowType);
    node.register(project);
    ArrayList<Object[]> rows = new ArrayList<>();
    while (node.hasNext()) {
        rows.add(node.next());
    }
    assertArrayEquals(expRes, rows.toArray(EMPTY));
}
Also used : ArrayUtils.asList(org.apache.ignite.internal.util.ArrayUtils.asList) RelDataType(org.apache.calcite.rel.type.RelDataType) LEFT(org.apache.calcite.rel.core.JoinRelType.LEFT) Arrays(java.util.Arrays) ANTI(org.apache.calcite.rel.core.JoinRelType.ANTI) INNER(org.apache.calcite.rel.core.JoinRelType.INNER) RowHandler(org.apache.ignite.internal.sql.engine.exec.RowHandler) SEMI(org.apache.calcite.rel.core.JoinRelType.SEMI) Set(java.util.Set) TypeUtils(org.apache.ignite.internal.sql.engine.util.TypeUtils) FULL(org.apache.calcite.rel.core.JoinRelType.FULL) ArrayList(java.util.ArrayList) Assertions.assertArrayEquals(org.junit.jupiter.api.Assertions.assertArrayEquals) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test) RIGHT(org.apache.calcite.rel.core.JoinRelType.RIGHT) Commons.getFieldFromBiRows(org.apache.ignite.internal.sql.engine.util.Commons.getFieldFromBiRows) JoinRelType(org.apache.calcite.rel.core.JoinRelType) ExecutionContext(org.apache.ignite.internal.sql.engine.exec.ExecutionContext) ArrayList(java.util.ArrayList) RelDataType(org.apache.calcite.rel.type.RelDataType)

Aggregations

ArrayList (java.util.ArrayList)2 Arrays (java.util.Arrays)2 HashSet (java.util.HashSet)2 Set (java.util.Set)2 JoinRelType (org.apache.calcite.rel.core.JoinRelType)2 ANTI (org.apache.calcite.rel.core.JoinRelType.ANTI)2 FULL (org.apache.calcite.rel.core.JoinRelType.FULL)2 INNER (org.apache.calcite.rel.core.JoinRelType.INNER)2 LEFT (org.apache.calcite.rel.core.JoinRelType.LEFT)2 RIGHT (org.apache.calcite.rel.core.JoinRelType.RIGHT)2 SEMI (org.apache.calcite.rel.core.JoinRelType.SEMI)2 RelDataType (org.apache.calcite.rel.type.RelDataType)2 ExecutionContext (org.apache.ignite.internal.sql.engine.exec.ExecutionContext)2 TypeUtils (org.apache.ignite.internal.sql.engine.util.TypeUtils)2 ArrayUtils.asList (org.apache.ignite.internal.util.ArrayUtils.asList)2 Test (org.junit.jupiter.api.Test)2 RowHandler (org.apache.ignite.internal.sql.engine.exec.RowHandler)1 Commons.getFieldFromBiRows (org.apache.ignite.internal.sql.engine.util.Commons.getFieldFromBiRows)1 MatcherAssert.assertThat (org.hamcrest.MatcherAssert.assertThat)1 IsEqual.equalTo (org.hamcrest.core.IsEqual.equalTo)1