@Override protected R visitSelect(final Select node, final C context) { for (final SelectItem item : node.getSelectItems()) { process(item, context); } return null; }
protected Node visitSelect(final Select node, final Object context) { // use an if/else block here (instead of isPresent.map(...).orElse(...)) so only one object // gets instantiated (issue #1784) if (node.getLocation().isPresent()) { return new Select(node.getLocation().get(), node.isDistinct(), node.getSelectItems() .stream() .map(selectItem -> (SelectItem) process(selectItem, context)) .collect(Collectors.toList())); } else { return new Select(node.isDistinct(), node.getSelectItems() .stream() .map(selectItem -> (SelectItem) process(selectItem, context)) .collect(Collectors.toList()) ); } }
@Override protected Node visitSelect(final Select node, final Node parent) { node.setParent(parent); for (final SelectItem item : node.getSelectItems()) { process(item, node); } return null; }
@Override protected Void visitSelect(final Select node, final Integer indent) { append(indent, "SELECT"); if (node.isDistinct()) { builder.append(" DISTINCT"); } if (node.getSelectItems().size() > 1) { boolean first = true; for (final SelectItem item : node.getSelectItems()) { builder.append("\n") .append(indentString(indent)) .append(first ? " " : ", "); process(item, indent); first = false; } } else { builder.append(' '); process(getOnlyElement(node.getSelectItems()), indent); } builder.append('\n'); return null; }
Select select = new Select( getLocation(context.SELECT()), false, visit(context.selectItem(), SelectItem.class) ); select = new Select( getLocation(context.SELECT()), select.isDistinct(), extractSelectItems(select, from) );
@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)); }
@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; }
@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 shouldCreateCorrectFunctionCallExpressionWithSubscript() { final String simpleQuery = "SELECT arraycol[0]->name as n0, mapcol['key']->name as n1 FROM nested_stream;"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); final QuerySpecification querySpecification = getQuerySpecification(statement); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(2)); final Expression col0 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(0)) .getExpression(); final Expression col1 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(1)) .getExpression(); assertThat(col0, instanceOf(FunctionCall.class)); assertThat(col1, instanceOf(FunctionCall.class)); assertThat(col0.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(NESTED_STREAM.ARRAYCOL[0], 'NAME')")); assertThat(col1.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(NESTED_STREAM.MAPCOL['key'], 'NAME')")); }
@Test public void shouldCreateCorrectFunctionCallExpression() { final String simpleQuery = "SELECT iteminfo->category->name, address->state FROM orders;"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); final QuerySpecification querySpecification = getQuerySpecification(statement); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(2)); final Expression col0 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(0)) .getExpression(); final Expression col1 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(1)) .getExpression(); assertThat(col0, instanceOf(FunctionCall.class)); assertThat(col1, instanceOf(FunctionCall.class)); assertThat(col0.toString(), equalTo( "FETCH_FIELD_FROM_STRUCT(FETCH_FIELD_FROM_STRUCT(ORDERS.ITEMINFO, 'CATEGORY'), 'NAME')")); assertThat(col1.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(ORDERS.ADDRESS, 'STATE')")); }
@Test public void shouldCreateCorrectFunctionCallExpressionWithSubscriptWithExpressionIndex() { final String simpleQuery = "SELECT arraycol[CAST (item->id AS INTEGER)]->name as n0, mapcol['key']->name as n1 FROM nested_stream;"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); final QuerySpecification querySpecification = getQuerySpecification(statement); assertThat(querySpecification.getSelect().getSelectItems().size(), equalTo(2)); final Expression col0 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(0)) .getExpression(); final Expression col1 = ((SingleColumn) querySpecification.getSelect().getSelectItems().get(1)) .getExpression(); assertThat(col0, instanceOf(FunctionCall.class)); assertThat(col1, instanceOf(FunctionCall.class)); assertThat(col0.toString(), equalTo( "FETCH_FIELD_FROM_STRUCT(NESTED_STREAM.ARRAYCOL[CAST(FETCH_FIELD_FROM_STRUCT(NESTED_STREAM.ITEM, 'ID') AS INTEGER)], 'NAME')")); assertThat(col1.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(NESTED_STREAM.MAPCOL['key'], 'NAME')")); }
@Test public void testProjection() { final String queryStr = "SELECT col0, col2, col3 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(); assertThat(querySpecification.getSelect().getSelectItems().size() , equalTo(3)); assertThat(querySpecification.getSelect().getSelectItems().get(0), instanceOf(SingleColumn.class)); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); assertThat(column0.getAlias().get(), equalTo("COL0")); assertThat(column0.getExpression().toString(), equalTo("TEST1.COL0")); }
@Test public void testProjectionWithArrayMap() { final String queryStr = "SELECT col0, col2, col3, col4[0], col5['key1'] 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("testProjectionWithArrayMap fails", query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat("testProjectionWithArrayMap fails", querySpecification.getSelect().getSelectItems() .size(), equalTo(5)); assertThat("testProjectionWithArrayMap fails", querySpecification.getSelect().getSelectItems().get(0) instanceof SingleColumn); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); assertThat("testProjectionWithArrayMap fails", column0.getAlias().get(), equalTo("COL0")); assertThat("testProjectionWithArrayMap fails", column0.getExpression().toString(), equalTo("TEST1.COL0")); final SingleColumn column3 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(3); final SingleColumn column4 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(4); assertThat("testProjectionWithArrayMap fails", column3.getExpression().toString(), equalTo("TEST1.COL4[0]")); assertThat("testProjectionWithArrayMap fails", column4.getExpression().toString(), equalTo("TEST1.COL5['key1']")); }
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 testUDF() { final String queryStr = "SELECT lcase(col1), concat(col2,'hello'), floor(abs(col3)) 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(); final SingleColumn column0 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(0); assertThat(column0.getAlias().get(), equalTo("KSQL_COL_0")); assertThat(column0.getExpression().toString(), equalTo("LCASE(T1.COL1)")); final SingleColumn column1 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(1); assertThat(column1.getAlias().get(), equalTo("KSQL_COL_1")); assertThat(column1.getExpression().toString(), equalTo("CONCAT(T1.COL2, 'hello')")); final SingleColumn column2 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(2); assertThat(column2.getAlias().get(), equalTo("KSQL_COL_2")); assertThat(column2.getExpression().toString(), equalTo("FLOOR(ABS(T1.COL3))")); }
@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 testBooleanLogicalExpression() { final String queryStr = "SELECT 10, col2, 'test', 2.5, true, -5 FROM test1 WHERE col1 = 10 AND col2 LIKE 'val' OR col4 > 2.6 ;"; 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("10")); final SingleColumn column1 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(1); assertThat(column1.getAlias().get(), equalTo("COL2")); assertThat(column1.getExpression().toString(), equalTo("TEST1.COL2")); final SingleColumn column2 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(2); assertThat(column2.getAlias().get(), equalTo("KSQL_COL_2")); assertThat(column2.getExpression().toString(), equalTo("'test'")); }
@Test public void testLiterals() { final String queryStr = "SELECT 10, col2, 'test', 2.5, true, -5 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("10")); final SingleColumn column1 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(1); assertThat(column1.getAlias().get(), equalTo("COL2")); assertThat(column1.getExpression().toString(), equalTo("TEST1.COL2")); final SingleColumn column2 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(2); assertThat(column2.getAlias().get(), equalTo("KSQL_COL_2")); assertThat(column2.getExpression().toString(), equalTo("'test'")); final SingleColumn column3 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(3); assertThat(column3.getAlias().get(), equalTo("KSQL_COL_3")); assertThat(column3.getExpression().toString(), equalTo("2.5")); final SingleColumn column4 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(4); assertThat(column4.getAlias().get(), equalTo("KSQL_COL_4")); assertThat(column4.getExpression().toString(), equalTo("true")); final SingleColumn column5 = (SingleColumn)querySpecification.getSelect().getSelectItems().get(5); assertThat(column5.getAlias().get(), equalTo("KSQL_COL_5")); assertThat(column5.getExpression().toString(), equalTo("-5")); }