@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; }
@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 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 shouldSetParentsCorrectlyForSimpleQuery() { final Statement statement = getAstWithParent("SELECT col0, col2, col3 FROM test1 WHERE col0 > 100;"); Assert.assertFalse(statement.getParent().isPresent()); assertThat(statement, instanceOf(Query.class)); final Query query = (Query) statement; Assert.assertTrue(query.getQueryBody().getParent().isPresent()); assertThat(query.getQueryBody().getParent().get(), equalTo(query)); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); final Select select = querySpecification.getSelect(); assertThat(select.getParent().get(), equalTo(querySpecification)); }
private static SearchedCaseExpression getSearchedCaseExpressionFromCsas(final Statement statement) { final Query query = ((CreateStreamAsSelect) statement).getQuery(); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); final Expression caseExpression = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(0)).getExpression(); return (SearchedCaseExpression) caseExpression; }
@Test public void testSelectAll() { final String queryStr = "SELECT * FROM test1 t1;"; 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(8)); }
@Test public void testProjection() { final String queryStr = "SELECT col0, col2, col3 FROM test1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testProjection fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testProjection fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testProjection fails", querySpecification.getSelect().getSelectItems().size() == 3); Assert.assertTrue("testProjection fails", querySpecification.getSelect().getSelectItems().get(0) instanceof SingleColumn); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); Assert.assertTrue("testProjection fails", column0.getAlias().get().equalsIgnoreCase("COL0")); Assert.assertTrue("testProjection fails", column0.getExpression().toString().equalsIgnoreCase("TEST1.COL0")); }
@Test public void testBinaryExpression() { final String queryStr = "SELECT col0+10, col2, col3-col1 FROM test1;"; 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(); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); assertThat(column0.getAlias().get(), equalTo("KSQL_COL_0")); assertThat(column0.getExpression().toString(), equalTo("(TEST1.COL0 + 10)")); }
private <T, L extends Literal> void shouldParseNumericLiteral(final T value, final L expectedValue) { final String queryStr = String.format("SELECT " + value.toString() + " FROM test1;", value); final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); assertThat(statement, instanceOf(Query.class)); final Query query = (Query) statement; assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); final SingleColumn column0 = (SingleColumn) querySpecification.getSelect().getSelectItems().get(0); assertThat(column0.getAlias().get(), equalTo("KSQL_COL_0")); assertThat(column0.getExpression(), instanceOf(expectedValue.getClass())); assertThat(column0.getExpression(), equalTo(expectedValue)); }
@Test public void testBinaryExpression() { final String queryStr = "SELECT col0+10, col2, col3-col1 FROM test1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testBinaryExpression fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testBinaryExpression fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); Assert.assertTrue("testBinaryExpression fails", column0.getAlias().get().equalsIgnoreCase("KSQL_COL_0")); Assert.assertTrue("testBinaryExpression fails", column0.getExpression().toString().equalsIgnoreCase("(TEST1.COL0 + 10)")); }
@Test public void testBooleanExpression() { final String queryStr = "SELECT col0 = 10, col2, col3 > col1 FROM test1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testBooleanExpression fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testProjection fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); Assert.assertTrue("testBooleanExpression fails", column0.getAlias().get().equalsIgnoreCase("KSQL_COL_0")); Assert.assertTrue("testBooleanExpression fails", column0.getExpression().toString().equalsIgnoreCase("(TEST1.COL0 = 10)")); }
@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 testSelectAll() { final String queryStr = "SELECT * FROM test1 t1;"; final Statement statement = KSQL_PARSER.buildAst(queryStr, metaStore).get(0).getStatement(); Assert.assertTrue("testSelectAll fails", statement instanceof Query); final Query query = (Query) statement; Assert.assertTrue("testSelectAll fails", query.getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); Assert.assertTrue("testSelectAll fails", querySpecification.getSelect().getSelectItems() .size() == 8); }
@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 shouldPassJoinQueryParseIfStreamColumnNameWithAliasIsNotAmbiguous() { final String statementString = "CREATE STREAM S AS SELECT itemid.itemid FROM address a JOIN itemid on a.itemid = itemid.itemid;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final Query query = ((CreateStreamAsSelect) statement).getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().get(0).toString(), equalTo("ITEMID.ITEMID ITEMID_ITEMID")); }
@Test public void shouldAddPrefixEvenIfColumnNameIsTheSameAsStream() { final String statementString = "CREATE STREAM S AS SELECT address FROM address a;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final Query query = ((CreateStreamAsSelect) statement).getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().get(0).toString(), equalTo("A.ADDRESS ADDRESS")); }
@Test public void shouldPassIfStreamColumnNameWithAliasIsNotAmbiguous() { final String statementString = "CREATE STREAM S AS SELECT a.address->city FROM address a;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final Query query = ((CreateStreamAsSelect) statement).getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().get(0).toString(), equalTo("FETCH_FIELD_FROM_STRUCT(A.ADDRESS, 'CITY') ADDRESS__CITY")); }
@Test public void shouldPassIfStreamColumnNameIsNotAmbiguous() { final String statementString = "CREATE STREAM S AS SELECT address.address->city FROM address a;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final Query query = ((CreateStreamAsSelect) statement).getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().get(0).toString(), equalTo("FETCH_FIELD_FROM_STRUCT(ADDRESS.ADDRESS, 'CITY') ADDRESS__CITY")); }
@Test public void shouldNotAddPrefixIfStreamNameIsPrefix() { final String statementString = "CREATE STREAM S AS SELECT address.orderid FROM address a;"; KSQL_PARSER.buildAst(statementString, metaStore); final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final Query query = ((CreateStreamAsSelect) statement).getQuery(); assertThat(query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody(); assertThat(querySpecification.getSelect().getSelectItems().get(0).toString(), equalTo("ADDRESS.ORDERID ORDERID")); }