/** Returns a reference to a particular field, by offset, across several * inputs on a {@link RelBuilder}'s stack. */ private RexInputRef field(HiveSubQRemoveRelBuilder builder, int inputCount, int offset) { for (int inputOrdinal = 0;;) { final RelNode r = builder.peek(inputCount, inputOrdinal); if (offset < r.getRowType().getFieldCount()) { return builder.field(inputCount, inputOrdinal, offset); } ++inputOrdinal; offset -= r.getRowType().getFieldCount(); } }
public static RexNode convert(RelOptCluster cluster, ExprNodeDesc joinCondnExprNode, List<RelNode> inputRels, LinkedHashMap<RelNode, RowResolver> relToHiveRR, Map<RelNode, ImmutableMap<String, Integer>> relToHiveColNameCalcitePosMap, boolean flattenExpr) throws SemanticException { List<InputCtx> inputCtxLst = new ArrayList<InputCtx>(); int offSet = 0; for (RelNode r : inputRels) { inputCtxLst.add(new InputCtx(r.getRowType(), relToHiveColNameCalcitePosMap.get(r), relToHiveRR .get(r), offSet)); offSet += r.getRowType().getFieldCount(); } return (new RexNodeConverter(cluster, inputCtxLst, flattenExpr)).convert(joinCondnExprNode); } }
private ColumnRowType buildColumnRowType() { this.alias = context.allTableScans.size() + "_" + Integer.toHexString(System.identityHashCode(this)); TableRef tableRef = TblColRef.tableForUnknownModel(this.alias, olapTable.getSourceTable()); List<TblColRef> columns = new ArrayList<TblColRef>(); for (ColumnDesc sourceColumn : olapTable.getSourceColumns()) { TblColRef colRef = TblColRef.columnForUnknownModel(tableRef, sourceColumn); columns.add(colRef); } if (columns.size() != rowType.getFieldCount()) { throw new IllegalStateException("RowType=" + rowType.getFieldCount() + ", ColumnRowType=" + columns.size()); } return new ColumnRowType(columns); }
public static RowSignature from(final List<String> rowOrder, final RelDataType rowType) { if (rowOrder.size() != rowType.getFieldCount()) { throw new IAE("Field count %d != %d", rowOrder.size(), rowType.getFieldCount()); } final RowSignature.Builder rowSignatureBuilder = builder(); for (int i = 0; i < rowOrder.size(); i++) { final RelDataTypeField field = rowType.getFieldList().get(i); final SqlTypeName sqlTypeName = field.getType().getSqlTypeName(); final ValueType valueType; valueType = Calcites.getValueTypeForSqlTypeName(sqlTypeName); if (valueType == null) { throw new ISE("Cannot translate sqlTypeName[%s] to Druid type for field[%s]", sqlTypeName, rowOrder.get(i)); } rowSignatureBuilder.add(rowOrder.get(i), valueType); } return rowSignatureBuilder.build(); }
List<TblColRef> columns = new ArrayList<TblColRef>(this.rowType.getFieldCount()); columns.addAll(this.groups); columns.add(indicatorCol); for (int i = 0; i < this.aggregations.size(); i++) { FunctionDesc aggFunc = this.aggregations.get(i); String aggOutName; if (aggFunc != null) { aggOutName = aggFunc.getRewriteFieldName(); } else { AggregateCall aggCall = this.rewriteAggCalls.get(i); int index = aggCall.getArgList().get(0); aggOutName = getSqlFuncName(aggCall) + "_" + inputColumnRowType.getColumnByIndex(index).getIdentity().replace('.', '_') + "_"; columns.add(aggOutCol);
if (obChild.getRowType().getFieldCount() <= resultSchema.size()) { return; RelCollations.ordinals(obRel.getCollation())); ImmutableMap.Builder<Integer, RexNode> inputRefToCallMapBldr = ImmutableMap.builder(); for (int i = resultSchema.size(); i < rt.getFieldCount(); i++) { if (collationInputRefs.contains(i)) { RexNode obyExpr = obChild.getChildExps().get(i); if (obyExpr instanceof RexCall) { LOG.debug("Old RexCall : " + obyExpr); if ((obChild.getRowType().getFieldCount() - inputRefToCallMap.size()) != resultSchema.size()) { LOG.error(generateInvalidSchemaMessage(obChild, resultSchema, inputRefToCallMap.size())); throw new CalciteSemanticException("Result Schema didn't match Optimized Op Tree Schema");
public List<List<String>> getFieldOrigins(SqlNode sqlQuery) { if (sqlQuery instanceof SqlExplain) { return Collections.emptyList(); } final RelDataType rowType = getValidatedNodeType(sqlQuery); final int fieldCount = rowType.getFieldCount(); if (!sqlQuery.isA(SqlKind.QUERY)) { return Collections.nCopies(fieldCount, null); } final List<List<String>> list = new ArrayList<>(); for (int i = 0; i < fieldCount; i++) { list.add(getFieldOrigin(sqlQuery, i)); } return ImmutableNullableList.copyOf(list); }
protected ColumnRowType buildColumnRowType() { List<TblColRef> columns = new ArrayList<TblColRef>(); OLAPRel olapLeft = (OLAPRel) this.left; ColumnRowType leftColumnRowType = olapLeft.getColumnRowType(); columns.addAll(leftColumnRowType.getAllColumns()); this.columnRowTypeLeftRightCut = columns.size(); OLAPRel olapRight = (OLAPRel) this.right; ColumnRowType rightColumnRowType = olapRight.getColumnRowType(); columns.addAll(rightColumnRowType.getAllColumns()); if (columns.size() != this.rowType.getFieldCount()) { throw new IllegalStateException( "RowType=" + this.rowType.getFieldCount() + ", ColumnRowType=" + columns.size()); } return new ColumnRowType(columns); }
private Frame decorrelateInputWithValueGenerator(RelNode rel) { assert rel.getInputs().size() == 1; RelNode oldInput = rel.getInput(0); final Frame frame = map.get(oldInput); int leftInputOutputCount = frame.r.getRowType().getFieldCount();
public List<Double> averageColumnSizes(HiveTableScan scan, RelMetadataQuery mq) { List<Integer> neededcolsLst = scan.getNeededColIndxsFrmReloptHT(); List<ColStatistics> columnStatistics = ((RelOptHiveTable) scan.getTable()) .getColStat(neededcolsLst, true); // Obtain list of col stats, or use default if they are not available final ImmutableList.Builder<Double> list = ImmutableList.builder(); int indxRqdCol = 0; int nFields = scan.getRowType().getFieldCount(); for (int i = 0; i < nFields; i++) { if (neededcolsLst.contains(i)) { ColStatistics columnStatistic = columnStatistics.get(indxRqdCol); indxRqdCol++; if (columnStatistic == null) { RelDataTypeField field = scan.getRowType().getFieldList().get(i); list.add(averageTypeValueSize(field.getType())); } else { list.add(columnStatistic.getAvgColLen()); } } else { list.add(new Double(0)); } } return list.build(); }
public void validateWithItem(SqlWithItem withItem) { if (withItem.columnList != null) { final RelDataType rowType = getValidatedNodeType(withItem.query); final int fieldCount = rowType.getFieldCount(); if (withItem.columnList.size() != fieldCount) { throw newValidationError(withItem.columnList, RESOURCE.columnCountMismatch()); } SqlValidatorUtil.checkIdentifierListForDuplicates( withItem.columnList.getList(), validationErrorFunction); } else { // Luckily, field names have not been make unique yet. final List<String> fieldNames = getValidatedNodeType(withItem.query).getFieldNames(); final int i = Util.firstDuplicate(fieldNames); if (i >= 0) { throw newValidationError(withItem.query, RESOURCE.duplicateColumnAndNoColumnList(fieldNames.get(i))); } } }
ColumnRowType buildColumnRowType() { ArrayList<TblColRef> colRefs = Lists.newArrayListWithCapacity(rowType.getFieldCount()); for(RelDataTypeField r:rowType.getFieldList()){ colRefs.add(TblColRef.newInnerColumn(r.getName(), TblColRef.InnerDataTypeEnum.LITERAL)); } return new ColumnRowType(colRefs); }
private RexNode decorrFieldAccess(RexFieldAccess fieldAccess) { int newInputOutputOffset = 0; for (RelNode input : currentRel.getInputs()) { final Frame frame = map.get(input); if (frame != null) { // try to find in this input rel the position of cor var final CorRef corRef = cm.mapFieldAccessToCorRef.get(fieldAccess); if (corRef != null) { Integer newInputPos = frame.corDefOutputs.get(corRef.def()); if (newInputPos != null) { // This input rel does produce the cor var referenced. // Assume fieldAccess has the correct type info. return new RexInputRef(newInputPos + newInputOutputOffset, frame.r.getRowType().getFieldList().get(newInputPos) .getType()); } } // this input rel does not produce the cor var needed newInputOutputOffset += frame.r.getRowType().getFieldCount(); } else { // this input rel is not rewritten newInputOutputOffset += input.getRowType().getFieldCount(); } } return fieldAccess; } }
public static RexNode convert(RelOptCluster cluster, ExprNodeDesc joinCondnExprNode, List<RelNode> inputRels, LinkedHashMap<RelNode, RowResolver> relToHiveRR, Map<RelNode, ImmutableMap<String, Integer>> relToHiveColNameCalcitePosMap, boolean flattenExpr) throws SemanticException { List<InputCtx> inputCtxLst = new ArrayList<InputCtx>(); int offSet = 0; for (RelNode r : inputRels) { inputCtxLst.add(new InputCtx(r.getRowType(), relToHiveColNameCalcitePosMap.get(r), relToHiveRR .get(r), offSet)); offSet += r.getRowType().getFieldCount(); } return (new RexNodeConverter(cluster, inputCtxLst, flattenExpr)).convert(joinCondnExprNode); } }
if (obChild.getRowType().getFieldCount() <= resultSchema.size()) { return; RelCollations.ordinals(obRel.getCollation())); ImmutableMap.Builder<Integer, RexNode> inputRefToCallMapBldr = ImmutableMap.builder(); for (int i = resultSchema.size(); i < rt.getFieldCount(); i++) { if (collationInputRefs.contains(i)) { RexNode obyExpr = obChild.getChildExps().get(i); if (obyExpr instanceof RexCall) { LOG.debug("Old RexCall : " + obyExpr); if ((obChild.getRowType().getFieldCount() - inputRefToCallMap.size()) != resultSchema.size()) { LOG.error(generateInvalidSchemaMessage(obChild, resultSchema, inputRefToCallMap.size())); throw new CalciteSemanticException("Result Schema didn't match Optimized Op Tree Schema");
/** Creates a reference to a field of the current record which originated * in a relation with a given alias. */ public RexNode field(String alias, String fieldName) { Preconditions.checkNotNull(alias); Preconditions.checkNotNull(fieldName); final Frame frame = stack.peek(); final List<String> aliases = new ArrayList<>(); int offset = 0; for (Pair<String, RelDataType> pair : frame.right) { if (pair.left != null && pair.left.equals(alias)) { int i = pair.right.getFieldNames().indexOf(fieldName); if (i >= 0) { return field(offset + i); } else { throw new IllegalArgumentException("no field '" + fieldName + "' in relation '" + alias + "'; fields are: " + pair.right.getFieldNames()); } } aliases.add(pair.left); offset += pair.right.getFieldCount(); } throw new IllegalArgumentException("no relation wtih alias '" + alias + "'; aliases are: " + aliases); }
private Frame decorrelateInputWithValueGenerator(RelNode rel) { assert rel.getInputs().size() == 1; RelNode oldInput = rel.getInput(0); final Frame frame = map.get(oldInput); int leftInputOutputCount = frame.r.getRowType().getFieldCount();
public List<Double> averageColumnSizes(HiveTableScan scan, RelMetadataQuery mq) { List<Integer> neededcolsLst = scan.getNeededColIndxsFrmReloptHT(); List<ColStatistics> columnStatistics = ((RelOptHiveTable) scan.getTable()) .getColStat(neededcolsLst, true); // Obtain list of col stats, or use default if they are not available final ImmutableList.Builder<Double> list = ImmutableList.builder(); int indxRqdCol = 0; int nFields = scan.getRowType().getFieldCount(); for (int i = 0; i < nFields; i++) { if (neededcolsLst.contains(i)) { ColStatistics columnStatistic = columnStatistics.get(indxRqdCol); indxRqdCol++; if (columnStatistic == null) { RelDataTypeField field = scan.getRowType().getFieldList().get(i); list.add(averageTypeValueSize(field.getType())); } else { list.add(columnStatistic.getAvgColLen()); } } else { list.add(new Double(0)); } } return list.build(); }
final ImmutableBitSet rightBits = ImmutableBitSet.range( left.getRowType().getFieldCount(), join.getRowType().getFieldCount() ); aggregateRef = joinRef; } else { final RexNode projectExp = rightProject.getChildExps().get(joinRef); if (projectExp.isA(SqlKind.INPUT_REF)) { aggregateRef = ((RexInputRef) projectExp).getIndex();
/** Returns the number of fields in all inputs before (to the left of) * the given input. * * @param inputCount Number of inputs * @param inputOrdinal Input ordinal */ private int inputOffset(int inputCount, int inputOrdinal) { int offset = 0; for (int i = 0; i < inputOrdinal; i++) { offset += peek(inputCount, i).getRowType().getFieldCount(); } return offset; }