private RelNode getCorRel(CorRef corVar) { final RelNode r = cm.mapCorToCorRel.get(corVar.corr); RelNode ret = r.getInput(0); return ret; }
private boolean isAggZeroOnEmpty(RexSubQuery e) { //as this is corr scalar subquery with agg we expect one aggregate assert(e.getKind() == SqlKind.SCALAR_QUERY); assert(e.rel.getInputs().size() == 1); Aggregate relAgg = (Aggregate)e.rel.getInput(0); assert(relAgg.getAggCallList().size() == 1); //should only have one aggregate if(relAgg.getAggCallList().get(0).getAggregation().getKind() == SqlKind.COUNT) { return true; } return false; }
private SqlTypeName getAggTypeForScalarSub(RexSubQuery e) { assert(e.getKind() == SqlKind.SCALAR_QUERY); assert(e.rel.getInputs().size() == 1); Aggregate relAgg = (Aggregate)e.rel.getInput(0); assert(relAgg.getAggCallList().size() == 1); //should only have one aggregate return relAgg.getAggCallList().get(0).getType().getSqlTypeName(); }
private RelNode getCorRel(CorRef corVar) { final RelNode r = cm.mapCorToCorRel.get(corVar.corr); RelNode ret = r.getInput(0); return ret; }
private static void traverseFilter(RexNode node, Set<CorrelationId> allVars) { if(node instanceof RexSubQuery) { //we expect correlated variables in HiveFilter only for now. // Also check for case where operator has 0 inputs .e.g TableScan RelNode input = ((RexSubQuery)node).rel.getInput(0); while(input != null && !(input instanceof HiveFilter) && input.getInputs().size() >=1) { //we don't expect corr vars withing JOIN or UNION for now // we only expect cor vars in top level filter if(input.getInputs().size() > 1) { return; } input = input.getInput(0); } if(input != null && input instanceof HiveFilter) { findCorrelatedVar(((HiveFilter)input).getCondition(), allVars); } return; } //AND, NOT etc if(node instanceof RexCall) { int numOperands = ((RexCall)node).getOperands().size(); for(int i=0; i<numOperands; i++) { RexNode op = ((RexCall)node).getOperands().get(i); traverseFilter(op, allVars); } } }
/** * Get top level select starting from root. Assumption here is root can only * be Sort & Project. Also the top project should be at most 2 levels below * Sort; i.e Sort(Limit)-Sort(OB)-Select * * @param rootRel * @return */ public static Pair<RelNode, RelNode> getTopLevelSelect(final RelNode rootRel) { RelNode tmpRel = rootRel; RelNode parentOforiginalProjRel = rootRel; HiveProject originalProjRel = null; while (tmpRel != null) { if (tmpRel instanceof HiveProject) { originalProjRel = (HiveProject) tmpRel; break; } parentOforiginalProjRel = tmpRel; tmpRel = tmpRel.getInput(0); } return (new Pair<RelNode, RelNode>(parentOforiginalProjRel, originalProjRel)); }
private boolean isAggZeroOnEmpty(RexSubQuery e) { //as this is corr scalar subquery with agg we expect one aggregate assert(e.getKind() == SqlKind.SCALAR_QUERY); assert(e.rel.getInputs().size() == 1); Aggregate relAgg = (Aggregate)e.rel.getInput(0); assert( relAgg.getAggCallList().size() == 1); //should only have one aggregate if( relAgg.getAggCallList().get(0).getAggregation().getKind() == SqlKind.COUNT ) { return true; } return false; } private SqlTypeName getAggTypeForScalarSub(RexSubQuery e) {
/** * Get top level select starting from root. Assumption here is root can only * be Sort & Project. Also the top project should be at most 2 levels below * Sort; i.e Sort(Limit)-Sort(OB)-Select * * @param rootRel * @return */ public static Pair<RelNode, RelNode> getTopLevelSelect(final RelNode rootRel) { RelNode tmpRel = rootRel; RelNode parentOforiginalProjRel = rootRel; HiveProject originalProjRel = null; while (tmpRel != null) { if (tmpRel instanceof HiveProject) { originalProjRel = (HiveProject) tmpRel; break; } parentOforiginalProjRel = tmpRel; tmpRel = tmpRel.getInput(0); } return (new Pair<RelNode, RelNode>(parentOforiginalProjRel, originalProjRel)); }
private SqlTypeName getAggTypeForScalarSub(RexSubQuery e) { assert(e.getKind() == SqlKind.SCALAR_QUERY); assert(e.rel.getInputs().size() == 1); Aggregate relAgg = (Aggregate)e.rel.getInput(0); assert( relAgg.getAggCallList().size() == 1); //should only have one aggregate return relAgg.getAggCallList().get(0).getType().getSqlTypeName(); }
@Override public void visit(RelNode node, int ordinal, RelNode parent) { if (node instanceof Aggregate) { this.containsAggregate = true; // Aggregate mode - it should be followed by union // that we need to analyze RelNode input = node.getInput(0); if (input instanceof Union) { check((Union) input); } } else if (node instanceof Union) { // Non aggregate mode - analyze union operator check((Union) node); } else if (node instanceof Project) { // Project operator, we can continue super.visit(node, ordinal, parent); } throw new ReturnedValue(false); }
private static void traverseFilter(RexNode node, Set<CorrelationId> allVars) { if(node instanceof RexSubQuery) { //we expect correlated variables in HiveFilter only for now. // Also check for case where operator has 0 inputs .e.g TableScan RelNode input = ((RexSubQuery)node).rel.getInput(0); while(input != null && !(input instanceof HiveFilter) && input.getInputs().size() >=1) { //we don't expect corr vars withing JOIN or UNION for now // we only expect cor vars in top level filter if(input.getInputs().size() > 1) { return; } input = input.getInput(0); } if(input != null && input instanceof HiveFilter) { findCorrelatedVar(((HiveFilter)input).getCondition(), allVars); } return; } //AND, NOT etc if(node instanceof RexCall) { int numOperands = ((RexCall)node).getOperands().size(); for(int i=0; i<numOperands; i++) { RexNode op = ((RexCall)node).getOperands().get(i); traverseFilter(op, allVars); } } }
@Override public RelNode convert(RelNode in) { return new JdbcIntermediatePrel( in.getCluster(), in.getTraitSet().replace(getOutTrait()), in.getInput(0)); }
private static String getTblAlias(RelNode rel) { if (null == rel) { return null; } if (rel instanceof HiveTableScan) { return ((HiveTableScan)rel).getTableAlias(); } if (rel instanceof DruidQuery) { DruidQuery dq = (DruidQuery) rel; return ((HiveTableScan) dq.getTableScan()).getTableAlias(); } if (rel instanceof Project) { return null; } if (rel.getInputs().size() == 1) { return getTblAlias(rel.getInput(0)); } return null; }
} else { topProject = (Project) swapped; newJoin = (HiveJoin) swapped.getInput(0);
List<Operator<?>> children = new ArrayList<Operator<?>>(joinRel.getInputs().size()); for (int i = 0; i < inputs.length; i++) { inputs[i] = dispatch(joinRel.getInput(i)); children.add(inputs[i].inputs.get(0)); baseSrc[i] = inputs[i].tabAlias; joinExpressions[i] = ((HiveSortExchange) joinRel.getInput(i)).getJoinExpressions();
} else { topProject = (Project) swapped; newJoin = (HiveJoin) swapped.getInput(0);
private static String getTblAlias(RelNode rel) { if (null == rel) { return null; } if (rel instanceof HiveTableScan) { return ((HiveTableScan)rel).getTableAlias(); } if (rel instanceof DruidQuery) { DruidQuery dq = (DruidQuery) rel; return ((HiveTableScan) dq.getTableScan()).getTableAlias(); } if (rel instanceof HiveJdbcConverter) { HiveJdbcConverter conv = (HiveJdbcConverter) rel; return conv.getTableScan().getHiveTableScan().getTableAlias(); } if (rel instanceof Project) { return null; } if (rel.getInputs().size() == 1) { return getTblAlias(rel.getInput(0)); } return null; }
if(currentRel.getInputs().size() == 1 && currentRel.getInput(0) instanceof LogicalCorrelate) { final Frame newFrame = map.get(currentRel.getInput(0)); if(newFrame.r instanceof HiveSemiJoin) { int oldFieldSize = currentRel.getInput(0).getRowType().getFieldCount(); int newOrd = newFrame.r.getRowType().getFieldCount() + oldOrdinalNo - oldFieldSize; return new RexInputRef(newOrd, oldInputRef.getType());
private Frame decorrelateInputWithValueGenerator(RelNode rel) { RelNode oldInput = rel.getInput(0); final Frame frame = map.get(oldInput);
HiveSortExchange exchange = HiveSortExchange.create(call.rel(0).getInput(i), new HiveRelDistribution(RelDistribution.Type.HASH_DISTRIBUTED, joinKeyPositions), new HiveRelCollation(collationListBuilder.build()),