private PlannerOp planEnumerableJoin(EnumerableJoin op, RelDataType rowType) { // please note that EnumerableJoin has a condition field which actually is not useful PlannerOp left = convertRelNode(op.getLeft(), null, false); PlannerOp right = convertRelNode(op.getRight(), null, false); int[] leftKeys = op.getLeftKeys().toIntArray(); int[] rightKeys = op.getRightKeys().toIntArray(); boolean generateNullsOnLeft = op.getJoinType().generatesNullsOnLeft(); boolean generateNullsOnRight = op.getJoinType().generatesNullsOnRight(); final RelDataType _rowType = rowType == null ? op.getRowType() : rowType; List<RelDataTypeField> fieldList = _rowType.getFieldList(); Column[] columns = new Column[fieldList.size()]; String[] fieldNames = new String[columns.length]; int i = 0; for (RelDataTypeField field : fieldList) { Column col = Column.column(field.getName().toLowerCase(), convertToHerdType(field.getType())); fieldNames[i] = col.name; columns[i++] = col; } return new JoinOp(fieldNames, columns, leftKeys, left, rightKeys, right, generateNullsOnLeft, generateNullsOnRight, false); }
@Override public EnumerableJoin copy(RelTraitSet traitSet, RexNode condition, RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { final JoinInfo joinInfo = JoinInfo.of(left, right, condition); assert joinInfo.isEqui(); try { return new EnumerableJoin(getCluster(), traitSet, left, right, condition, joinInfo.leftKeys, joinInfo.rightKeys, variablesSet, joinType); } catch (InvalidRelException e) { // Semantic error not possible. Must be a bug. Convert to // internal error. throw new AssertionError(e); } }
@Deprecated // to be removed before 2.0 public static EnumerableJoin create( RelNode left, RelNode right, RexNode condition, ImmutableIntList leftKeys, ImmutableIntList rightKeys, JoinRelType joinType, Set<String> variablesStopped) throws InvalidRelException { return create(left, right, condition, leftKeys, rightKeys, CorrelationId.setOf(variablesStopped), joinType); }
final RelNode left = join.getLeft(); final RelNode right = join.getRight(); final List<String> leftFields = join.getRowType().getFieldNames(). subList(0, left.getRowType().getFieldCount()); leftFields.stream().forEach(field -> { } else { final List<String> leftFields = join.getRowType().getFieldNames(). subList(0, left.getRowType().getFieldCount()); int col = 0; final List<String> rightFields = join.getRowType().getFieldNames(). subList(left.getRowType().getFieldCount(), join.getRowType().getFieldCount()); rightFields.stream().forEach(field -> { fieldMap.get(join).put(field, (GremlinToEnumerableConverter) right); } else { final List<String> rightFields = join.getRowType().getFieldNames(). subList(left.getRowType().getFieldCount(), join.getRowType().getFieldCount()); int col = 0; for(String field : rightFields) {
private GremlinToEnumerableConverter getConverter(int fieldIndex, String field, RelNode node) { if(node instanceof EnumerableJoin) { final EnumerableJoin join = (EnumerableJoin) node; List<String> fieldNames = join.getRowType().getFieldNames(); final String chosenField = fieldNames.get(fieldIndex); return fieldMap.get(join).get(chosenField); } return null; } }
final RelTraitSet traitSet = cluster.traitSetOf(EnumerableConvention.INSTANCE); return new EnumerableJoin(cluster, traitSet, left, right, condition, leftKeys, rightKeys, variablesSet, joinType);
rowCount = addEpsilon(rowCount); break; default: if (RelNodes.COMPARATOR.compare(left, right) > 0) { rowCount = addEpsilon(rowCount);
final PhysType physType = PhysTypeImpl.of( implementor.getTypeFactory(), getRowType(), pref.preferArray()); final PhysType keyPhysType = leftResult.physType.project(
final RelTraitSet traitSet = cluster.traitSetOf(EnumerableConvention.INSTANCE); return new EnumerableJoin(cluster, traitSet, left, right, condition, leftKeys, rightKeys, variablesSet, joinType);
rowCount = addEpsilon(rowCount); break; default: if (RelNodes.COMPARATOR.compare(left, right) > 0) { rowCount = addEpsilon(rowCount);
RelNode left = join.getLeft(); RelNode right = join.getRight(); final Integer leftKeyId = join.getLeftKeys().get(0); final Integer rightKeyId = join.getRightKeys().get(0); final List<String> joinFields = join.getRowType().getFieldNames(); final List<String> leftJoinFields = joinFields.subList(0, left.getRowType().getFieldCount()); final List<String> rightJoinFields = joinFields.subList(left.getRowType().getFieldCount(), joinFields.size());
final PhysType physType = PhysTypeImpl.of( implementor.getTypeFactory(), getRowType(), pref.preferArray()); final PhysType keyPhysType = leftResult.physType.project(
@Override public EnumerableJoin copy(RelTraitSet traitSet, RexNode condition, RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { final JoinInfo joinInfo = JoinInfo.of(left, right, condition); assert joinInfo.isEqui(); try { return new EnumerableJoin(getCluster(), traitSet, left, right, condition, joinInfo.leftKeys, joinInfo.rightKeys, variablesSet, joinType); } catch (InvalidRelException e) { // Semantic error not possible. Must be a bug. Convert to // internal error. throw new AssertionError(e); } }
newRel = new EnumerableJoin( cluster, join.getTraitSet().replace(EnumerableConvention.INSTANCE),
@Deprecated // to be removed before 2.0 public static EnumerableJoin create( RelNode left, RelNode right, RexNode condition, ImmutableIntList leftKeys, ImmutableIntList rightKeys, JoinRelType joinType, Set<String> variablesStopped) throws InvalidRelException { return create(left, right, condition, leftKeys, rightKeys, CorrelationId.setOf(variablesStopped), joinType); }
newRel = new EnumerableJoin( cluster, join.getTraitSet().replace(EnumerableConvention.INSTANCE),