protected Node visitCreateStreamAsSelect(final CreateStreamAsSelect node, final Object context) { return new CreateStreamAsSelect( node.getLocation(), node.getName(), (Query) process(node.getQuery(), context), node.isNotExists(), node.getProperties().entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> (Expression) process(e.getValue(), context) )), node.getPartitionByColumn().isPresent() ? Optional.ofNullable( (Expression) process(node.getPartitionByColumn().get(), context)) : Optional.empty() ); }
protected Node visitCreateStreamAsSelect(final CreateStreamAsSelect node, final Node parent) { node.setParent(parent); process(node.getQuery(), node); node.getProperties().values().forEach(expression -> process(expression, node)); return null; }
protected R visitCreateStreamAsSelect(final CreateStreamAsSelect node, final C context) { process(node.getQuery(), context); node.getProperties().values().forEach(expression -> process(expression, context)); return null; }
@Override protected Void visitCreateStreamAsSelect(final CreateStreamAsSelect node, final Integer indent) { builder.append("CREATE STREAM "); if (node.isNotExists()) { builder.append("IF NOT EXISTS "); } builder.append(node.getName()); if (!node.getProperties().isEmpty()) { builder.append(" WITH ("); Joiner.on(", ") .appendTo(builder, transform( node.getProperties().entrySet(), entry -> entry.getKey() + " = " + ExpressionFormatter .formatExpression(entry.getValue()))); builder.append(")"); } builder.append(" AS "); process(node.getQuery(), indent); return null; }
private CreateStreamAsSelect mockCSAS(final String name) { final CreateStreamAsSelect mockStatement = mock(CreateStreamAsSelect.class); expect(mockStatement.getName()).andStubReturn(QualifiedName.of(name)); expect(mockStatement.getQuery()).andStubReturn(mockCSASQuery(name)); expect(mockStatement.getProperties()).andStubReturn(Collections.emptyMap()); expect(mockStatement.getPartitionByColumn()).andStubReturn(Optional.empty()); return mockStatement; }
@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 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")); }
private CommandId getSelectStreamCommandId(final CreateStreamAsSelect createStreamAsSelect) { return getStreamCommandId(createStreamAsSelect.getName().toString()); }
@Test public void shouldRunCsasStatements() { // Given: final PreparedStatement<CreateStreamAsSelect> csas = new PreparedStatement<>("CSAS1", new CreateStreamAsSelect(SOME_NAME, query, false, emptyMap(), Optional.empty())); when(engine.parseStatements(anyString())).thenReturn(ImmutableList.of(csas)); // When: standaloneExecutor.start(); // Then: verify(engine).execute(csas, ksqlConfig, emptyMap()); }
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 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")); }
@Override public Node visitCreateStreamAs(final SqlBaseParser.CreateStreamAsContext context) { Optional<Expression> partitionByColumn = Optional.empty(); if (context.identifier() != null) { partitionByColumn = Optional.of(new QualifiedNameReference( QualifiedName.of(getIdentifierText(context.identifier())))); } return new CreateStreamAsSelect( Optional.of(getLocation(context)), getQualifiedName(context.qualifiedName()), (Query) visitQuery(context.query()), context.EXISTS() != null, processTableProperties(context.tableProperties()), partitionByColumn ); }
@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))]")); }
@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(); Assert.assertTrue("testSelectTumblingWindow failed.", statement instanceof CreateStreamAsSelect); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; Assert.assertTrue("testSelectTumblingWindow failed.", createStreamAsSelect.getQuery().getQueryBody() instanceof QuerySpecification); final QuerySpecification querySpecification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); Assert.assertTrue(querySpecification.getWhere().toString().equalsIgnoreCase("Optional[(((ORDERS.COL2 IS NULL) AND (ORDERS.COL3 IS NOT NULL)) OR ((ORDERS.COL3 * ORDERS.COL2) = 12))]")); }
@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 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 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 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")); }
@Test public void shouldHaveLeftJoinTypeWhenOuterIsSpecified() { final String statementString = "CREATE STREAM foobar as SELECT * from TEST1 LEFT OUTER JOIN " + "TEST2 ON TEST1.col1 = TEST2.col1;"; final Statement statement = KSQL_PARSER.buildAst(statementString, metaStore).get(0) .getStatement(); assertThat(statement, instanceOf(CreateStreamAsSelect.class)); final CreateStreamAsSelect createStreamAsSelect = (CreateStreamAsSelect) statement; assertThat(createStreamAsSelect.getQuery().getQueryBody(), instanceOf(QuerySpecification.class)); final QuerySpecification specification = (QuerySpecification) createStreamAsSelect.getQuery().getQueryBody(); assertThat(specification.getFrom(), instanceOf(Join.class)); final Join join = (Join) specification.getFrom(); assertEquals(Join.Type.LEFT, join.getType()); }