@Override public RelNode flattenTypes( RelNode rootRel, boolean restructure) { RelStructuredTypeFlattener typeFlattener = new RelStructuredTypeFlattener(rexBuilder, createToRelContext(), restructure); return typeFlattener.rewrite(rootRel); }
public void rewriteRel(LogicalValues rel) { // NOTE jvs 30-Apr-2006: UDT instances require invocation // of a constructor method, which can't be represented // by the tuples stored in a LogicalValues, so we don't have // to worry about them here. rewriteGeneric(rel); }
/** * Maps the ordinal of a field pre-flattening to the ordinal of the * corresponding field post-flattening. * * @param oldOrdinal Pre-flattening ordinal * @return Post-flattening ordinal */ protected int getNewForOldInput(int oldOrdinal) { return getNewFieldForOldInput(oldOrdinal).i; }
public void rewriteRel(LogicalCalc rel) { final RelNode newInput = getNewForOldRel(rel.getInput()); flattenProjections(new RewriteRexShuttle(), program.getProjectList(), fieldNames, if (conditionRef != null) { final Ord<RelDataType> newField = getNewFieldForOldInput(conditionRef.getIndex()); programBuilder.addCondition(new RexLocalRef(newField.i, newField.e)); setNewForOldRel(rel, newRel);
for (int j = 0; j < n; ++j) { final Ord<RelDataType> newField = getNewFieldForOldInput(inputRef.getIndex()); flattenedExps.add( Pair.of(new RexInputRef(newField.i + j, newField.e), fieldName)); } else if (isConstructor(exp) || exp.isA(SqlKind.CAST)) { flattenNullLiteral( exp.getType(), flattenedExps); flattenProjections(new RewriteRexShuttle(), call.getOperands(), Collections.nCopies(call.getOperands().size(), null), final RexInputRef inputRef = (RexInputRef) oldOperands.get(0); final Ord<RelDataType> newField = getNewFieldForOldInput(inputRef.getIndex()); newExp = rexBuilder.makeCall(exp.getType(), ((RexCall) exp).getOperator(),
public void rewriteRel(LogicalProject rel) { final List<Pair<RexNode, String>> flattenedExpList = new ArrayList<>(); flattenProjections(new RewriteRexShuttle(), rel.getProjects(), rel.getRowType().getFieldNames(), "", flattenedExpList); relBuilder.push(getNewForOldRel(rel.getInput())) .projectNamed(Pair.left(flattenedExpList), Pair.right(flattenedExpList), true); setNewForOldRel(rel, relBuilder.build()); }
public void rewriteRel(LogicalCorrelate rel) { ImmutableBitSet.Builder newPos = ImmutableBitSet.builder(); for (int pos : rel.getRequiredColumns()) { RelDataType corrFieldType = rel.getLeft().getRowType().getFieldList().get(pos) .getType(); if (corrFieldType.isStruct()) { throw Util.needToImplement("correlation on structured type"); } newPos.set(getNewForOldInput(pos)); } LogicalCorrelate newRel = LogicalCorrelate.create(getNewForOldRel(rel.getLeft()), getNewForOldRel(rel.getRight()), rel.getCorrelationId(), newPos.build(), rel.getJoinType()); setNewForOldRel(rel, newRel); }
public void rewriteRel(TableScan rel) { RelNode newRel = rel.getTable().toRel(toRelContext); if (!SqlTypeUtil.isFlat(rel.getRowType())) { final List<Pair<RexNode, String>> flattenedExpList = new ArrayList<>(); flattenInputs(rel.getRowType().getFieldList(), rexBuilder.makeRangeReference(newRel), flattenedExpList); newRel = relBuilder.push(newRel) .projectNamed(Pair.left(flattenedExpList), Pair.right(flattenedExpList), true) .build(); } setNewForOldRel(rel, newRel); }
RelNode newInput = null; for (RelNode oldInput1 : currentRel.getInputs()) { newInput = getNewForOldRel(oldInput1); RelDataType oldInputType = oldInput1.getRowType(); int n = oldInputType.getFieldCount(); final int newOffset = calculateFlattenedOffset(oldInputType, oldOrdinal); newOrdinal += newOffset; final RelDataTypeField field =
/** Generates expressions that reference the flattened input fields from * a given row type. */ private void flattenInputs(List<RelDataTypeField> fieldList, RexNode prefix, List<Pair<RexNode, String>> flattenedExpList) { for (RelDataTypeField field : fieldList) { final RexNode ref = rexBuilder.makeFieldAccess(prefix, field.getIndex()); if (field.getType().isStruct()) { flattenInputs(field.getType().getFieldList(), ref, flattenedExpList); } else { flattenedExpList.add(Pair.of(ref, field.getName())); } } }
private void flattenProjections(RewriteRexShuttle shuttle, List<? extends RexNode> exps, List<String> fieldNames, String prefix, List<Pair<RexNode, String>> flattenedExps) { for (int i = 0; i < exps.size(); ++i) { RexNode exp = exps.get(i); String fieldName = (fieldNames == null || fieldNames.get(i) == null) ? ("$" + i) : fieldNames.get(i); if (!prefix.equals("")) { fieldName = prefix + "$" + fieldName; } flattenProjection(shuttle, exp, fieldName, flattenedExps); } }
public void rewriteRel(LogicalCalc rel) { final RelNode newInput = getNewForOldRel(rel.getInput()); flattenProjections(new RewriteRexShuttle(), program.getProjectList(), fieldNames, if (conditionRef != null) { final Ord<RelDataType> newField = getNewFieldForOldInput(conditionRef.getIndex()); programBuilder.addCondition(new RexLocalRef(newField.i, newField.e)); setNewForOldRel(rel, newRel);
for (int j = 0; j < n; ++j) { final Ord<RelDataType> newField = getNewFieldForOldInput(inputRef.getIndex()); flattenedExps.add( Pair.of(new RexInputRef(newField.i + j, newField.e), fieldName)); } else if (isConstructor(exp) || exp.isA(SqlKind.CAST)) { flattenNullLiteral( exp.getType(), flattenedExps); flattenProjections(new RewriteRexShuttle(), call.getOperands(), Collections.nCopies(call.getOperands().size(), null), final RexInputRef inputRef = (RexInputRef) oldOperands.get(0); final Ord<RelDataType> newField = getNewFieldForOldInput(inputRef.getIndex()); newExp = rexBuilder.makeCall(exp.getType(), ((RexCall) exp).getOperator(),
public void rewriteRel(LogicalProject rel) { final List<Pair<RexNode, String>> flattenedExpList = new ArrayList<>(); flattenProjections(new RewriteRexShuttle(), rel.getProjects(), rel.getRowType().getFieldNames(), "", flattenedExpList); relBuilder.push(getNewForOldRel(rel.getInput())) .projectNamed(Pair.left(flattenedExpList), Pair.right(flattenedExpList), true); setNewForOldRel(rel, relBuilder.build()); }
public void rewriteRel(LogicalCorrelate rel) { ImmutableBitSet.Builder newPos = ImmutableBitSet.builder(); for (int pos : rel.getRequiredColumns()) { RelDataType corrFieldType = rel.getLeft().getRowType().getFieldList().get(pos) .getType(); if (corrFieldType.isStruct()) { throw Util.needToImplement("correlation on structured type"); } newPos.set(getNewForOldInput(pos)); } LogicalCorrelate newRel = LogicalCorrelate.create(getNewForOldRel(rel.getLeft()), getNewForOldRel(rel.getRight()), rel.getCorrelationId(), newPos.build(), rel.getJoinType()); setNewForOldRel(rel, newRel); }
public void rewriteRel(TableScan rel) { RelNode newRel = rel.getTable().toRel(toRelContext); if (!SqlTypeUtil.isFlat(rel.getRowType())) { final List<Pair<RexNode, String>> flattenedExpList = new ArrayList<>(); flattenInputs(rel.getRowType().getFieldList(), rexBuilder.makeRangeReference(newRel), flattenedExpList); newRel = relBuilder.push(newRel) .projectNamed(Pair.left(flattenedExpList), Pair.right(flattenedExpList), true) .build(); } setNewForOldRel(rel, newRel); }
RelNode newInput = null; for (RelNode oldInput1 : currentRel.getInputs()) { newInput = getNewForOldRel(oldInput1); RelDataType oldInputType = oldInput1.getRowType(); int n = oldInputType.getFieldCount(); final int newOffset = calculateFlattenedOffset(oldInputType, oldOrdinal); newOrdinal += newOffset; final RelDataTypeField field =
/** Generates expressions that reference the flattened input fields from * a given row type. */ private void flattenInputs(List<RelDataTypeField> fieldList, RexNode prefix, List<Pair<RexNode, String>> flattenedExpList) { for (RelDataTypeField field : fieldList) { final RexNode ref = rexBuilder.makeFieldAccess(prefix, field.getIndex()); if (field.getType().isStruct()) { flattenInputs(field.getType().getFieldList(), ref, flattenedExpList); } else { flattenedExpList.add(Pair.of(ref, field.getName())); } } }
private void flattenProjections(RewriteRexShuttle shuttle, List<? extends RexNode> exps, List<String> fieldNames, String prefix, List<Pair<RexNode, String>> flattenedExps) { for (int i = 0; i < exps.size(); ++i) { RexNode exp = exps.get(i); String fieldName = (fieldNames == null || fieldNames.get(i) == null) ? ("$" + i) : fieldNames.get(i); if (!prefix.equals("")) { fieldName = prefix + "$" + fieldName; } flattenProjection(shuttle, exp, fieldName, flattenedExps); } }
public RelNode flattenTypes( RelNode rootRel, boolean restructure) { RelStructuredTypeFlattener typeFlattener = new RelStructuredTypeFlattener(relBuilder, rexBuilder, createToRelContext(), restructure); return typeFlattener.rewrite(rootRel); }