@Override protected RelDataType deriveRowType() { switch (joinType) { case LEFT: case INNER: return constructRowType(SqlValidatorUtil.deriveJoinRowType(left.getRowType(), removeImplicitField(right.getRowType()), joinType.toJoinType(), getCluster().getTypeFactory(), null, ImmutableList.of())); case ANTI: case SEMI: return constructRowType(left.getRowType()); default: throw new IllegalStateException("Unknown join type " + joinType); } }
@Override public RelWriter explainTerms(RelWriter pw) { if (this.excludeCorrelateColumn) { return super.explainTerms(pw).item("column excluded from output: ", this.getColumn()); } else { return super.explainTerms(pw); } }
/** * Returns number of fields in {@link RelDataType} for * input rel node with specified ordinal considering value of * {@code excludeCorrelateColumn}. * * @param ordinal ordinal of input rel node * @return number of fields in input's {@link RelDataType} */ public int getInputSize(int ordinal) { if (this.excludeCorrelateColumn && ordinal == 0) { return getInput(ordinal).getRowType().getFieldList().size() - 1; } return getInput(ordinal).getRowType().getFieldList().size(); }
public RelDataType removeImplicitField(RelDataType inputRowType) { List<RelDataType> fields = new ArrayList<>(); List<String> fieldNames = new ArrayList<>(); for (RelDataTypeField field : inputRowType.getFieldList()) { if (field.getName().equals(IMPLICIT_COLUMN)) { continue; } fieldNames.add(field.getName()); fields.add(field.getType()); } return getCluster().getTypeFactory().createStructType(fields, fieldNames); }
@Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { DrillCostBase.DrillCostFactory costFactory = (DrillCostBase.DrillCostFactory) planner.getCostFactory(); double rowCount = estimateRowCount(mq); long fieldWidth = PrelUtil.getPlannerSettings(planner).getOptions() .getLong(ExecConstants.AVERAGE_FIELD_WIDTH_KEY); double rowSize = left.getRowType().getFieldList().size() * fieldWidth; double cpuCost = rowCount * rowSize * DrillCostBase.BASE_CPU_COST; double memCost = !excludeCorrelateColumn ? CORRELATE_MEM_COPY_COST : 0.0; return costFactory.makeCost(rowCount, cpuCost, 0, 0, memCost); }
public RelDataType constructRowType(RelDataType inputRowType) { Preconditions.checkArgument(this.requiredColumns.cardinality() == 1); List<RelDataType> fields = new ArrayList<>(); List<String> fieldNames = new ArrayList<>(); if (excludeCorrelateColumn) { int corrVariable = this.requiredColumns.nextSetBit(0); for (RelDataTypeField field : inputRowType.getFieldList()) { if (field.getIndex() == corrVariable) { continue; } fieldNames.add(field.getName()); fields.add(field.getType()); } return getCluster().getTypeFactory().createStructType(fields, fieldNames); } return inputRowType; }