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 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 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) {
boolean isCorrScalarAgg, boolean hasNoWindowingAndNoGby) { switch (e.getKind()) { case SCALAR_QUERY: switch (e.getKind()) { case IN: fields.addAll(builder.fields()); if (e.getKind() == SqlKind.EXISTS) { logic = RelOptUtil.Logic.TRUE_FALSE; break; builder.project(builder.alias(builder.literal(true), "i" + e.rel.getId())); if(!variablesSet.isEmpty() && (e.getKind() == SqlKind.EXISTS || e.getKind() == SqlKind.IN)) { && (e.getKind() == SqlKind.EXISTS || e.getKind() == SqlKind.IN)) { throw new AssertionError(e.getKind());
HiveSubQRemoveRelBuilder builder, int inputCount, int offset, boolean isCorrScalarAgg) { switch (e.getKind()) { case SCALAR_QUERY: builder.push(e.rel); switch (e.getKind()) { case IN: fields.addAll(builder.fields()); if (e.getKind() == SqlKind.EXISTS) { logic = RelOptUtil.Logic.TRUE_FALSE; break; throw new AssertionError(e.getKind());
protected RexNode apply(RexSubQuery e, Set<CorrelationId> variablesSet, RelOptUtil.Logic logic, RelBuilder builder, int inputCount, int offset) { switch (e.getKind()) { case SCALAR_QUERY: return rewriteScalarQuery(e, variablesSet, builder, inputCount, offset); case SOME: return rewriteSome(e, builder); case IN: return rewriteIn(e, variablesSet, logic, builder, offset); case EXISTS: return rewriteExists(e, variablesSet, logic, builder); default: throw new AssertionError(e.getKind()); } }
protected RexNode apply(RexSubQuery e, Set<CorrelationId> variablesSet, RelOptUtil.Logic logic, RelBuilder builder, int inputCount, int offset) { switch (e.getKind()) { case SCALAR_QUERY: return rewriteScalarQuery(e, variablesSet, builder, inputCount, offset); case SOME: return rewriteSome(e, builder); case IN: return rewriteIn(e, variablesSet, logic, builder, offset); case EXISTS: return rewriteExists(e, variablesSet, logic, builder); default: throw new AssertionError(e.getKind()); } }
@Override public Void visitSubQuery(RexSubQuery subQuery) { RelNode newRel = subQuery.rel; if (subQuery.getKind() == SqlKind.IN) { newRel = addProjectionForIn(subQuery.rel); } final Frame frame = decorrelator.getInvoke(newRel); if (frame != null && frame.c != null) { Frame target = frame; if (subQuery.getKind() == SqlKind.EXISTS) { target = addProjectionForExists(frame); } final DecorrelateRexShuttle shuttle = new DecorrelateRexShuttle( rel.getRowType(), target.r.getRowType(), rel.getVariablesSet()); final RexNode newCondition = target.c.accept(shuttle); Pair<RelNode, RexNode> newNodeAndCondition = new Pair<>(target.r, newCondition); subQueryMap.put(subQuery, newNodeAndCondition); } return null; } };