protected Node visitQuerySpecification(final QuerySpecification node, final Object context) { final Optional<WindowExpression> windowExpression = node.getWindowExpression().isPresent() ? Optional.ofNullable((WindowExpression) process(node.getWindowExpression().get(), context)) : Optional.empty(); final Optional<Expression> where = node.getWhere().isPresent() ? Optional.ofNullable((Expression) process(node.getWhere().get(), context)) : Optional.empty(); final Optional<GroupBy> groupBy = node.getGroupBy().isPresent() ? Optional.ofNullable((GroupBy) process(node.getGroupBy().get(), context)) : Optional.empty(); final Optional<Expression> having = node.getHaving().isPresent() ? Optional.ofNullable((Expression) process(node.getHaving().get(), context)) : Optional.empty(); if (node.getLocation().isPresent()) { return new QuerySpecification( node.getLocation().get(), (Select) process(node.getSelect(), context), (Relation) process(node.getInto(), context), node.isShouldCreateInto(), (Relation) process(node.getFrom(), context), windowExpression, where, groupBy, having, node.getLimit() );
@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; }
new QuerySpecification( getLocation(context), query.getSelect(), query.getInto(), query.isShouldCreateInto(), query.getFrom(), query.getWindowExpression(), query.getWhere(), query.getGroupBy(), query.getHaving(), getTextIfPresent(context.limit) ),
@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 testInsertInto() { final String insertIntoString = "INSERT INTO test2 SELECT col0, col2, col3 FROM test1 WHERE col0 > " + "100;"; final Statement statement = KSQL_PARSER.buildAst(insertIntoString, metaStore).get(0) .getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(InsertInto.class)); final InsertInto insertInto = (InsertInto) rewrittenStatement; assertThat(insertInto.getTarget().toString(), equalTo("TEST2")); final Query query = insertInto.getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(3)); assertThat(querySpecification.getFrom(), not(nullValue())); assertThat(querySpecification.getWhere().isPresent(), equalTo(true)); assertThat(querySpecification.getWhere().get(), instanceOf(ComparisonExpression.class)); final ComparisonExpression comparisonExpression = (ComparisonExpression)querySpecification.getWhere().get(); assertThat(comparisonExpression.getType().getValue(), equalTo(">")); }
@Test public void shouldNotCreateFunctionCallIfNotNeeded() { final String simpleQuery = "SELECT orderid FROM orders;"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); final QuerySpecification querySpecification = getQuerySpecification(statement); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(1)); final Expression col0 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(0)) .getExpression(); assertThat(col0, instanceOf(DereferenceExpression.class)); assertThat(col0.toString(), equalTo("ORDERS.ORDERID")); }
@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 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 testProjectFilter() { final String queryStr = "SELECT col0, col2, col3 FROM test1 WHERE col0 > 100;"; 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("testProjectFilter fails", query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat("testProjectFilter fails", querySpecification.getWhere().get(), instanceOf(ComparisonExpression.class)); final ComparisonExpression comparisonExpression = (ComparisonExpression)querySpecification.getWhere().get(); assertThat("testProjectFilter fails", comparisonExpression.toString(), equalTo("(TEST1.COL0 > 100)")); assertThat("testProjectFilter fails", querySpecification.getSelect().getSelectItems().size(), equalTo(3)); }
@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 testSelectSinkProperties() { final String simpleQuery = "create stream s1 with (timestamp='orderid', partitions = 3) as select " + "col1, col2" + " from orders where col2 is null and col3 is not null or (col3*col2 = " + "12);"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); final StatementRewriter statementRewriter = new StatementRewriter(); final Statement rewrittenStatement = (Statement) statementRewriter.process(statement, null); assertThat(rewrittenStatement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) rewrittenStatement; assertThat(createStreamAsSelect.getQuery().getQueryBody() , instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(querySpecification.getWhere().toString(), equalTo("Optional[(((ORDERS.COL2 IS NULL) AND (ORDERS.COL3 IS NOT NULL)) OR ((ORDERS.COL3 * ORDERS.COL2) = 12))]")); }
private Query mockCSASQuery(final String name) { final Query mockQuery = mock(Query.class); final QuerySpecification mockQuerySpec = mock(QuerySpecification.class); final Table mockRelation = mock(Table.class); expect(mockQuery.getQueryBody()).andStubReturn(mockQuerySpec); expect(mockQuery.getLimit()).andStubReturn(Optional.empty()); expect(mockQuerySpec.getInto()).andStubReturn(mockRelation); expect(mockRelation.getName()).andStubReturn(QualifiedName.of(name)); return mockQuery; }
@Test public void testSelectHoppingWindow() { final String queryStr = "select itemid, sum(orderunits) from orders window HOPPING ( size 30 second, advance by 5" + " seconds) " + "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().toUpperCase(), equalTo("ORDERS")); assertThat("window expression isn't present", querySpecification .getWindowExpression().isPresent()); assertThat(querySpecification.getWindowExpression().get().toString().toUpperCase(), equalTo(" WINDOW STREAMWINDOW HOPPING ( SIZE 30 SECONDS , ADVANCE BY 5 SECONDS ) ")); }
@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; }
@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 shouldSetParentsCorrectlyForQueryWithUDF() { final Statement statement = getAstWithParent("SELECT lcase(col1), concat(col2,'hello'), floor(abs(col3)) FROM test1 t1;"); final Query query = (Query) statement; final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); final SingleColumn firstSelectItem = (SingleColumn) querySpecification.getSelect().getSelectItems().get(0); final FunctionCall functionCall = (FunctionCall) firstSelectItem.getExpression(); assertThat(functionCall.getParent().get(), equalTo(firstSelectItem)); assertThat(functionCall.getArguments().get(0).getParent().get(), equalTo(functionCall)); }
@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(); 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")); assertThat(querySpecification.getWhere().get().toString(), equalTo("(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 testProjectFilter() { final String queryStr = "SELECT col0, col2, col3 FROM test1 WHERE col0 > 100;"; 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("testProjectFilter fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testProjectFilter fails", querySpecification.getWhere().get() instanceof ComparisonExpression); final ComparisonExpression comparisonExpression = (ComparisonExpression)querySpecification.getWhere().get(); Assert.assertTrue("testProjectFilter fails", comparisonExpression.toString().equalsIgnoreCase("(TEST1.COL0 > 100)")); Assert.assertTrue("testProjectFilter fails", querySpecification.getSelect().getSelectItems().size() == 3); }
@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")); }