@Override protected R visitSingleColumn(final SingleColumn node, final C context) { process(node.getExpression(), context); return null; }
@Override protected R visitSingleColumn(final SingleColumn node, final C context) { process(node.getExpression(), context); return null; }
@Override protected Void visitSingleColumn(final SingleColumn node, final Integer indent) { builder.append(ExpressionFormatter.formatExpression(node.getExpression())); if (node.getAlias().isPresent()) { builder.append(' ') .append('"') .append(node.getAlias().get()) .append('"'); // TODO: handle quoting properly } return null; }
@Override protected Node visitSingleColumn(final SingleColumn node, final Node parent) { node.setParent(parent); process(node.getExpression(), node); return null; }
protected R visitSingleColumn(final SingleColumn node, final C context) { process(node.getExpression(), context); return visitSelectItem(node, context); }
protected Node visitSingleColumn(final SingleColumn 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 SingleColumn(node.getLocation().get(), (Expression) process(node.getExpression(), context), node.getAlias() ); } else { return new SingleColumn( (Expression) process(node.getExpression(), context), node.getAlias() ); } }
@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 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 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')")); }
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 testBooleanExpression() { 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)")); assertThat(column0.getExpression(), instanceOf(ComparisonExpression.class)); }
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(); 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)")); }
@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 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 shouldParseStructFieldAccessCorrectly() { final String simpleQuery = "SELECT iteminfo->category->name, address->street FROM orders WHERE address->state = 'CA';"; final Statement statement = KSQL_PARSER.buildAst(simpleQuery, metaStore).get(0).getStatement(); Assert.assertTrue("testSimpleQuery fails", statement instanceof Query); final Query query = (Query) statement; assertThat("testSimpleQuery fails", query.getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification querySpecification = (QuerySpecification)query.getQueryBody(); assertThat("testSimpleQuery fails", querySpecification.getSelect().getSelectItems().size(), equalTo(2)); final SingleColumn singleColumn0 = (SingleColumn) querySpecification.getSelect().getSelectItems().get(0); final SingleColumn singleColumn1 = (SingleColumn) querySpecification.getSelect().getSelectItems().get(1); assertThat(singleColumn0.getExpression(), instanceOf(FunctionCall.class)); final FunctionCall functionCall0 = (FunctionCall) singleColumn0.getExpression(); assertThat(functionCall0.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(FETCH_FIELD_FROM_STRUCT(ORDERS.ITEMINFO, 'CATEGORY'), 'NAME')")); final FunctionCall functionCall1 = (FunctionCall) singleColumn1.getExpression(); assertThat(functionCall1.toString(), equalTo("FETCH_FIELD_FROM_STRUCT(ORDERS.ADDRESS, 'STREET')")); }
@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 shouldParseNegativeInteger() { final String queryStr = String.format("SELECT -12345 FROM test1;"); 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(ArithmeticUnaryExpression.class)); final ArithmeticUnaryExpression aue = (ArithmeticUnaryExpression) column0.getExpression(); assertThat(aue.getValue(), instanceOf(IntegerLiteral.class)); assertThat(((IntegerLiteral) aue.getValue()).getValue(), equalTo(12345)); assertThat(aue.getSign(), equalTo(ArithmeticUnaryExpression.Sign.MINUS)); }