protected static void log(final PlannerType plannerType, final PlannerPhase phase, final RelNode node, final Logger logger, Stopwatch watch) { if (logger.isDebugEnabled()) { log(plannerType.name() + ":" + phase.description, node, logger, watch); } }
private static RelNode doTransform(SqlHandlerConfig config, final PlannerType plannerType, final PlannerPhase phase, final RelOptPlanner planner, final RelNode input, boolean log, Supplier<RelNode> toPlan) { final Stopwatch watch = Stopwatch.createStarted(); try { final RelNode output = toPlan.get(); if (log) { log(plannerType, phase, output, logger, watch); config.getObserver().planRelTransform(phase, planner, input, output, watch.elapsed(TimeUnit.MILLISECONDS)); } CALCITE_LOGGER.trace("Completed Phase: {}.", phase); return output; } catch (Throwable t) { // log our input state as oput anyway so we can ensure that we have details. try { log(plannerType, phase, input, logger, watch); config.getObserver().planRelTransform(phase, planner, input, input, watch.elapsed(TimeUnit.MILLISECONDS)); } catch (Throwable unexpected) { t.addSuppressed(unexpected); } throw t; } }
public static RelNode trimFields(final RelNode relNode, boolean shouldLog) { final Stopwatch w = Stopwatch.createStarted(); final RelFieldTrimmer trimmer = DremioFieldTrimmer.of(relNode.getCluster()); final RelNode trimmed = trimmer.trim(relNode); if(shouldLog) { log(PlannerType.HEP, PlannerPhase.FIELD_TRIMMING, trimmed, logger, w); } return trimmed; }
private static RelNode convertToRel(SqlHandlerConfig config, SqlNode node, RelTransformer relTransformer) throws RelConversionException { final RelNode rel = convertToRelRootAndJdbc(config, node, relTransformer); log("INITIAL", rel, logger, null); return transform(config, PlannerType.HEP, PlannerPhase.WINDOW_REWRITE, rel, rel.getTraitSet(), true); }
@Override public PhysicalPlan getPlan(SqlHandlerConfig config, String sql, SqlNode sqlNode) throws Exception { try{ final ConvertedRelNode convertedRelNode = PrelTransformer.validateAndConvert(config, sqlNode); final RelDataType validatedRowType = convertedRelNode.getValidatedRowType(); final RelNode queryRelNode = convertedRelNode.getConvertedNode(); final Rel drel = PrelTransformer.convertToDrel(config, queryRelNode, validatedRowType); final Pair<Prel, String> convertToPrel = PrelTransformer.convertToPrel(config, drel); final Prel prel = convertToPrel.getKey(); textPlan = convertToPrel.getValue(); final PhysicalOperator pop = PrelTransformer.convertToPop(config, prel); final PhysicalPlan plan = PrelTransformer.convertToPlan(config, pop); logger.debug("Final Physical Plan {}", textPlan); PrelTransformer.log(config, "Dremio Plan", plan, logger); return plan; }catch(Exception ex){ throw SqlExceptionHelper.coerceException(logger, sql, ex, true); } }
final RelNode queryRelNode = convertedRelNode.getConvertedNode(); PrelTransformer.log("Calcite", queryRelNode, logger, null); drel = PrelTransformer.convertToDrel(config, queryRelNode, validatedRowType);
PrelTransformer.log(config, "Dremio Plan", plan, logger);
log(PlannerType.VOLCANO, PlannerPhase.PHYSICAL, phyRelNode, logger, watch); } catch (RelOptPlanner.CannotPlanException ex) { logger.error(ex.getMessage());
PhysicalPlan plan = PrelTransformer.convertToPlan(config, pop); if (logger.isTraceEnabled()) { PrelTransformer.log(config, "Dremio Plan", plan, logger);
log("Failed to pushdown RexSubquery. Applying JDBC pushdown to query with IN/EXISTS/SCALAR sub-queries converted to joins.", jdbcPushed, logger, null); final RelNode expandedWithSample = convertedNodeWithoutRexSubquery.accept(new InjectSample(leafLimitEnabled)); finalConvertedNode = transform(config,PlannerType.HEP_AC, PlannerPhase.JDBC_PUSHDOWN, expandedWithSample,