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 >
