private void printMain(PrintWriter pw, RelNode root) { Set<TableScan> tables = new HashSet<>(); pw.print(INITIALIZER_PROLOGUE); chainOperators(pw, root, tables); for (TableScan n : tables) { String escaped = CompilerUtil.escapeJavaString( Joiner.on('.').join(n.getTable().getQualifiedName()), true); String r = NEW_LINE_JOINER.join( " if (!data.containsKey(%1$s))", " throw new RuntimeException(\"Cannot find table \" + %1$s);", " data.get(%1$s).open(CTX_%2$d);", ""); pw.print(String.format(r, escaped, n.getId())); } pw.print(" }\n"); }
private void chainOperators(PrintWriter pw, RelNode root, Set<TableScan> tables) { doChainOperators(pw, root, tables, "r"); }
public AbstractValuesProcessor compile(RelNode plan) throws Exception { String javaCode = generateJavaSource(plan); LOG.debug("Compiling... source code {}", javaCode); ClassLoader cl = new CompilingClassLoader(getClass().getClassLoader(), PACKAGE_NAME + ".Processor", javaCode, null); return (AbstractValuesProcessor) cl.loadClass( PACKAGE_NAME + ".Processor").newInstance(); }
private String generateJavaSource(RelNode root) throws Exception { StringWriter sw = new StringWriter(); try (PrintWriter pw = new PrintWriter(sw)) { RelNodeCompiler compiler = new RelNodeCompiler(pw, typeFactory); printPrologue(pw); compiler.traverse(root); printMain(pw, root); printEpilogue(pw); } return sw.toString(); }
private Values testExpr(List<String> exprs) throws Exception { String sql = "SELECT " + Joiner.on(',').join(exprs) + " FROM FOO" + " WHERE ID > 0 AND ID < 2"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverDummyTable(sql); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(state.tree()); Map<String, DataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockDataSource()); List<CorrelatedValues> values = new ArrayList<>(); ChannelHandler h = new TestUtils.CollectDataChannelHandler(values); proc.initialize(data, h); return values.get(0); }
@Override public void execute( Iterable<String> statements, ChannelHandler result) throws Exception { Map<String, DataSource> dataSources = new HashMap<>(); for (String sql : statements) { StreamlineParser parser = new StreamlineParser(sql); SqlNode node = parser.impl().parseSqlStmtEof(); if (node instanceof SqlCreateTable) { handleCreateTable((SqlCreateTable) node, dataSources); } else if (node instanceof SqlCreateFunction) { handleCreateFunction((SqlCreateFunction) node); } else { FrameworkConfig config = buildFrameWorkConfig(); Planner planner = Frameworks.getPlanner(config); SqlNode parse = planner.parse(sql); SqlNode validate = planner.validate(parse); RelNode tree = planner.convert(validate); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(tree); proc.initialize(dataSources, result); } } }
@Test public void testUdf() throws Exception { String sql = "SELECT MYPLUS(ID, 3)" + "FROM FOO " + "WHERE ID = 2"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverNestedTable(sql); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(state.tree()); Map<String, DataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockDataSource()); List<CorrelatedValues> values = new ArrayList<>(); ChannelHandler h = new TestUtils.CollectDataChannelHandler(values); proc.initialize(data, h); Assert.assertEquals(1, values.size()); Assert.assertEquals(1, values.get(0).size()); Assert.assertEquals(5, values.get(0).get(0)); } }
private void doChainOperators(PrintWriter pw, RelNode node, Set<TableScan> tables, String parentCtx) { pw.print( String.format(" ChannelContext CTX_%d = Channels.chain(%2$s, %3$s);\n", node.getId(), parentCtx, RelNodeCompiler.getStageName(node))); String currentCtx = String.format("CTX_%d", node.getId()); if (node instanceof TableScan) { tables.add((TableScan) node); } for (RelNode i : node.getInputs()) { doChainOperators(pw, i, tables, currentCtx); } }
@Test public void testCompile() throws Exception { String sql = "SELECT ID + 1 FROM FOO WHERE ID > 2"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverDummyTable(sql); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(state.tree()); Map<String, DataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockDataSource()); List<CorrelatedValues> values = new ArrayList<>(); ChannelHandler h = new TestUtils.CollectDataChannelHandler(values); proc.initialize(data, h); Assert.assertEquals(2, values.size()); Assert.assertEquals(1, values.get(0).size()); Assert.assertEquals(4, values.get(0).get(0)); Assert.assertEquals(1, values.get(1).size()); Assert.assertEquals(5, values.get(1).get(0)); }
@Test public void testLogicalExpr() throws Exception { String sql = "SELECT ID > 0 OR ID < 1, ID > 0 AND ID < 1, NOT (ID > 0 AND ID < 1) FROM FOO WHERE ID > 0 AND ID < 2"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverDummyTable(sql); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(state.tree()); Map<String, DataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockDataSource()); List<CorrelatedValues> values = new ArrayList<>(); ChannelHandler h = new TestUtils.CollectDataChannelHandler(values); proc.initialize(data, h); Assert.assertEquals(1, values.size()); Assert.assertEquals(3, values.get(0).size()); Assert.assertEquals(true, values.get(0).get(0)); Assert.assertEquals(false, values.get(0).get(1)); Assert.assertEquals(true, values.get(0).get(2)); }
@Test public void testNested() throws Exception { String sql = "SELECT ID, MAPFIELD['c'], NESTEDMAPFIELD, ARRAYFIELD " + "FROM FOO " + "WHERE NESTEDMAPFIELD['a']['b'] = 2 AND ARRAYFIELD[2] = 200"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverNestedTable(sql); PlanCompiler compiler = new PlanCompiler(typeFactory); AbstractValuesProcessor proc = compiler.compile(state.tree()); Map<String, DataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockNestedDataSource()); List<CorrelatedValues> values = new ArrayList<>(); ChannelHandler h = new TestUtils.CollectDataChannelHandler(values); proc.initialize(data, h); Map<String, Integer> map = ImmutableMap.of("b", 2, "c", 4); Map<String, Map<String, Integer>> nestedMap = ImmutableMap.of("a", map); Assert.assertEquals(1, values.size()); Assert.assertEquals(4, values.get(0).size()); Assert.assertEquals(2, values.get(0).get(0)); Assert.assertEquals(4, values.get(0).get(1)); Assert.assertEquals(nestedMap, values.get(0).get(2)); Assert.assertEquals(Arrays.asList(100, 200, 300), values.get(0).get(3)); }