@Override protected R visitQuerySpecification(final QuerySpecification node, final C context) { process(node.getSelect(), context); process(node.getFrom(), context); if (node.getWhere().isPresent()) { process(node.getWhere().get(), context); } if (node.getGroupBy().isPresent()) { process(node.getGroupBy().get(), context); } if (node.getHaving().isPresent()) { process(node.getHaving().get(), context); } return null; }
@Override protected R visitQuerySpecification(final QuerySpecification node, final C context) { process(node.getSelect(), context); process(node.getFrom(), context); if (node.getWhere().isPresent()) { process(node.getWhere().get(), context); } if (node.getGroupBy().isPresent()) { process(node.getGroupBy().get(), context); } if (node.getHaving().isPresent()) { process(node.getHaving().get(), context); } return null; }
@Override protected Node visitQuerySpecification(final QuerySpecification node, final Node parent) { node.setParent(parent); process(node.getSelect(), node); process(node.getFrom(), node); if (node.getWhere().isPresent()) { process(node.getWhere().get(), node); } if (node.getGroupBy().isPresent()) { process(node.getGroupBy().get(), node); } if (node.getHaving().isPresent()) { process(node.getHaving().get(), node); } return null; }
@Test public void shouldSetParentsCorrectlyForCreateStreamAsSelect() { final Statement statement = getAstWithParent("CREATE STREAM bigorders_json WITH (value_format = 'json', " + "kafka_topic='bigorders_topic') AS SELECT * FROM orders WHERE orderunits > 5 ;"); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; final Query query = createStreamAsSelect.getQuery(); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getWhere().get().getParent().get(), equalTo(querySpecification)); assertThat(querySpecification.getFrom().getParent().get(), equalTo(querySpecification)); }
@Test public void testSelectAllJoin() { final String queryStr = "SELECT * FROM test1 t1 LEFT JOIN test2 t2 ON t1.col1 = t2.col1 WHERE t2.col2 = 'test';"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(Query.class)); final Query query = (Query) rewrittenStatement; assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat("testSelectAllJoin fails", querySpecification.getFrom() instanceof Join); final Join join = (Join) querySpecification.getFrom(); assertThat("testSelectAllJoin fails", querySpecification.getSelect().getSelectItems ().size() == 15); assertThat(((AliasedRelation)join.getLeft()).getAlias(), equalTo("T1")); assertThat(((AliasedRelation)join.getRight()).getAlias(), equalTo("T2")); }
@Test public void testSimpleLeftJoin() { final String queryStr = "SELECT t1.col1, t2.col1, t2.col4, col5, t2.col2 FROM test1 t1 LEFT JOIN test2 t2 ON " + "t1.col1 = t2.col1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(Query.class)); final Query query = (Query) rewrittenStatement; assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat(querySpecification.getFrom(), instanceOf(Join.class)); final Join join = (Join) querySpecification.getFrom(); assertThat(join.getType().toString(), equalTo("LEFT")); assertThat(((AliasedRelation)join.getLeft()).getAlias(), equalTo("T1")); assertThat(((AliasedRelation)join.getRight()).getAlias(), equalTo("T2")); }
@Test public void testCreateStreamAsSelect() { final String queryStr = "CREATE STREAM bigorders_json WITH (value_format = 'json', " + "kafka_topic='bigorders_topic') AS SELECT * FROM orders WHERE orderunits > 5 ;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat("testCreateStreamAsSelect failed.", rewrittenStatement instanceof CreateStreamAsSelect); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect)rewrittenStatement; assertThat(createStreamAsSelect.getName().toString(), equalTo("BIGORDERS_JSON")); assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(8)); assertThat(querySpecification.getWhere().get().toString(), equalTo("(ORDERS.ORDERUNITS > 5)")); assertThat(((AliasedRelation)querySpecification.getFrom()).getAlias(), equalTo("ORDERS")); }
@Test public void testSelectTumblingWindow() { final String queryStr = "select itemid, sum(orderunits) from orders window TUMBLING ( size 30 second) where orderunits > 5 group by itemid;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(Query.class)); final Query query = (Query) rewrittenStatement; assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(2)); assertThat(querySpecification.getWhere().get().toString(), equalTo("(ORDERS.ORDERUNITS > 5)")); assertThat(((AliasedRelation)querySpecification.getFrom()).getAlias(), equalTo("ORDERS")); Assert.assertTrue( querySpecification.getWindowExpression().isPresent()); assertThat(querySpecification .getWindowExpression().get().toString(), equalTo(" WINDOW STREAMWINDOW TUMBLING ( SIZE 30 SECONDS ) ")); }
@Test public void testSelectSessionWindow() { final String queryStr = "select itemid, sum(orderunits) from orders window SESSION ( 30 second) where " + "orderunits > 5 group by itemid;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(Query.class)); final Query query = (Query) rewrittenStatement; assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(2)); assertThat(querySpecification.getWhere().get().toString(), equalTo("(ORDERS.ORDERUNITS > 5)")); assertThat(((AliasedRelation)querySpecification.getFrom()).getAlias(), equalTo("ORDERS")); Assert.assertTrue( querySpecification.getWindowExpression().isPresent()); assertThat(querySpecification .getWindowExpression().get().toString(), equalTo(" WINDOW STREAMWINDOW SESSION " + "( 30 SECONDS ) ")); }
@Test public void testCreateStreamAsSelect() { final String queryStr = "CREATE STREAM bigorders_json WITH (value_format = 'json', " + "kafka_topic='bigorders_topic') AS SELECT * FROM orders WHERE orderunits > 5 ;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); assertThat( statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect)statement; assertThat(createStreamAsSelect.getName().toString().toLowerCase(), equalTo("bigorders_json")); assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(8)); assertThat(querySpecification.getWhere().get().toString().toUpperCase(), equalTo("(ORDERS.ORDERUNITS > 5)")); assertThat(((AliasedRelation)querySpecification.getFrom()).getAlias().toUpperCase(), equalTo("ORDERS")); }
@Test public void testSelectAllJoin() { final String queryStr = "SELECT * FROM test1 t1 LEFT JOIN test2 t2 ON t1.col1 = t2.col1 WHERE t2.col2 = 'test';"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testSimpleQuery fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testLeftJoinWithFilter fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testSelectAllJoin fails", querySpecification.getFrom() instanceof Join); final Join join = (Join) querySpecification.getFrom(); Assert.assertTrue("testSelectAllJoin fails", querySpecification.getSelect().getSelectItems ().size() == 15); Assert.assertTrue("testLeftJoinWithFilter fails", ((AliasedRelation)join.getLeft()).getAlias().equalsIgnoreCase("T1")); Assert.assertTrue("testLeftJoinWithFilter fails", ((AliasedRelation)join.getRight()).getAlias().equalsIgnoreCase("T2")); }
@Test public void testLeftJoinWithFilter() { final String queryStr = "SELECT t1.col1, t2.col1, t2.col4, t2.col2 FROM test1 t1 LEFT JOIN test2 t2 ON t1.col1 = " + "t2.col1 WHERE t2.col2 = 'test';"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testSimpleQuery fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testLeftJoinWithFilter fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testLeftJoinWithFilter fails", querySpecification.getFrom() instanceof Join); final Join join = (Join) querySpecification.getFrom(); Assert.assertTrue("testLeftJoinWithFilter fails", join.getType().toString().equalsIgnoreCase("LEFT")); Assert.assertTrue("testLeftJoinWithFilter fails", ((AliasedRelation)join.getLeft()).getAlias().equalsIgnoreCase("T1")); Assert.assertTrue("testLeftJoinWithFilter fails", ((AliasedRelation)join.getRight()).getAlias().equalsIgnoreCase("T2")); Assert.assertTrue("testLeftJoinWithFilter fails", querySpecification.getWhere().get().toString().equalsIgnoreCase("(T2.COL2 = 'test')")); }
@Test public void testSimpleLeftJoin() { final String queryStr = "SELECT t1.col1, t2.col1, t2.col4, col5, t2.col2 FROM test1 t1 LEFT JOIN test2 t2 ON " + "t1.col1 = t2.col1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testSimpleQuery fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testSimpleLeftJoin fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testSimpleLeftJoin fails", querySpecification.getFrom() instanceof Join); final Join join = (Join) querySpecification.getFrom(); Assert.assertTrue("testSimpleLeftJoin fails", join.getType().toString().equalsIgnoreCase("LEFT")); Assert.assertTrue("testSimpleLeftJoin fails", ((AliasedRelation)join.getLeft()).getAlias().equalsIgnoreCase("T1")); Assert.assertTrue("testSimpleLeftJoin fails", ((AliasedRelation)join.getRight()).getAlias().equalsIgnoreCase("T2")); }
@Test public void testSimpleQuery() { final String simpleQuery = "SELECT col0, col2, col3 FROM test1 WHERE col0 > 100;"; final PreparedStatement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0); assertThat(statement.getStatementText(), is(simpleQuery)); Assert.assertTrue("testSimpleQuery fails", statement.getStatement() instanceof Query); final Query query = (Query) statement.getStatement(); Assert.assertTrue("testSimpleQuery fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testSimpleQuery fails", querySpecification.getSelect().getSelectItems().size() == 3); assertThat(querySpecification.getFrom(), not(nullValue())); Assert.assertTrue("testSimpleQuery fails", querySpecification.getWhere().isPresent()); Assert.assertTrue("testSimpleQuery fails", querySpecification.getWhere().get() instanceof ComparisonExpression); final ComparisonExpression comparisonExpression = (ComparisonExpression)querySpecification.getWhere().get(); Assert.assertTrue("testSimpleQuery fails", comparisonExpression.getType().getValue().equalsIgnoreCase(">")); }
@Test public void testSelectSessionWindow() { final String queryStr = "select itemid, sum(orderunits) from orders window SESSION ( 30 second) where " + "orderunits > 5 group by itemid;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testSelectSessionWindow failed.", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testSelectSessionWindow failed.", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); Assert.assertTrue("testCreateTable failed.", querySpecification.getSelect().getSelectItems ().size() == 2); Assert.assertTrue("testSelectSessionWindow failed.", querySpecification.getWhere().get().toString().equalsIgnoreCase("(ORDERS.ORDERUNITS > 5)")); Assert.assertTrue("testSelectSessionWindow failed.", ((AliasedRelation)querySpecification.getFrom()).getAlias().equalsIgnoreCase("ORDERS")); Assert.assertTrue("testSelectSessionWindow failed.", querySpecification .getWindowExpression().isPresent()); Assert.assertTrue("testSelectSessionWindow failed.", querySpecification .getWindowExpression().get().toString().equalsIgnoreCase(" WINDOW STREAMWINDOW SESSION " + "( 30 SECONDS ) ")); }
@Test public void shouldHaveLeftJoinTypeWhenOuterIsSpecified() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 LEFT OUTER JOIN " + "TEST2 ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.LEFT, join.getType()); }
@Test public void shouldHaveOuterJoinTypeWhenOuterKeywordIsSpecified() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 FULL OUTER JOIN " + "TEST2 ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.OUTER, join.getType()); }
@Test public void shouldHaveInnerJoinTypeWithExplicitInnerKeyword() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 INNER JOIN TEST2 " + "ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.INNER, join.getType()); }
@Test public void shouldHaveLeftJoinType() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 LEFT JOIN " + "TEST2 ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.LEFT, join.getType()); }
@Test public void shouldHaveOuterJoinType() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 FULL JOIN " + "TEST2 ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.OUTER, join.getType()); }