Thanks a lot Stamatis, very helpful and responsive as always :)

Here is what worked perfectly for me so far after building over what you
provided.

HashMap<String, Object> parameters = new HashMap<>();
dataContext.setMap(parameters); // A custom context object holding my root
schema and type factory. The setMap method is custom too to provide my own
parameters map
Iterator<Object[]> resultsIterator =
EnumerableInterpretable.toBindable(parameters, null, (EnumerableRel)
planned, EnumerableRel.Prefer.ARRAY).bind(dataContext).iterator();
// "planned" is the optimized/physical plan.

Now the "resultsIterator" iterator has all my result set. The tricky part
was that for single column resultsets, the output from the iterator is a
single object, not an Object[].

Thanks,
Gelbana


On Wed, Jul 17, 2019 at 11:31 PM Stamatis Zampetakis <[email protected]>
wrote:

> Hi Gelbana,
>
> In [1, 2] you can find rather full end-to-end example with the main Calcite
> primitives in use. Hope it helps!
>
> Best,
> Stamatis
>
> [1]
>
> https://github.com/zabetak/calcite/blob/livecodingdemo/core/src/test/java/org/apache/calcite/examples/foodmart/java/EndToEndExampleBindable.java
> [2]
>
> https://github.com/michaelmior/calcite-notebooks/blob/master/query-optimization.ipynb
>
> On Wed, Jul 17, 2019 at 7:18 PM Muhammad Gelbana <[email protected]>
> wrote:
>
> > I think I saw a message asking the same thing but I'm unable to dig it up
> > as I can't quite remember the subject. Is there a test class that
> executes
> > SQL queries and access the results without using the JDBC API ?
> >
> > Here is my attempt:
> > ---------------
> > Planner planner = Frameworks.getPlanner(frameworkConfig); //
> > frameworkConfig programs is set usign "Programs.standard()"
> >
> > SqlNode parsed = planner.parse("SELECT 1 + 1 FROM myschema.mytable limit
> 1"
> > ); // Assume the existense of "myschema.mytable", don't try (VALUES())
> > SqlNode validated = planner.validate(parsed);
> > RelNode converted = planner.rel(validated).rel;
> > RelNode planned = planner.transform(0,
> > converted.getTraitSet().replace(EnumerableConvention.INSTANCE),
> converted);
> >
> > TestDataContext dataContext = new TestDataContext(rootSchema,
> > (JavaTypeFactory) planner.getTypeFactory()); // A context that provides
> the
> > root schema and the java type factory only
> > try (Interpreter interpreter = new Interpreter(dataContext, planned)) {
> >     Enumerator<Object[]> results =
> interpreter.asEnumerable().enumerator();
> >     while(results.moveNext()) {
> >         System.out.println(Arrays.toString(results.current()));
> >     }
> > }
> > ---------------
> > This fails and throws the following error
> > Exception in thread "main" java.lang.AssertionError: interpreter: no
> > implementation for class
> > org.apache.calcite.adapter.enumerable.EnumerableInterpreter
> > at
> >
> >
> org.apache.calcite.interpreter.Interpreter$CompilerImpl.visit(Interpreter.java:460)
> > at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:42)
> > at org.apache.calcite.rel.SingleRel.childrenAccept(SingleRel.java:72)
> > at
> >
> >
> org.apache.calcite.interpreter.Interpreter$CompilerImpl.visit(Interpreter.java:447)
> > at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:42)
> > at
> >
> >
> org.apache.calcite.interpreter.Interpreter$CompilerImpl.visitRoot(Interpreter.java:405)
> > at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:88)
> >
> > The output of RelOptUtil.toString(planned) is
> > EnumerableCalc(expr#0..22=[{inputs}], expr#23=[1], expr#24=[2],
> > expr#25=[+($t23, $t24)], EXPR$0=[$t25])
> >   EnumerableLimit(fetch=[1])
> >     EnumerableInterpreter
> >       BindableTableScan(table=[[myschema, mytable]])
> >
> > The reason for this is the converter node "EnumerableInterpreter"
> > converting from the bindable table scan node to an enumerable convention
> > node.
> >
> > Thanks,
> > Gelbana
> >
>

Reply via email to