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); }
@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)); } }
@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)); }
@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)); }
@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); } } }