public ConstExecutor(FunctionImplementationRegistry funcImplReg, FunctionContext udfUtilities, PlannerSettings plannerSettings) { this.funcImplReg = funcImplReg; this.udfUtilities = udfUtilities; this.plannerSettings = plannerSettings; this.calciteExecutor = new RexExecutorImpl(new DremioDataContext(udfUtilities.getContextInformation())); }
private boolean isSatisfiable(RexNode second, DataContext dataValues) { if (dataValues == null) { return false; } ImmutableList<RexNode> constExps = ImmutableList.of(second); final RexExecutable exec = executor.getExecutable(builder, constExps, rowType); Object[] result; exec.setDataContext(dataValues); try { result = exec.execute(); } catch (Exception e) { // TODO: CheckSupport should not allow this exception to be thrown // Need to monitor it and handle all the cases raising them. LOGGER.warn("Exception thrown while checking if => {}: {}", second, e.getMessage()); return false; } return result != null && result.length == 1 && result[0] instanceof Boolean && (Boolean) result[0]; }
private void checkConstant(final Object operand, final Function<RexBuilder, RexNode> function) throws Exception { check((rexBuilder, executor) -> { final List<RexNode> reducedValues = new ArrayList<>(); final RexNode expression = function.apply(rexBuilder); assert expression != null; executor.reduce(rexBuilder, ImmutableList.of(expression), reducedValues); assertThat(reducedValues.size(), equalTo(1)); assertThat(reducedValues.get(0), instanceOf(RexLiteral.class)); assertThat(((RexLiteral) reducedValues.get(0)).getValue2(), equalTo(operand)); }); }
/** * Do constant reduction using generated code. */ public void reduce(RexBuilder rexBuilder, List<RexNode> constExps, List<RexNode> reducedValues) { final String code = compile(rexBuilder, constExps, (list, index, storageType) -> { throw new UnsupportedOperationException(); }); final RexExecutable executable = new RexExecutable(code, constExps); executable.setDataContext(dataContext); executable.reduce(rexBuilder, constExps, reducedValues); }
@Override public boolean implies(RexBuilder rexBuilder, RelDataType rowType, RexNode first, RexNode second) { return calciteExecutor.implies(rexBuilder, rowType, first, second); }
/** * Do constant reduction using generated code. */ public void reduce(RexBuilder rexBuilder, List<RexNode> constExps, List<RexNode> reducedValues) { final String code = compile(rexBuilder, constExps, (list, index, storageType) -> { throw new UnsupportedOperationException(); }); final RexExecutable executable = new RexExecutable(code, constExps); executable.setDataContext(dataContext); executable.reduce(rexBuilder, constExps, reducedValues); }
/** Creates MockRelOptPlanner. */ public MockRelOptPlanner(Context context) { super(RelOptCostImpl.FACTORY, context); setExecutor(new RexExecutorImpl(Schemas.createDataContext(null, null))); }
private void checkConstant(final Object operand, final Function<RexBuilder, RexNode> function) throws Exception { check((rexBuilder, executor) -> { final List<RexNode> reducedValues = new ArrayList<>(); final RexNode expression = function.apply(rexBuilder); assert expression != null; executor.reduce(rexBuilder, ImmutableList.of(expression), reducedValues); assertThat(reducedValues.size(), equalTo(1)); assertThat(reducedValues.get(0), instanceOf(RexLiteral.class)); assertThat(((RexLiteral) reducedValues.get(0)).getValue2(), equalTo(operand)); }); }
private boolean isSatisfiable(RexNode second, DataContext dataValues) { if (dataValues == null) { return false; } ImmutableList<RexNode> constExps = ImmutableList.of(second); final RexExecutable exec = executor.getExecutable(builder, constExps, rowType); Object[] result; exec.setDataContext(dataValues); try { result = exec.execute(); } catch (Exception e) { // TODO: CheckSupport should not allow this exception to be thrown // Need to monitor it and handle all the cases raising them. LOGGER.warn("Exception thrown while checking if => {}: {}", second, e.getMessage()); return false; } return result != null && result.length == 1 && result[0] instanceof Boolean && (Boolean) result[0]; }
private String compile(RexBuilder rexBuilder, List<RexNode> constExps, RexToLixTranslator.InputGetter getter) { final RelDataTypeFactory typeFactory = rexBuilder.getTypeFactory(); final RelDataType emptyRowType = typeFactory.builder().build(); return compile(rexBuilder, constExps, getter, emptyRowType); }
/** Creates MockRelOptPlanner. */ public MockRelOptPlanner(Context context) { super(RelOptCostImpl.FACTORY, context); setExecutor(new RexExecutorImpl(Schemas.createDataContext(null, null))); }
@Test public void testConstant() throws Exception { check((rexBuilder, executor) -> { final List<RexNode> reducedValues = new ArrayList<>(); final RexLiteral ten = rexBuilder.makeExactLiteral(BigDecimal.TEN); executor.reduce(rexBuilder, ImmutableList.of(ten), reducedValues); assertThat(reducedValues.size(), equalTo(1)); assertThat(reducedValues.get(0), instanceOf(RexLiteral.class)); assertThat(((RexLiteral) reducedValues.get(0)).getValue2(), equalTo((Object) 10L)); }); }
.build(); final RexExecutable exec = executor.getExecutable(rexBuilder, constExps, rowType); exec.setDataContext(testContext);
private String compile(RexBuilder rexBuilder, List<RexNode> constExps, RexToLixTranslator.InputGetter getter) { final RelDataTypeFactory typeFactory = rexBuilder.getTypeFactory(); final RelDataType emptyRowType = typeFactory.builder().build(); return compile(rexBuilder, constExps, getter, emptyRowType); }
planner.setExecutor(new RexExecutorImpl(dataContext));
@Test public void testConstant() throws Exception { check((rexBuilder, executor) -> { final List<RexNode> reducedValues = new ArrayList<>(); final RexLiteral ten = rexBuilder.makeExactLiteral(BigDecimal.TEN); executor.reduce(rexBuilder, ImmutableList.of(ten), reducedValues); assertThat(reducedValues.size(), equalTo(1)); assertThat(reducedValues.get(0), instanceOf(RexLiteral.class)); assertThat(((RexLiteral) reducedValues.get(0)).getValue2(), equalTo((Object) 10L)); }); }
.build(); final RexExecutable exec = executor.getExecutable(rexBuilder, constExps, rowType); exec.setDataContext(testContext);
/** * Creates an {@link RexExecutable} that allows to apply the * generated code during query processing (filter, projection). * * @param rexBuilder Rex builder * @param exps Expressions * @param rowType describes the structure of the input row. */ public RexExecutable getExecutable(RexBuilder rexBuilder, List<RexNode> exps, RelDataType rowType) { final JavaTypeFactoryImpl typeFactory = new JavaTypeFactoryImpl(rexBuilder.getTypeFactory().getTypeSystem()); final InputGetter getter = new DataContextInputGetter(rowType, typeFactory); final String code = compile(rexBuilder, exps, getter, rowType); return new RexExecutable(code, "generated Rex code"); }
planner.setExecutor(new RexExecutorImpl(dataContext));
calciteExecutor.reduce(rexBuilder, constExps, reducedValuesByCalcite); } catch (Exception e) { logger.debug("Failed to reduce expressions using calcite executor, " + e.getMessage());