@Override protected R visitSelect(final Select node, final C context) { for (final SelectItem item : node.getSelectItems()) { process(item, context); } return null; }
@Override protected R visitSelect(final Select node, final C context) { for (final SelectItem item : node.getSelectItems()) { process(item, context); } return null; }
private List<SelectItem> extractSelectItems(final Select select, final Relation from) { final List<SelectItem> selectItems = new ArrayList<>(); for (final SelectItem selectItem : select.getSelectItems()) { if (selectItem instanceof AllColumns) { selectItems.addAll(getSelectStarItems(selectItem, from)); } else if (selectItem instanceof SingleColumn) { selectItems.add(selectItem); } else { throw new IllegalArgumentException( "Unsupported SelectItem type: " + selectItem.getClass().getName()); } } return selectItems; }
@Override protected Node visitSelect(final Select node, final Node parent) { node.setParent(parent); for (final SelectItem item : node.getSelectItems()) { process(item, node); } 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)); }
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 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 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 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 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")); }