From 54b4c7765f96984e6db5570b9398153315f256ae Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Tue, 21 Jan 2025 19:14:52 -0800 Subject: [PATCH 01/10] WIP --- .../binding/pgsql/parser/PostgreSqlLexer.g4 | 4 - .../binding/pgsql/parser/PostgreSqlParser.g4 | 53 -------- .../binding/pgsql/parser/PgsqlParser.java | 20 --- .../parser/listener/SqlCommandListener.java | 7 -- .../listener/SqlCreateZstreamListener.java | 117 ------------------ .../pgsql/parser/model/CreateZstream.java | 27 ---- .../pgsql/parser/model/ZstreamColumn.java | 22 ---- .../binding/pgsql/parser/PgsqlParserTest.java | 97 --------------- .../macro/RisingwaveCreateZstreamMacro.java | 1 - .../macro/RisingwaveDropZstreamMacro.java | 1 - .../stream/RisingwaveProxyFactory.java | 1 - 11 files changed, 350 deletions(-) delete mode 100644 incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZstreamListener.java delete mode 100644 incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZstream.java delete mode 100644 incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/ZstreamColumn.java diff --git a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 index 67282d4061..70f4bca885 100644 --- a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 +++ b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 @@ -301,8 +301,6 @@ TOPIC: 'TOPIC'; TOPICS: 'TOPICS'; -ZSTREAM: 'ZSTREAM'; - ZVIEW: 'ZVIEW'; ZVIEWS: 'ZVIEWS'; @@ -560,8 +558,6 @@ ZFUNCTION: 'ZFUNCTION'; ZFUNCTIONS: 'ZFUNCTIONS'; -ZSTREAMS: 'ZSTREAMS'; - GLOBAL: 'GLOBAL'; GRANTED: 'GRANTED'; diff --git a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 index fc089dfcf8..b7f0dd74b0 100644 --- a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 +++ b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 @@ -107,7 +107,6 @@ stmt | createseqstmt | createstmt | createztstmt - | createzstreamstmt | createsubscriptionstmt | createstatsstmt | createtablespacestmt @@ -415,39 +414,9 @@ altertablestmt | ALTER MATERIALIZED VIEW (IF_P EXISTS)? qualified_name alter_table_cmds | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name (OWNED BY role_list)? SET TABLESPACE name opt_nowait | ALTER FOREIGN TABLE (IF_P EXISTS)? relation_expr alter_table_cmds - | ALTER ZSTREAM (IF_P EXISTS)? relation_expr alter_zstream_cmds | ALTER ZVIEW (IF_P EXISTS)? qualified_name alter_table_cmds ; -alter_zstream_cmds - : alter_zstream_cmd (COMMA alter_zstream_cmd)* - ; - -alter_zstream_cmd - : ADD_P columnDef - | ADD_P IF_P NOT EXISTS columnDef - | ADD_P COLUMN columnDef - | ADD_P COLUMN IF_P NOT EXISTS columnDef - | ALTER opt_column colid alter_column_default - | ALTER opt_column colid DROP NOT NULL_P - | ALTER opt_column colid SET NOT NULL_P - | ALTER opt_column colid DROP EXPRESSION - | ALTER opt_column colid DROP EXPRESSION IF_P EXISTS - | ALTER opt_column colid SET STATISTICS signediconst - | ALTER opt_column iconst SET STATISTICS signediconst - | ALTER opt_column colid SET reloptions - | ALTER opt_column colid RESET reloptions - | ALTER opt_column colid SET STORAGE colid - | ALTER opt_column colid ADD_P GENERATED generated_when AS IDENTITY_P optparenthesizedseqoptlist - | ALTER opt_column colid alter_identity_column_option_list - | ALTER opt_column colid DROP IDENTITY_P - | ALTER opt_column colid DROP IDENTITY_P IF_P EXISTS - | ALTER opt_column colid opt_set_data TYPE_P typename opt_collate_clause alter_using - | ALTER opt_column colid alter_generic_options - | DROP opt_column IF_P EXISTS colid opt_drop_behavior - | DROP opt_column colid opt_drop_behavior - ; - alter_table_cmds : alter_table_cmd (COMMA alter_table_cmd)* ; @@ -694,22 +663,6 @@ copy_generic_opt_arg_list_item : opt_boolean_or_string ; -createzstreamstmt - : CREATE ZSTREAM (IF_P NOT EXISTS)? zstream_name OPEN_PAREN zstream_columns CLOSE_PAREN opt_with_zstream - ; - -zstream_name - : qualified_name - ; - -zstream_columns - : zstream_column (COMMA zstream_column)* - ; - -zstream_column - : colid typename opt_generated_clause - ; - opt_generated_clause : GENERATED ALWAYS AS generation_type | /* Empty */ @@ -720,10 +673,6 @@ generation_type | NOW ; -opt_with_zstream - : WITH OPEN_PAREN zreloptions CLOSE_PAREN - ; - zreloptions : zreloption_elem (COMMA zreloption_elem)* ; @@ -1679,7 +1628,6 @@ show_object_type_name | ZTABLES | ZVIEWS | ZFUNCTIONS - | ZSTREAMS ; dropstmt @@ -1703,7 +1651,6 @@ object_type_any_name | VIEW | MATERIALIZED VIEW | TOPIC - | ZSTREAM | ZVIEW | ZTABLE | INDEX diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 34040c5f73..5e0d2adde9 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -34,7 +34,6 @@ import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCommandListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateFunctionListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateZfunctionListener; -import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateZstreamListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateZtableTopicListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateZviewListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlDropListener; @@ -43,7 +42,6 @@ import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateFunction; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateTable; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZview; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; @@ -54,10 +52,8 @@ public final class PgsqlParser private final CommonTokenStream tokens; private final PostgreSqlParser parser; private final SqlCommandListener commandListener; - private final SqlCreateZstreamListener createStreamListener; private final SqlCreateZtableTopicListener createTableListener; private final SqlAlterZtableTopicListener alterTableListener; - private final SqlAlterZstreamTopicListener alterStreamListener; private final SqlCreateFunctionListener createFunctionListener; private final SqlCreateZfunctionListener createZfunctionListener; private final SqlCreateZviewListener createMaterializedViewListener; @@ -79,8 +75,6 @@ public PgsqlParser() this.commandListener = new SqlCommandListener(tokens); this.createTableListener = new SqlCreateZtableTopicListener(tokens); this.alterTableListener = new SqlAlterZtableTopicListener(tokens); - this.alterStreamListener = new SqlAlterZstreamTopicListener(tokens); - this.createStreamListener = new SqlCreateZstreamListener(tokens); this.createFunctionListener = new SqlCreateFunctionListener(tokens); this.createZfunctionListener = new SqlCreateZfunctionListener(tokens); this.createMaterializedViewListener = new SqlCreateZviewListener(tokens); @@ -109,20 +103,6 @@ public Alter parseAlterTable( return alterTableListener.alter(); } - public Alter parseAlterStream( - String sql) - { - parser(sql, alterStreamListener); - return alterStreamListener.alter(); - } - - public CreateZstream parseCreateZstream( - String sql) - { - parser(sql, createStreamListener); - return createStreamListener.stream(); - } - public CreateFunction parseCreateFunction( String sql) { diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java index 8e5663db95..58cd401b0d 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java @@ -68,13 +68,6 @@ else if (ctx.ALTER() != null && ctx.ZSTREAM() != null) } } - @Override - public void enterCreatezstreamstmt( - PostgreSqlParser.CreatezstreamstmtContext ctx) - { - command = "CREATE ZSTREAM"; - } - @Override public void enterCreatezviewstmt( PostgreSqlParser.CreatezviewstmtContext ctx) diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZstreamListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZstreamListener.java deleted file mode 100644 index 1ff10f6d1d..0000000000 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZstreamListener.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.pgsql.parser.listener; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.antlr.v4.runtime.TokenStream; - -import io.aklivity.zilla.runtime.binding.pgsql.parser.PostgreSqlParser; -import io.aklivity.zilla.runtime.binding.pgsql.parser.PostgreSqlParserBaseListener; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.ZstreamColumn; - -public class SqlCreateZstreamListener extends PostgreSqlParserBaseListener -{ - private static final String PUBLIC_SCHEMA_NAME = "public"; - private static final String SCHEMA_PATTERN = "\\."; - - private final List columns; - private final Map commandHandlers; - private final TokenStream tokens; - - private String schema; - private String name; - private String dispatchOn; - - public SqlCreateZstreamListener( - TokenStream tokens) - { - this.columns = new ArrayList<>(); - this.commandHandlers = new LinkedHashMap<>(); - this.tokens = tokens; - } - - public CreateZstream stream() - { - return new CreateZstream(schema, name, columns, dispatchOn, commandHandlers); - } - - @Override - public void enterRoot( - PostgreSqlParser.RootContext ctx) - { - schema = null; - name = null; - dispatchOn = null; - columns.clear(); - commandHandlers.clear(); - } - - @Override - public void enterQualified_name( - PostgreSqlParser.Qualified_nameContext ctx) - { - String text = ctx.getText(); - String[] split = text.split(SCHEMA_PATTERN); - schema = split.length > 1 ? split[0] : PUBLIC_SCHEMA_NAME; - name = split.length > 1 ? split[1] : text; - } - - @Override - public void enterZstream_columns( - PostgreSqlParser.Zstream_columnsContext ctx) - { - ctx.zstream_column().forEach(c -> - { - String name = c.colid().getText(); - String type = tokens.getText(c.typename()); - String generatedAlways = tokens.getText(c.opt_generated_clause()); - - columns.add(new ZstreamColumn(name, type, generatedAlways)); - }); - } - - @Override - public void enterZreloptions( - PostgreSqlParser.ZreloptionsContext ctx) - { - ctx.zreloption_elem().forEach(o -> - { - if (o.sconst() != null) - { - String quotedText = o.sconst().getText(); - dispatchOn = quotedText.substring(1, quotedText.length() - 1); - } - - if (o.handler_mappings() != null) - { - o.handler_mappings().handler_mapping().forEach(m -> - { - // TODO: Improve getting fields value without substring - String name = m.sconst().getText(); - name = name.substring(1, name.length() - 1); - String handler = m.function_name().getText(); - handler = handler.substring(1, handler.length() - 1); - commandHandlers.put(name, handler); - }); - } - }); - } - -} diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZstream.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZstream.java deleted file mode 100644 index a7dd5f0597..0000000000 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZstream.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.pgsql.parser.model; - -import java.util.List; -import java.util.Map; - -public record CreateZstream( - String schema, - String name, - List columns, - String dispatchOn, - Map commandHandlers) -{ -} diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/ZstreamColumn.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/ZstreamColumn.java deleted file mode 100644 index 37b20f78c4..0000000000 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/ZstreamColumn.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.pgsql.parser.model; - -public record ZstreamColumn( - String name, - String type, - String generatedAlways) -{ -} diff --git a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java index 5a79dc3b16..c472a71bb0 100644 --- a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java +++ b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java @@ -28,7 +28,6 @@ import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateFunction; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateTable; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZview; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Operation; @@ -432,53 +431,6 @@ public void shouldDetectCreateTopicCommand() assertEquals(expectedCommand, parsedCommand); } - @Test - public void shouldDetectAlterStreamAddColumn() - { - String sql = "ALTER ZSTREAM test_stream ADD COLUMN new_column INT;"; - Alter alter = parser.parseAlterStream(sql); - - assertEquals("test_stream", alter.name()); - assertEquals(1, alter.expressions().size()); - assertEquals(Operation.ADD, alter.expressions().get(0).operation()); - assertEquals("new_column", alter.expressions().get(0).columnName()); - assertEquals("INT", alter.expressions().get(0).columnType()); - } - - @Test - public void shouldAlterStreamDropColumn() - { - String sql = "ALTER ZSTREAM test_stream DROP COLUMN old_column;"; - Alter alter = parser.parseAlterStream(sql); - - assertEquals("test_stream", alter.name()); - assertEquals(1, alter.expressions().size()); - assertEquals(Operation.DROP, alter.expressions().get(0).operation()); - assertEquals("old_column", alter.expressions().get(0).columnName()); - } - - @Test - public void shouldHandleInvalidAlterStream() - { - String sql = "ALTER STREAM"; - Alter alter = parser.parseAlterStream(sql); - - assertNull(alter.name()); - } - - @Test - public void shouldAlterStreamModifyColumn() - { - String sql = "ALTER ZSTREAM test_stream ALTER COLUMN existing_column TYPE VARCHAR(100);"; - Alter alter = parser.parseAlterStream(sql); - - assertEquals("test_stream", alter.name()); - assertEquals(1, alter.expressions().size()); - assertEquals(Operation.MODIFY, alter.expressions().get(0).operation()); - assertEquals("existing_column", alter.expressions().get(0).columnName()); - assertEquals("VARCHAR(100)", alter.expressions().get(0).columnType()); - } - @Test public void shouldShowZviews() { @@ -549,53 +501,4 @@ RETURNS TABLE( assertEquals("balance", select.from()); assertEquals("WHERE user_id = args.user_id", select.whereClause()); } - - @Test - public void shouldCreateZstream() - { - String sql = """ - CREATE ZSTREAM app_events ( - event VARCHAR, - user_id VARCHAR, - request_id VARCHAR, - amount DOUBLE PRECISION, - notes VARCHAR, - owner_id VARCHAR GENERATED ALWAYS AS IDENTITY, - created_at TIMESTAMP GENERATED ALWAYS AS NOW - ) - WITH ( - DISPATCH_ON = 'command', - HANDLERS = ( - 'SendPayment' TO 'send_payment_handler', - 'RequestPayment' TO 'request_payment_handler', - 'RejectPayment' TO 'reject_payment_handler' - ) - ); - """; - - CreateZstream createStream = parser.parseCreateZstream(sql); - - assertEquals("app_events", createStream.name()); - assertEquals("event", createStream.columns().get(0).name()); - assertEquals("VARCHAR", createStream.columns().get(0).type()); - assertEquals("user_id", createStream.columns().get(1).name()); - assertEquals("VARCHAR", createStream.columns().get(1).type()); - assertEquals("request_id", createStream.columns().get(2).name()); - assertEquals("VARCHAR", createStream.columns().get(2).type()); - assertEquals("amount", createStream.columns().get(3).name()); - assertEquals("DOUBLE PRECISION", createStream.columns().get(3).type()); - assertEquals("notes", createStream.columns().get(4).name()); - assertEquals("VARCHAR", createStream.columns().get(4).type()); - assertEquals("owner_id", createStream.columns().get(5).name()); - assertEquals("VARCHAR", createStream.columns().get(5).type()); - assertEquals("created_at", createStream.columns().get(6).name()); - assertEquals("TIMESTAMP", createStream.columns().get(6).type()); - - assertEquals("command", createStream.dispatchOn()); - - assertEquals(3, createStream.commandHandlers().size()); - assertEquals("send_payment_handler", createStream.commandHandlers().get("SendPayment")); - assertEquals("request_payment_handler", createStream.commandHandlers().get("RequestPayment")); - assertEquals("reject_payment_handler", createStream.commandHandlers().get("RejectPayment")); - } } diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java index c12c52af25..f33174b385 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java @@ -26,7 +26,6 @@ import io.aklivity.zilla.runtime.binding.pgsql.parser.PgsqlParser; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Select; import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; import io.aklivity.zilla.runtime.binding.risingwave.internal.types.OctetsFW; diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java index fed7b79f52..3d98bce610 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java @@ -20,7 +20,6 @@ import org.agrona.DirectBuffer; import io.aklivity.zilla.runtime.binding.pgsql.parser.PgsqlParser; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; import io.aklivity.zilla.runtime.binding.risingwave.internal.types.OctetsFW; diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java index 36e7bfedf4..ae55cb62dc 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java @@ -41,7 +41,6 @@ import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateFunction; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateTable; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZstream; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZview; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Operation; From 620a0424ba7fe61a839a323f1d2bada42cd17e2e Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Tue, 21 Jan 2025 19:18:53 -0800 Subject: [PATCH 02/10] WIP --- .../binding/pgsql/parser/PgsqlParser.java | 1 - .../SqlAlterZstreamTopicListener.java | 105 ------------------ .../parser/listener/SqlCommandListener.java | 4 - 3 files changed, 110 deletions(-) delete mode 100644 incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlAlterZstreamTopicListener.java diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 5e0d2adde9..6d35805734 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -29,7 +29,6 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.tree.ParseTreeWalker; -import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlAlterZstreamTopicListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlAlterZtableTopicListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCommandListener; import io.aklivity.zilla.runtime.binding.pgsql.parser.listener.SqlCreateFunctionListener; diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlAlterZstreamTopicListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlAlterZstreamTopicListener.java deleted file mode 100644 index 04de903d41..0000000000 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlAlterZstreamTopicListener.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.pgsql.parser.listener; - -import java.util.ArrayList; -import java.util.List; - -import org.antlr.v4.runtime.TokenStream; - -import io.aklivity.zilla.runtime.binding.pgsql.parser.PostgreSqlParser; -import io.aklivity.zilla.runtime.binding.pgsql.parser.PostgreSqlParserBaseListener; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Alter; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.AlterExpression; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Operation; - -public class SqlAlterZstreamTopicListener extends PostgreSqlParserBaseListener -{ - private static final String PUBLIC_SCHEMA_NAME = "public"; - private static final String SCHEMA_PATTERN = "\\."; - - private final List alterExpressions; - private final TokenStream tokens; - - private String schema; - private String name; - - public SqlAlterZstreamTopicListener( - TokenStream tokens) - { - this.alterExpressions = new ArrayList<>(); - this.tokens = tokens; - } - - public Alter alter() - { - return new Alter(schema, name, alterExpressions); - } - - @Override - public void enterRoot( - PostgreSqlParser.RootContext ctx) - { - schema = null; - name = null; - alterExpressions.clear(); - } - - @Override - public void enterQualified_name( - PostgreSqlParser.Qualified_nameContext ctx) - { - String text = ctx.getText(); - String[] split = text.split(SCHEMA_PATTERN); - schema = split.length > 1 ? split[0] : PUBLIC_SCHEMA_NAME; - name = split.length > 1 ? split[1] : text; - } - - @Override - public void enterAlter_zstream_cmds( - PostgreSqlParser.Alter_zstream_cmdsContext ctx) - { - for (PostgreSqlParser.Alter_zstream_cmdContext alterStreamCmdCtx : ctx.alter_zstream_cmd()) - { - if (alterStreamCmdCtx.ADD_P() != null) - { - alterExpressions.add(new AlterExpression( - Operation.ADD, - alterStreamCmdCtx.columnDef().colid().getText(), - alterStreamCmdCtx.columnDef().typename().getText() - )); - } - else if (alterStreamCmdCtx.DROP() != null) - { - alterStreamCmdCtx.colid().forEach(colidCtxs -> alterExpressions.add( - new AlterExpression( - Operation.DROP, - colidCtxs.identifier().getText(), - null - ))); - } - else if (alterStreamCmdCtx.ALTER() != null) - { - alterStreamCmdCtx.colid().forEach(colidCtxs -> alterExpressions.add( - new AlterExpression( - Operation.MODIFY, - colidCtxs.getText(), - alterStreamCmdCtx.typename() != null ? alterStreamCmdCtx.typename().getText() : null - ))); - } - } - } - -} diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java index 58cd401b0d..e450b61f16 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCommandListener.java @@ -62,10 +62,6 @@ else if (ctx.ALTER() != null && ctx.TOPIC() != null) { command = "ALTER TOPIC"; } - else if (ctx.ALTER() != null && ctx.ZSTREAM() != null) - { - command = "ALTER ZSTREAM"; - } } @Override From 9e796c1ccb6d837ca37b050d3de6f7517a2bb530 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Tue, 21 Jan 2025 22:24:15 -0800 Subject: [PATCH 03/10] WIP --- .../binding/pgsql/parser/PostgreSqlLexer.g4 | 2 + .../binding/pgsql/parser/PostgreSqlParser.g4 | 14 +- .../listener/SqlCreateZfunctionListener.java | 14 +- .../pgsql/parser/model/CreateZfunction.java | 3 +- .../binding/pgsql/parser/PgsqlParserTest.java | 5 +- .../config/RisingwaveCommandType.java | 2 - .../macro/RisingwaveCreateZfunctionMacro.java | 312 ++++++++- .../macro/RisingwaveCreateZstreamMacro.java | 646 ------------------ .../macro/RisingwaveDropZstreamMacro.java | 459 ------------- .../stream/RisingwaveCompletionCommand.java | 2 - .../stream/RisingwaveProxyFactory.java | 55 +- 11 files changed, 333 insertions(+), 1181 deletions(-) delete mode 100644 incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java delete mode 100644 incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java diff --git a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 index 70f4bca885..fbec60016a 100644 --- a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 +++ b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlLexer.g4 @@ -556,6 +556,8 @@ FUNCTIONS: 'FUNCTIONS'; ZFUNCTION: 'ZFUNCTION'; +EVENTS: 'EVENTS'; + ZFUNCTIONS: 'ZFUNCTIONS'; GLOBAL: 'GLOBAL'; diff --git a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 index b7f0dd74b0..4d29284083 100644 --- a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 +++ b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 @@ -1990,7 +1990,19 @@ opt_nulls_order createzfunctionstmt : CREATE ZFUNCTION func_name func_args_with_defaults - RETURNS TABLE OPEN_PAREN table_func_column_list CLOSE_PAREN LANGUAGE SQL_P AS DOLLAR_DELIMITER selectstmt SEMI DOLLAR_DELIMITER + RETURNS TABLE OPEN_PAREN table_func_column_list CLOSE_PAREN + LANGUAGE SQL_P AS DOLLAR_DELIMITER selectstmt SEMI DOLLAR_DELIMITER + zfunc_opt_with_clause + ; + +zfunc_opt_with_clause + : WITH OPEN_PAREN zfunc_with_option CLOSE_PAREN + | /* empty */ + ; + +zfunc_with_option + : EVENTS EQUAL sconst + | collabel EQUAL sconst ; createfunctionstmt diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java index 6dd8048975..0ff5e0061a 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java @@ -42,6 +42,7 @@ public class SqlCreateZfunctionListener extends PostgreSqlParserBaseListener private String orderByClause; private String limitClause; private String offsetClause; + private String events; private String schema; private String name; @@ -72,7 +73,8 @@ public CreateZfunction zfunction() name, arguments, returnTypes, - select); + select, + events); } @Override @@ -172,4 +174,14 @@ public void enterOffset_clause( { offsetClause = tokens.getText(ctx); } + + @Override + public void enterZfunc_with_option( + PostgreSqlParser.Zfunc_with_optionContext ctx) + { + if (ctx.EVENTS() != null) + { + events = tokens.getText(ctx.sconst()); + } + } } diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZfunction.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZfunction.java index d385a4d182..eb6345005b 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZfunction.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/model/CreateZfunction.java @@ -21,6 +21,7 @@ public record CreateZfunction( String name, List arguments, List returnTypes, - Select select) + Select select, + String events) { } diff --git a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java index c472a71bb0..b809c6b997 100644 --- a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java +++ b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java @@ -470,7 +470,10 @@ RETURNS TABLE( args.amount FROM balance WHERE user_id = args.user_id; $$ - """; + WITH( + EVENTS = 'app_events' + ) + """; CreateZfunction function = parser.parseCreateZfunction(sql); assertNotNull(function); diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java index 418132314e..743fb886b1 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java @@ -20,7 +20,6 @@ public enum RisingwaveCommandType { CREATE_TOPIC_COMMAND("CREATE TOPIC".getBytes()), CREATE_ZTABLE_COMMAND("CREATE ZTABLE".getBytes()), - CREATE_ZSTREAM_COMMAND("CREATE ZSTREAM".getBytes()), CREATE_ZVIEW_COMMAND("CREATE ZVIEW".getBytes()), CREATE_FUNCTION_COMMAND("CREATE FUNCTION".getBytes()), CREATE_ZFUNCTION_COMMAND("CREATE ZFUNCTION".getBytes()), @@ -28,7 +27,6 @@ public enum RisingwaveCommandType ALTER_TOPIC_COMMAND("ALTER TOPIC".getBytes()), DROP_TOPIC_COMMAND("DROP TOPIC".getBytes()), DROP_ZTABLE_COMMAND("DROP ZTABLE".getBytes()), - DROP_ZSTREAM_COMMAND("DROP ZSTREAM".getBytes()), DROP_ZVIEW_COMMAND("DROP ZVIEW".getBytes()), SHOW_ZTABLES_COMMAND("SHOW ZTABLES".getBytes()), SHOW_ZSTREAMS_COMMAND("SHOW ZSTREAMS".getBytes()), diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java index b1871904e7..2aba28c614 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java @@ -14,57 +14,233 @@ */ package io.aklivity.zilla.runtime.binding.risingwave.internal.macro; +import java.util.stream.Collectors; + +import io.aklivity.zilla.runtime.binding.pgsql.parser.PgsqlParser; import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; +import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Select; import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; import io.aklivity.zilla.runtime.binding.risingwave.internal.types.stream.PgsqlFlushExFW; public class RisingwaveCreateZfunctionMacro extends RisingwaveMacroBase { - private static final String ZFUNCTION_NAME = "zfunctions"; + private static final String ZFUNCTION_NAME = "zfunction"; + + private final String bootstrapServer; + private final String schemaRegistry; + private final PgsqlParser parser; + private final long scanStartupMil; private final String systemSchema; private final String user; - private final String sql; private final CreateZfunction command; - private final RisingwaveMacroHandler handler; public RisingwaveCreateZfunctionMacro( + String bootstrapServer, + String schemaRegistry, + long scanStartupMil, String systemSchema, String user, String sql, CreateZfunction command, - RisingwaveMacroHandler handler) + RisingwaveMacroHandler handler, + PgsqlParser parser) { super(sql, handler); + this.scanStartupMil = scanStartupMil; this.systemSchema = systemSchema; this.user = user; - this.sql = sql; this.command = command; - this.handler = handler; + + this.bootstrapServer = bootstrapServer; + this.schemaRegistry = schemaRegistry; + this.parser = parser; } public RisingwaveMacroState start() { - return new InsertIntoCatalogState(); + return new CreateSourceTopicState(); } + private final class CreateSourceTopicState implements RisingwaveMacroState + { + private final String sqlFormat = """ + CREATE TOPIC %s.%s_commands (%s);\u0000"""; - private final class InsertIntoCatalogState implements RisingwaveMacroState + @Override + public void onStarted( + long traceId, + long authorization) + { + String topic = command.name(); + + String arguments = command.arguments().stream() + .map(arg -> arg.name() + " " + arg.type()) + .collect(Collectors.joining(", ")); + + String sqlQuery = String.format(sqlFormat, command.schema(), topic, arguments); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + CreateSourceState state = new CreateSourceState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + + return errorState(); + } + } + + private final class CreateSourceState implements RisingwaveMacroState { private final String sqlFormat = """ - INSERT INTO %s.%s (name, sql) VALUES ('%s', '%s');\u0000"""; + CREATE SOURCE %s.%s_commands (*) + INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id + INCLUDE header 'zilla:identity' VARCHAR AS owner_id + INCLUDE timestamp AS created_at + WITH ( + connector='kafka', + properties.bootstrap.server='%s', + topic='%s.%s_commands', + scan.startup.mode='latest', + scan.startup.timestamp.millis='%d' + ) FORMAT PLAIN ENCODE AVRO ( + schema.registry = '%s' + );\u0000"""; @Override public void onStarted( long traceId, long authorization) { + String schema = command.schema(); + String table = command.name(); + + String sqlQuery = String.format(sqlFormat, systemSchema, table, bootstrapServer, + schema, table, scanStartupMil, schemaRegistry); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + CreateEventMaterializedViewState state = new CreateEventMaterializedViewState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + return errorState(); + } + } + + private final class CreateEventMaterializedViewState implements RisingwaveMacroState + { + private final String sqlFormat = """ + CREATE MATERIALIZED VIEW %s.%s_events AS + SELECT + c.correlation_id, + c.owner_id, + c.created_at, + %s + FROM %s.%s_commands c + %s;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + Select select = command.select(); + + String columns = select.columns().stream() + .map(c -> c.replace("args", "c")) + .collect(Collectors.joining(", ")); + String name = command.name(); + String from = command.name(); - String newSql = sql.replace("\u0000", ""); - newSql = newSql.replaceAll("'", "''"); - String sqlQuery = String.format(sqlFormat, systemSchema, ZFUNCTION_NAME, name, newSql); + String join = ""; + if (select.from() != null) + { + join = "JOIN %s".formatted(select.from()); + + if (select.whereClause() != null) + { + join = String.format("%s ON %s", join, select.whereClause().replace("args", "c")); + } + } + + String sqlQuery = String.format(sqlFormat, systemSchema, name, columns, + systemSchema, from, join); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + RisingwaveMacroState state = new CreateSinkIntoState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + + return errorState(); + } + } + + private final class CreateSinkIntoState implements RisingwaveMacroState + { + private final String sqlFormat = """ + CREATE SINK %s.%_sink_into INTO %s FROM %s.%s_events;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + final String events = command.events(); + String sqlQuery = String.format(sqlFormat, systemSchema, command.name(), events, command.schema(), command.name()); handler.doExecuteSystemClient(traceId, authorization, sqlQuery); } @@ -75,7 +251,7 @@ public RisingwaveMacroState onReady( long authorization, PgsqlFlushExFW flushEx) { - FlushState state = new FlushState(); + CreateSinkTopicState state = new CreateSinkTopicState(); state.onStarted(traceId, authorization); return state; @@ -93,17 +269,121 @@ public RisingwaveMacroState onError( } } - private final class FlushState implements RisingwaveMacroState + private final class CreateSinkTopicState implements RisingwaveMacroState { private final String sqlFormat = """ - FLUSH;\u0000"""; + CREATE TOPIC %s.%s_replies_sink (status VARCHAR, correlation_id VARCHAR);\u0000"""; @Override public void onStarted( long traceId, long authorization) { - handler.doExecuteSystemClient(traceId, authorization, sqlFormat); + String topic = command.name(); + + String sqlQuery = String.format(sqlFormat, command.schema(), topic); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + CreateReplySink state = new CreateReplySink(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + + return errorState(); + } + } + + private final class CreateReplySink implements RisingwaveMacroState + { + private final String sqlFormat = """ + CREATE SINK %s_replies_sink AS + SELECT + '200' AS status, + c.correlation_id + FROM %s_commands c + LEFT JOIN %s_events r + ON c.correlation_id = r.correlation_id + WITH ( + connector = 'kafka', + topic = '%s.%s_replies_sink', + properties.bootstrap.server = '%s', + ) FORMAT PLAIN ENCODE AVRO ( + force_append_only='true', + schema.registry = '%s' + );\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + final String name = command.name(); + final String schema = command.schema(); + + final String systemName = "%s.%s".formatted(systemSchema, name); + + String sqlQuery = String.format(sqlFormat, systemName, systemName, systemName, + schema, name, bootstrapServer, schemaRegistry); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + InsertIntoCatalogState state = new InsertIntoCatalogState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + return errorState(); + } + } + + private final class InsertIntoCatalogState implements RisingwaveMacroState + { + private final String sqlFormat = """ + INSERT INTO %s.%s (name, sql) VALUES ('%s', '%s');\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String name = command.name(); + + String newSql = sql.replace("\u0000", ""); + newSql = newSql.replaceAll("'", "''"); + String sqlQuery = String.format(sqlFormat, systemSchema, ZFUNCTION_NAME, name, newSql); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); } @Override diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java deleted file mode 100644 index f33174b385..0000000000 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZstreamMacro.java +++ /dev/null @@ -1,646 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.risingwave.internal.macro; - -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.agrona.DirectBuffer; -import org.agrona.collections.Object2ObjectHashMap; - -import io.aklivity.zilla.runtime.binding.pgsql.parser.PgsqlParser; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.CreateZfunction; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Select; -import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; -import io.aklivity.zilla.runtime.binding.risingwave.internal.types.OctetsFW; -import io.aklivity.zilla.runtime.binding.risingwave.internal.types.stream.PgsqlFlushExFW; - -public class RisingwaveCreateZstreamMacro extends RisingwaveMacroBase -{ - private static final String ZSTREAM_NAME = "zstreams"; - - private static final Map ZILLA_MAPPINGS = new Object2ObjectHashMap<>(); - static - { - ZILLA_MAPPINGS.put(ZILLA_IDENTITY, "INCLUDE header 'zilla:identity' VARCHAR AS %s"); - ZILLA_MAPPINGS.put(ZILLA_TIMESTAMP, "INCLUDE timestamp AS %s"); - } - - private final List functions; - - private final String bootstrapServer; - private final String schemaRegistry; - private final PgsqlParser parser; - - private final long scanStartupMil; - private final String systemSchema; - private final String user; - private final CreateZstream command; - - private Iterator zfunctionInterator; - private CreateZfunction lastZfunction; - - public RisingwaveCreateZstreamMacro( - String bootstrapServer, - String schemaRegistry, - long scanStartupMil, - String systemSchema, - String user, - String sql, - CreateZstream command, - RisingwaveMacroHandler handler, - PgsqlParser parser) - { - super(sql, handler); - - this.scanStartupMil = scanStartupMil; - this.systemSchema = systemSchema; - this.user = user; - this.command = command; - - this.bootstrapServer = bootstrapServer; - this.schemaRegistry = schemaRegistry; - this.parser = parser; - - this.functions = new ArrayList<>(); - } - - public RisingwaveMacroState start() - { - return new SelectZfunctionsCommandState(); - } - - private final class SelectZfunctionsCommandState implements RisingwaveMacroState - { - private final String sqlFormat = """ - SELECT * FROM zb_catalog.zfunctions WHERE name IN (%s);\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String handlers = command.commandHandlers().values().stream() - .map(value -> "'" + value + "'") - .collect(Collectors.joining(", ")); - String sqlQuery = String.format(sqlFormat, handlers); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onRow( - T client, - long traceId, - long authorization, - int flags, - DirectBuffer buffer, - int offset, - int limit, - OctetsFW extension) - { - int progress = offset; - - short fields = buffer.getShort(progress, ByteOrder.BIG_ENDIAN); - progress += Short.BYTES; - - assert fields == 2; - - int nameLength = buffer.getInt(progress, ByteOrder.BIG_ENDIAN); - progress += Integer.BYTES + nameLength; - - int sqlLength = buffer.getInt(progress, ByteOrder.BIG_ENDIAN); - progress += Integer.BYTES; - - String statement = buffer.getStringWithoutLengthAscii(progress, sqlLength); - - CreateZfunction createZfunction = parser.parseCreateZfunction(statement); - - functions.add(createZfunction); - - return this; - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateSourceTopicState state = new CreateSourceTopicState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return errorState(); - } - } - - private final class CreateSourceTopicState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE TOPIC %s.%s_commands (%s);\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String topic = command.name(); - - CreateZfunction zfunction = functions.stream().findFirst().get(); - - String arguments = zfunction.arguments().stream() - .map(arg -> arg.name() + " " + arg.type()) - .collect(Collectors.joining(", ")); - String fields = "%s VARCHAR, %s".formatted(command.dispatchOn(), arguments); - - String sqlQuery = String.format(sqlFormat, command.schema(), topic, fields); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateSourceState state = new CreateSourceState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class CreateSourceState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE SOURCE %s.%s_commands (*) - INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id - %s - WITH ( - connector='kafka', - properties.bootstrap.server='%s', - topic='%s.%s_commands', - scan.startup.mode='latest', - scan.startup.timestamp.millis='%d' - ) FORMAT PLAIN ENCODE AVRO ( - schema.registry = '%s' - );\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String schema = command.schema(); - String table = command.name(); - - String include = command.columns().stream() - .filter(c -> ZILLA_MAPPINGS.containsKey(c.generatedAlways())) - .map(c -> - { - String name = c.name(); - String generated = c.generatedAlways(); - return String.format(ZILLA_MAPPINGS.get(generated), name); - }) - .collect(Collectors.joining("\n")); - - String sqlQuery = String.format(sqlFormat, systemSchema, table, include, bootstrapServer, - schema, table, scanStartupMil, schemaRegistry); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateHandlerMaterializedViewState state = new CreateHandlerMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return errorState(); - } - } - - private final class CreateHandlerMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE MATERIALIZED VIEW %s.%s AS - SELECT - c.correlation_id, - %s, - %s - FROM %s.%s_commands c - %s - WHERE %s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - if (lastZfunction == null) - { - if (zfunctionInterator == null) - { - zfunctionInterator = functions.iterator(); - } - - lastZfunction = zfunctionInterator.next(); - Select select = lastZfunction.select(); - - String columns = select.columns().stream() - .map(c -> c.replace("args", "c")) - .collect(Collectors.joining(", ")); - - String name = lastZfunction.name(); - String from = command.name(); - - String join = ""; - if (select.from() != null) - { - join = "JOIN %s".formatted(select.from()); - - if (select.whereClause() != null) - { - join = String.format("%s ON %s", join, select.whereClause().replace("args", "c")); - } - } - - String include = command.columns().stream() - .filter(c -> ZILLA_MAPPINGS.containsKey(c.generatedAlways())) - .map(c -> "c.%s".formatted(c.name())) - .collect(Collectors.joining(",\n ")); - - String commandName = command.commandHandlers().entrySet().stream() - .filter(e -> e.getValue().equals(name)) - .map(Map.Entry::getKey) - .findFirst() - .get(); - - String where = "c.%s = '%s'".formatted(command.dispatchOn(), commandName); - - String sqlQuery = String.format(sqlFormat, systemSchema, name, include, columns, - systemSchema, from, join, where); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - lastZfunction = null; - - RisingwaveMacroState state = zfunctionInterator.hasNext() - ? new CreateHandlerMaterializedViewState() - : new CreateStreamMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class CreateStreamMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE MATERIALIZED VIEW %s.%s AS - %s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String selects = command.commandHandlers().values().stream() - .map(value -> String.format("SELECT * FROM %s.%s", systemSchema, value)) - .collect(Collectors.joining("\nUNION ALL\n")); - - String sqlQuery = String.format(sqlFormat, command.schema(), command.name(), selects); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - GrantResourceState state = new GrantResourceState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class GrantResourceState implements RisingwaveMacroState - { - private final String sqlFormat = """ - GRANT ALL PRIVILEGES ON MATERIALIZED VIEW %s.%s TO %s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, command.schema(), command.name(), user); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateReplyMaterializedViewState state = new CreateReplyMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class CreateReplyMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE MATERIALIZED VIEW %s.%s_reply_handler AS - SELECT - '200' AS status, - correlation_id - FROM %s.%s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, systemSchema, command.name(), command.schema(), command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateSinkTopicState state = new CreateSinkTopicState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class CreateSinkTopicState implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE TOPIC %s.%s_replies_sink (status VARCHAR, correlation_id VARCHAR);\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String topic = command.name(); - - CreateZfunction zfunction = functions.stream().findFirst().get(); - - String arguments = zfunction.arguments().stream() - .map(arg -> arg.name() + " " + arg.type()) - .collect(Collectors.joining(", ")); - - String sqlQuery = String.format(sqlFormat, command.schema(), topic, arguments); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - CreateReplySink state = new CreateReplySink(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class CreateReplySink implements RisingwaveMacroState - { - private final String sqlFormat = """ - CREATE SINK %s_replies_sink AS - SELECT - COALESCE(r.status, '400') AS status, - c.correlation_id - FROM %s_commands c - LEFT JOIN %s_reply_handler r - ON c.correlation_id = r.correlation_id - WITH ( - connector = 'kafka', - topic = '%s.%s_replies_sink', - properties.bootstrap.server = '%s', - ) FORMAT PLAIN ENCODE AVRO ( - force_append_only='true', - schema.registry = '%s' - );\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - final String name = command.name(); - final String schema = command.schema(); - - final String systemName = "%s.%s".formatted(systemSchema, name); - - String sqlQuery = String.format(sqlFormat, systemName, systemName, systemName, - schema, name, bootstrapServer, schemaRegistry); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - InsertIntoCatalogState state = new InsertIntoCatalogState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - return errorState(); - } - } - - private final class InsertIntoCatalogState implements RisingwaveMacroState - { - private final String sqlFormat = """ - INSERT INTO %s.%s (name, sql) VALUES ('%s', '%s');\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String name = command.name(); - - String newSql = sql.replace("\u0000", ""); - newSql = newSql.replaceAll("'", "''"); - String sqlQuery = String.format(sqlFormat, systemSchema, ZSTREAM_NAME, name, newSql); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onCompletion( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doCompletion(traceId, authorization, RisingwaveCompletionCommand.CREATE_ZSTREAM_COMMAND); - return this; - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doReady(traceId, authorization, sql.length()); - return null; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return this; - } - } -} diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java deleted file mode 100644 index 3d98bce610..0000000000 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZstreamMacro.java +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright 2021-2024 Aklivity Inc - * - * Licensed under the Aklivity Community License (the "License"); you may not use - * this file except in compliance with the License. You may obtain a copy of the - * License at - * - * https://www.aklivity.io/aklivity-community-license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package io.aklivity.zilla.runtime.binding.risingwave.internal.macro; - -import java.nio.ByteOrder; -import java.util.Iterator; - -import org.agrona.DirectBuffer; - -import io.aklivity.zilla.runtime.binding.pgsql.parser.PgsqlParser; -import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; -import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; -import io.aklivity.zilla.runtime.binding.risingwave.internal.types.OctetsFW; -import io.aklivity.zilla.runtime.binding.risingwave.internal.types.stream.PgsqlFlushExFW; - -public class RisingwaveDropZstreamMacro extends RisingwaveMacroBase -{ - private final String systemSchema; - private final Drop command; - private final PgsqlParser parser; - - private CreateZstream createZstream; - - private String lastHandler; - private Iterator zstreamInterator; - - public RisingwaveDropZstreamMacro( - String systemSchema, - String sql, - Drop command, - RisingwaveMacroHandler handler, - PgsqlParser parser) - { - super(sql, handler); - - this.systemSchema = systemSchema; - this.command = command; - this.parser = parser; - } - - public RisingwaveMacroState start() - { - return new SelectZstreamsCommandState(); - } - - private final class SelectZstreamsCommandState implements RisingwaveMacroState - { - private final String sqlFormat = """ - SELECT * FROM zb_catalog.zstreams WHERE name = '%s';\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onRow( - T client, - long traceId, - long authorization, - int flags, - DirectBuffer buffer, - int offset, - int limit, - OctetsFW extension) - { - int progress = offset; - - short fields = buffer.getShort(progress, ByteOrder.BIG_ENDIAN); - progress += Short.BYTES; - - assert fields == 2; - - int nameLength = buffer.getInt(progress, ByteOrder.BIG_ENDIAN); - progress += Integer.BYTES + nameLength; - - int sqlLength = buffer.getInt(progress, ByteOrder.BIG_ENDIAN); - progress += Integer.BYTES; - - String statement = buffer.getStringWithoutLengthAscii(progress, sqlLength); - - createZstream = parser.parseCreateZstream(statement); - - return this; - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DeleteIntoCatalogState state = new DeleteIntoCatalogState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return errorState(); - } - } - - private final class DeleteIntoCatalogState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DELETE FROM %s.zstreams WHERE name = '%s';\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropReplySink state = new DropReplySink(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return errorState(); - } - } - - private final class DropReplySink implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP SINK %s.%s_replies_sink;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String name = command.name(); - - String sqlQuery = String.format(sqlFormat, systemSchema, name); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropSinkTopicState state = new DropSinkTopicState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - return errorState(); - } - } - - private final class DropSinkTopicState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP TOPIC %s.%s_replies_sink;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String topic = command.name(); - - String sqlQuery = String.format(sqlFormat, command.schema(), topic); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropReplyMaterializedViewState state = new DropReplyMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class DropReplyMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP MATERIALIZED VIEW %s.%s_reply_handler;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropStreamMaterializedViewState state = new DropStreamMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class DropStreamMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP MATERIALIZED VIEW %s.%s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, command.schema(), command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropHandlerMaterializedViewState state = new DropHandlerMaterializedViewState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class DropHandlerMaterializedViewState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP MATERIALIZED VIEW %s.%s;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - if (lastHandler == null) - { - if (zstreamInterator == null) - { - zstreamInterator = createZstream.commandHandlers().values().iterator(); - } - - lastHandler = zstreamInterator.next(); - - String sqlQuery = String.format(sqlFormat, systemSchema, lastHandler); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - lastHandler = null; - - RisingwaveMacroState state = zstreamInterator.hasNext() - ? new DropHandlerMaterializedViewState() - : new DropSourceState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - - return errorState(); - } - } - - private final class DropSourceState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP SOURCE %s.%s_commands;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - DropSourceTopicState state = new DropSourceTopicState(); - state.onStarted(traceId, authorization); - - return state; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return errorState(); - } - } - - private final class DropSourceTopicState implements RisingwaveMacroState - { - private final String sqlFormat = """ - DROP TOPIC %s.%s_commands;\u0000"""; - - @Override - public void onStarted( - long traceId, - long authorization) - { - String sqlQuery = String.format(sqlFormat, command.schema(), command.name()); - - handler.doExecuteSystemClient(traceId, authorization, sqlQuery); - } - - @Override - public RisingwaveMacroState onCompletion( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doCompletion(traceId, authorization, RisingwaveCompletionCommand.DROP_ZSTREAM_COMMAND); - return this; - } - - @Override - public RisingwaveMacroState onReady( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doReady(traceId, authorization, sql.length()); - - return null; - } - - @Override - public RisingwaveMacroState onError( - long traceId, - long authorization, - PgsqlFlushExFW flushEx) - { - handler.doFlushProxy(traceId, authorization, flushEx); - return this; - } - } -} diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java index 5158d5a6bd..c90c3899bd 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java @@ -19,12 +19,10 @@ public enum RisingwaveCompletionCommand UNKNOWN_COMMAND("UNKNOWN".getBytes()), CREATE_ZTABLE_COMMAND("CREATE_ZTABLE".getBytes()), CREATE_ZVIEW_COMMAND("CREATE_ZVIEW".getBytes()), - CREATE_ZSTREAM_COMMAND("CREATE_ZSTREAM".getBytes()), CREATE_FUNCTION_COMMAND("CREATE_FUNCTION".getBytes()), CREATE_ZFUNCTION_COMMAND("CREATE_ZFUNCTION".getBytes()), ALTER_ZTABLE_COMMAND("ALTER_ZTABLE".getBytes()), DROP_ZTABLE_COMMAND("DROP_ZTABLE".getBytes()), - DROP_ZSTREAM_COMMAND("DROP_ZSTREAM".getBytes()), DROP_ZVIEW_COMMAND("DROP_ZVIEW".getBytes()), SHOW_COMMAND("SHOW_COMMAND".getBytes()); diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java index ae55cb62dc..6cf52583a3 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java @@ -51,10 +51,8 @@ import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveAlterZtableMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateFunctionMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZfunctionMacro; -import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZstreamMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZtableMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZviewMacro; -import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZstreamMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZtableMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZviewMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveMacroHandler; @@ -162,12 +160,10 @@ public final class RisingwaveProxyFactory implements RisingwaveStreamFactory Object2ObjectHashMap clientTransforms = new Object2ObjectHashMap<>(); clientTransforms.put(RisingwaveCommandType.CREATE_ZTABLE_COMMAND, this::decodeCreateZtableCommand); - clientTransforms.put(RisingwaveCommandType.CREATE_ZSTREAM_COMMAND, this::decodeCreateZstreamCommand); clientTransforms.put(RisingwaveCommandType.CREATE_ZVIEW_COMMAND, this::decodeCreateZviewCommand); clientTransforms.put(RisingwaveCommandType.CREATE_FUNCTION_COMMAND, this::decodeCreateFunctionCommand); clientTransforms.put(RisingwaveCommandType.CREATE_ZFUNCTION_COMMAND, this::decodeCreateZfunctionCommand); clientTransforms.put(RisingwaveCommandType.ALTER_ZTABLE_COMMAND, this::decodeAlterZtableCommand); - clientTransforms.put(RisingwaveCommandType.DROP_ZSTREAM_COMMAND, this::decodeDropZstreamCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZTABLE_COMMAND, this::decodeDropZtableCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZVIEW_COMMAND, this::decodeDropZviewCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZSTREAMS_COMMAND, this::decodeShowCommand); @@ -1712,7 +1708,7 @@ private void decodeCreateZtableCommand( server.macroState.onStarted(traceId, authorization); } - private void decodeCreateZstreamCommand( + private void decodeCreateZfunctionCommand( PgsqlServer server, long traceId, long authorization, @@ -1720,11 +1716,11 @@ private void decodeCreateZstreamCommand( { if (server.macroState == null) { - final CreateZstream command = parser.parseCreateZstream(statement); + final CreateZfunction command = parser.parseCreateZfunction(statement); RisingwaveBindingConfig binding = server.binding; - RisingwaveCreateZstreamMacro machine = new RisingwaveCreateZstreamMacro( + RisingwaveCreateZfunctionMacro machine = new RisingwaveCreateZfunctionMacro( binding.bootstrapServer, binding.schemaRegistry, config.kafkaScanStartupTimestampMillis(), @@ -1791,28 +1787,6 @@ private void decodeCreateFunctionCommand( server.macroState.onStarted(traceId, authorization); } - private void decodeCreateZfunctionCommand( - PgsqlServer server, - long traceId, - long authorization, - String statement) - { - if (server.macroState == null) - { - final CreateZfunction command = parser.parseCreateZfunction(statement); - - RisingwaveCreateZfunctionMacro machine = new RisingwaveCreateZfunctionMacro( - RisingwaveBindingConfig.INTERNAL_SCHEMA, - server.user, - statement, - command, - server.macroHandler); - server.macroState = machine.start(); - } - - server.macroState.onStarted(traceId, authorization); - } - private void decodeAlterZtableCommand( PgsqlServer server, long traceId, @@ -1881,29 +1855,6 @@ private void decodeDropZtableCommand( server.macroState.onStarted(traceId, authorization); } - private void decodeDropZstreamCommand( - PgsqlServer server, - long traceId, - long authorization, - String statement) - { - if (server.macroState == null) - { - // TODO: Enhance multiple streams - final Drop command = parser.parseDrop(statement).get(0); - - RisingwaveDropZstreamMacro machine = new RisingwaveDropZstreamMacro( - RisingwaveBindingConfig.INTERNAL_SCHEMA, - statement, - command, - server.macroHandler, - parser); - server.macroState = machine.start(); - } - - server.macroState.onStarted(traceId, authorization); - } - private void decodeDropZviewCommand( PgsqlServer server, long traceId, From 9ad48f71fd8d499eeb4ab6f29d9f139e0d5e5d3f Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 08:01:19 -0800 Subject: [PATCH 04/10] WIP --- .../listener/SqlCreateZfunctionListener.java | 5 + .../binding/pgsql/parser/PgsqlParserTest.java | 2 + .../effective/create.zfunction/client.rpt | 334 +++++++++++++-- .../effective/create.zfunction/server.rpt | 219 ++++++++-- .../effective/create.zstream/client.rpt | 388 ----------------- .../effective/create.zstream/server.rpt | 390 ------------------ .../client.rpt | 0 .../server.rpt | 0 .../effective/show.zstreams/client.rpt | 114 ----- .../effective/show.zstreams/server.rpt | 116 ------ .../streams/pgsql/create.zfunction/client.rpt | 33 +- .../streams/pgsql/create.zfunction/server.rpt | 46 +-- .../streams/pgsql/create.zstream/client.rpt | 63 --- .../streams/pgsql/create.zstream/server.rpt | 66 --- .../client.rpt | 5 +- .../server.rpt | 4 +- .../streams/pgsql/show.zstreams/client.rpt | 76 ---- .../streams/pgsql/show.zstreams/server.rpt | 79 ---- .../risingwave/streams/EffectiveIT.java | 22 +- .../binding/risingwave/streams/PgsqlIT.java | 16 +- .../macro/RisingwaveCreateZfunctionMacro.java | 38 +- .../risingwave/internal/stream/ProxyIT.java | 32 +- 22 files changed, 570 insertions(+), 1478 deletions(-) delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/client.rpt delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/server.rpt rename incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/{drop.zstream => drop.zfunction}/client.rpt (100%) rename incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/{drop.zstream => drop.zfunction}/server.rpt (100%) delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/client.rpt delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/server.rpt delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/client.rpt delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/server.rpt rename incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/{drop.zstream => drop.zfunction}/client.rpt (95%) rename incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/{drop.zstream => drop.zfunction}/server.rpt (95%) delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/client.rpt delete mode 100644 incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/server.rpt diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java index 0ff5e0061a..1e85221630 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java @@ -182,6 +182,11 @@ public void enterZfunc_with_option( if (ctx.EVENTS() != null) { events = tokens.getText(ctx.sconst()); + + if (events != null && events.length() >= 2) + { + events = events.substring(1, events.length() - 1); + } } } } diff --git a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java index b809c6b997..c0d7757602 100644 --- a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java +++ b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java @@ -503,5 +503,7 @@ RETURNS TABLE( assertEquals("args.amount", select.columns().get(2)); assertEquals("balance", select.from()); assertEquals("WHERE user_id = args.user_id", select.whereClause()); + + assertEquals("app_events", function.events()); } } diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt index cff99ae1a0..56d6f619a8 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt @@ -32,39 +32,205 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "INSERT INTO zb_catalog.zfunctions (name, sql) VALUES ('send_payment_handler', 'CREATE ZFUNCTION send_payment_handler(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "RETURNS TABLE(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$');" +write "SELECT * FROM zb_catalog.zfunctions WHERE name IN ('send_payment_handler');" [0x00] -write flush +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .type() + .column() + .name("name") + .tableOid(0) + .index(0) + .typeOid(701) + .length(8) + .modifier(-1) + .format("TEXT") + .build() + .column() + .name("sql") + .tableOid(0) + .index(0) + .typeOid(20) + .length(3) + .modifier(-1) + .format("TEXT") + .build() + .build() + .build()} + +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .row() + .build() + .build()} +read [0x00 0x02] # Field Count + [0x00 0x00 0x00 0x06] # Length + [0x63 0x69 0x74 0x69 0x65 0x73] # Data + [0x00 0x00 0x01 0x80] # Length + "CREATE ZFUNCTION send_payment_handler(\n" # Data + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "RETURNS TABLE(\n" + " event VARCHAR,\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "LANGUAGE SQL AS $$\n" + " SELECT\n" + " CASE\n" + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$" + [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("INSERT 0 2") + .tag("SELECT 1") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +read notify CREATE_TOPIC_COMPLETED + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE SOURCE zb_catalog.app_events_commands (*)\n" + "INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id\n" + "INCLUDE header 'zilla:identity' VARCHAR AS owner_id\n" + "INCLUDE timestamp AS created_at\n" + "WITH (\n" + " connector='kafka',\n" + " properties.bootstrap.server='localhost:9092',\n" + " topic='public.app_events_commands',\n" + " scan.startup.mode='latest',\n" + " scan.startup.timestamp.millis='140000000'\n" + ") FORMAT PLAIN ENCODE AVRO (\n" + " schema.registry = 'http://localhost:8081'\n" + ");" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_SOURCE") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_handler AS\n" + " SELECT\n" + " c.correlation_id,\n" + " c.owner_id,\n" + " c.created_at,\n" + " CASE\n" + " WHEN balance >= c.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event, c.user_id, c.amount\n" + " FROM zb_catalog.app_events_commands c\n" + " JOIN balance ON WHERE user_id = c.user_id\n" + " WHERE c.command = 'SendPayment';" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_MATERIALIZED_VIEW") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE MATERIALIZED VIEW public.app_events AS\n" + " SELECT * FROM zb_catalog.send_payment_handler;" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_MATERIALIZED_VIEW") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "GRANT ALL PRIVILEGES ON MATERIALIZED VIEW public.app_events TO zillabase;" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("GRANT_PRIVILEGES") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE MATERIALIZED VIEW zb_catalog.app_events_reply_handler AS\n" + " SELECT\n" + " '200' AS status,\n" + " correlation_id\n" + " FROM public.app_events;" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_MATERIALIZED_VIEW") .build() .build()} @@ -80,15 +246,61 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "FLUSH;" +write "CREATE SINK zb_catalog.app_events_replies_sink AS\n" + " SELECT\n" + " COALESCE(r.status, '400') AS status,\n" + " c.correlation_id\n" + " FROM zb_catalog.app_events_commands c\n" + " LEFT JOIN zb_catalog.app_events_reply_handler r\n" + " ON c.correlation_id = r.correlation_id\n" + "WITH (\n" + " connector = 'kafka',\n" + " topic = 'public.app_events_replies_sink',\n" + " properties.bootstrap.server = 'localhost:9092',\n" + ") FORMAT PLAIN ENCODE AVRO (\n" + " force_append_only='true',\n" + " schema.registry = 'http://localhost:8081'\n" + ");" [0x00] -write flush +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_SINK") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "INSERT INTO zb_catalog.zstreams (name, sql) VALUES ('app_events', 'CREATE ZSTREAM app_events (\n" + " event VARCHAR,\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION,\n" + " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" + " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" + ")\n" + "WITH (\n" + " DISPATCH_ON = ''command'',\n" + " HANDLERS = (\n" + " ''SendPayment'' TO ''send_payment_handler''\n" + " )\n" + ");');" + [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("FLUSH") + .tag("INSERT 0 2") .build() .build()} @@ -112,3 +324,65 @@ write zilla:begin.ext ${pgsql:beginEx() .build()} connected + +connect "zilla://streams/app2" + option zilla:window 8192 + option zilla:transmission "duplex" + +write zilla:begin.ext ${pgsql:beginEx() + .typeId(zilla:id("pgsql")) + .parameter("user", "postgres") + .parameter("database", "dev") + .parameter("application_name", "psql") + .parameter("client_encoding", "UTF8") + .build()} + +connected + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE TOPIC public.app_events_commands " + "(command VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION);" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_TOPIC") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +write zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +write "CREATE TOPIC public.app_events_replies_sink " + "(status VARCHAR, correlation_id VARCHAR);" + [0x00] + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_TOPIC") + .build() + .build()} + +read advised zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + + diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt index 74534c1d7b..44ea65629b 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt @@ -29,42 +29,32 @@ read zilla:begin.ext ${pgsql:beginEx() connected +read await CREATE_TOPIC_COMPLETED + read zilla:data.ext ${pgsql:dataEx() .typeId(zilla:id("pgsql")) .query() .build() .build()} -read "INSERT INTO zb_catalog.zfunctions (name, sql) VALUES ('send_payment_handler', 'CREATE ZFUNCTION send_payment_handler(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "RETURNS TABLE(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$');" +read "CREATE SOURCE zb_catalog.send_payment_commands (*)\n" + "INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id\n" + "INCLUDE header 'zilla:identity' VARCHAR AS owner_id\n" + "INCLUDE timestamp AS created_at\n" + "WITH (\n" + " connector = 'kafka',\n" + " properties.bootstrap.server = 'localhost:9092',\n" + " topic = 'public.send_payment_commands',\n" + " scan.startup.mode = 'latest',\n" + " scan.startup.timestamp.millis = '140000000'\n" + ") FORMAT PLAIN ENCODE AVRO (\n" + " schema.registry = 'http://localhost:8081'\n" + ");" [0x00] write advise zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("INSERT 0 2") + .tag("CREATE_SOURCE") .build() .build()} @@ -80,13 +70,23 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "FLUSH;" +read "CREATE MATERIALIZED VIEW zb_catalog.send_payment_events AS\n" + " SELECT\n" + " c.correlation_id,\n" + " c.owner_id,\n" + " c.created_at,\n" + " CASE\n" + " WHEN balance >= c.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event, c.user_id, c.amount\n" + " FROM zb_catalog.send_payment_commands c\n" + " JOIN balance ON WHERE user_id = c.user_id;" [0x00] write advise zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("FLUSH") + .tag("CREATE_MATERIALIZED_VIEW") .build() .build()} @@ -97,9 +97,107 @@ write advise zilla:flush ${pgsql:flushEx() .build() .build()} +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +read "CREATE SINK zb_catalog.send_payment_sink_into INTO app_events" + " FROM zb_catalog.send_payment_events;" + [0x00] -accepted +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_SINK") + .build() + .build()} + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +read "CREATE SINK zb_catalog.send_payment_replies AS\n" + " SELECT\n" + " '200' AS status,\n" + " c.correlation_id\n" + " FROM zb_catalog.send_payment_commands c\n" + " LEFT JOIN zb_catalog.send_payment_events r\n" + " ON c.correlation_id = r.correlation_id\n" + "WITH (\n" + " connector = 'kafka',\n" + " topic = 'public.send_payment_replies',\n" + " properties.bootstrap.server = 'localhost:9092',\n" + ") FORMAT PLAIN ENCODE AVRO (\n" + " force_append_only = 'true',\n" + " schema.registry = 'http://localhost:8081'\n" + ");" + [0x00] + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_SINK") + .build() + .build()} + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +read "INSERT INTO zb_catalog.zfunctions (name, sql) VALUES ('send_payment', 'CREATE ZFUNCTION send_payment(\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "RETURNS TABLE(\n" + " event VARCHAR,\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "LANGUAGE SQL AS $$\n" + " SELECT\n" + " CASE\n" + " WHEN balance >= args.amount THEN ''PaymentSent''\n" + " ELSE ''PaymentDeclined''\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" + "WITH (\n" + " EVENTS = ''app_events''\n" + ");');" + [0x00] + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("INSERT 0 2") + .build() + .build()} +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +accepted read zilla:begin.ext ${pgsql:beginEx() .typeId(zilla:id("pgsql")) @@ -111,3 +209,66 @@ read zilla:begin.ext ${pgsql:beginEx() connected +accept "zilla://streams/app2" + option zilla:window 8192 + option zilla:transmission "duplex" + +accepted + +read zilla:begin.ext ${pgsql:beginEx() + .typeId(zilla:id("pgsql")) + .parameter("user", "postgres") + .parameter("database", "dev") + .parameter("application_name", "psql") + .parameter("client_encoding", "UTF8") + .build()} + +connected + +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +read "CREATE TOPIC public.send_payment_commands " + "(user_id VARCHAR, amount DOUBLE PRECISION);" + [0x00] + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_TOPIC") + .build() + .build()} + +write notify CREATE_TOPIC_COMPLETED + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} + +read zilla:data.ext ${pgsql:dataEx() + .typeId(zilla:id("pgsql")) + .query() + .build() + .build()} +read "CREATE TOPIC public.send_payment_replies " + "(status VARCHAR, correlation_id VARCHAR);" + [0x00] + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .completion() + .tag("CREATE_TOPIC") + .build() + .build()} + +write advise zilla:flush ${pgsql:flushEx() + .typeId(zilla:id("pgsql")) + .ready() + .status("IDLE") + .build() + .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/client.rpt deleted file mode 100644 index 56d6f619a8..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/client.rpt +++ /dev/null @@ -1,388 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -connect "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "SELECT * FROM zb_catalog.zfunctions WHERE name IN ('send_payment_handler');" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(3) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -read [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x06] # Length - [0x63 0x69 0x74 0x69 0x65 0x73] # Data - [0x00 0x00 0x01 0x80] # Length - "CREATE ZFUNCTION send_payment_handler(\n" # Data - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "RETURNS TABLE(\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= args.amount THEN 'PaymentSent'\n" - " ELSE 'PaymentDeclined'\n" - " END AS event,\n" - " args.user_id,\n" - " args.amount\n" - " FROM balance WHERE user_id = args.user_id;\n" - "$$" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read notify CREATE_TOPIC_COMPLETED - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE SOURCE zb_catalog.app_events_commands (*)\n" - "INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id\n" - "INCLUDE header 'zilla:identity' VARCHAR AS owner_id\n" - "INCLUDE timestamp AS created_at\n" - "WITH (\n" - " connector='kafka',\n" - " properties.bootstrap.server='localhost:9092',\n" - " topic='public.app_events_commands',\n" - " scan.startup.mode='latest',\n" - " scan.startup.timestamp.millis='140000000'\n" - ") FORMAT PLAIN ENCODE AVRO (\n" - " schema.registry = 'http://localhost:8081'\n" - ");" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_SOURCE") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_handler AS\n" - " SELECT\n" - " c.correlation_id,\n" - " c.owner_id,\n" - " c.created_at,\n" - " CASE\n" - " WHEN balance >= c.amount THEN 'PaymentSent'\n" - " ELSE 'PaymentDeclined'\n" - " END AS event, c.user_id, c.amount\n" - " FROM zb_catalog.app_events_commands c\n" - " JOIN balance ON WHERE user_id = c.user_id\n" - " WHERE c.command = 'SendPayment';" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE MATERIALIZED VIEW public.app_events AS\n" - " SELECT * FROM zb_catalog.send_payment_handler;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "GRANT ALL PRIVILEGES ON MATERIALIZED VIEW public.app_events TO zillabase;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("GRANT_PRIVILEGES") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE MATERIALIZED VIEW zb_catalog.app_events_reply_handler AS\n" - " SELECT\n" - " '200' AS status,\n" - " correlation_id\n" - " FROM public.app_events;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE SINK zb_catalog.app_events_replies_sink AS\n" - " SELECT\n" - " COALESCE(r.status, '400') AS status,\n" - " c.correlation_id\n" - " FROM zb_catalog.app_events_commands c\n" - " LEFT JOIN zb_catalog.app_events_reply_handler r\n" - " ON c.correlation_id = r.correlation_id\n" - "WITH (\n" - " connector = 'kafka',\n" - " topic = 'public.app_events_replies_sink',\n" - " properties.bootstrap.server = 'localhost:9092',\n" - ") FORMAT PLAIN ENCODE AVRO (\n" - " force_append_only='true',\n" - " schema.registry = 'http://localhost:8081'\n" - ");" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_SINK") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "INSERT INTO zb_catalog.zstreams (name, sql) VALUES ('app_events', 'CREATE ZSTREAM app_events (\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = ''command'',\n" - " HANDLERS = (\n" - " ''SendPayment'' TO ''send_payment_handler''\n" - " )\n" - ");');" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("INSERT 0 2") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -connect "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -connect "zilla://streams/app2" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE TOPIC public.app_events_commands " - "(command VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION);" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_TOPIC") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE TOPIC public.app_events_replies_sink " - "(status VARCHAR, correlation_id VARCHAR);" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_TOPIC") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - - diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/server.rpt deleted file mode 100644 index e244b3f962..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zstream/server.rpt +++ /dev/null @@ -1,390 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -accept "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "SELECT * FROM zb_catalog.zfunctions WHERE name IN ('send_payment_handler');" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(3) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -write [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x06] # Length - [0x63 0x69 0x74 0x69 0x65 0x73] # Data - [0x00 0x00 0x01 0x80] # Length - "CREATE ZFUNCTION send_payment_handler(\n" # Data - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "RETURNS TABLE(\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= args.amount THEN 'PaymentSent'\n" - " ELSE 'PaymentDeclined'\n" - " END AS event,\n" - " args.user_id,\n" - " args.amount\n" - " FROM balance WHERE user_id = args.user_id;\n" - "$$" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read await CREATE_TOPIC_COMPLETED - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE SOURCE zb_catalog.app_events_commands (*)\n" - "INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id\n" - "INCLUDE header 'zilla:identity' VARCHAR AS owner_id\n" - "INCLUDE timestamp AS created_at\n" - "WITH (\n" - " connector='kafka',\n" - " properties.bootstrap.server='localhost:9092',\n" - " topic='public.app_events_commands',\n" - " scan.startup.mode='latest',\n" - " scan.startup.timestamp.millis='140000000'\n" - ") FORMAT PLAIN ENCODE AVRO (\n" - " schema.registry = 'http://localhost:8081'\n" - ");" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_SOURCE") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE MATERIALIZED VIEW zb_catalog.send_payment_handler AS\n" - " SELECT\n" - " c.correlation_id,\n" - " c.owner_id,\n" - " c.created_at,\n" - " CASE\n" - " WHEN balance >= c.amount THEN 'PaymentSent'\n" - " ELSE 'PaymentDeclined'\n" - " END AS event, c.user_id, c.amount\n" - " FROM zb_catalog.app_events_commands c\n" - " JOIN balance ON WHERE user_id = c.user_id\n" - " WHERE c.command = 'SendPayment';" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE MATERIALIZED VIEW public.app_events AS\n" - " SELECT * FROM zb_catalog.send_payment_handler;" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "GRANT ALL PRIVILEGES ON MATERIALIZED VIEW public.app_events TO zillabase;" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("GRANT_PRIVILEGES") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE MATERIALIZED VIEW zb_catalog.app_events_reply_handler AS\n" - " SELECT\n" - " '200' AS status,\n" - " correlation_id\n" - " FROM public.app_events;" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE SINK zb_catalog.app_events_replies_sink AS\n" - " SELECT\n" - " COALESCE(r.status, '400') AS status,\n" - " c.correlation_id\n" - " FROM zb_catalog.app_events_commands c\n" - " LEFT JOIN zb_catalog.app_events_reply_handler r\n" - " ON c.correlation_id = r.correlation_id\n" - "WITH (\n" - " connector = 'kafka',\n" - " topic = 'public.app_events_replies_sink',\n" - " properties.bootstrap.server = 'localhost:9092',\n" - ") FORMAT PLAIN ENCODE AVRO (\n" - " force_append_only='true',\n" - " schema.registry = 'http://localhost:8081'\n" - ");" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_SINK") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "INSERT INTO zb_catalog.zstreams (name, sql) VALUES ('app_events', 'CREATE ZSTREAM app_events (\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = ''command'',\n" - " HANDLERS = (\n" - " ''SendPayment'' TO ''send_payment_handler''\n" - " )\n" - ");');" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("INSERT 0 2") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -accept "zilla://streams/app2" - option zilla:window 8192 - option zilla:transmission "duplex" - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE TOPIC public.app_events_commands " - "(command VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION);" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_TOPIC") - .build() - .build()} - -write notify CREATE_TOPIC_COMPLETED - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE TOPIC public.app_events_replies_sink " - "(status VARCHAR, correlation_id VARCHAR);" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_TOPIC") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zstream/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt similarity index 100% rename from incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zstream/client.rpt rename to incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zstream/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt similarity index 100% rename from incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zstream/server.rpt rename to incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/client.rpt deleted file mode 100644 index 4b9b96995b..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/client.rpt +++ /dev/null @@ -1,114 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -connect "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "SELECT * FROM zb_catalog.zstreams;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -read [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - [0x00 0x00 0x00 0x7c] # Length - "CREATE ZSTREAM app_events (\n" # Data - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'RequestPayment' TO 'request_payment_handler'\n" - " )\n" - "); - [0x00] - - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -connect "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/server.rpt deleted file mode 100644 index 2b0d29f450..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zstreams/server.rpt +++ /dev/null @@ -1,116 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -accept "zilla://streams/app1" - option zilla:window 8192 - option zilla:transmission "duplex" - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "postgres") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "SELECT * FROM zb_catalog.zstreams;" -read [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -write [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - [0x00 0x00 0x00 0x7c] # Length - "CREATE ZSTREAM app_events (\n" # Data - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'RequestPayment' TO 'request_payment_handler'\n" - " )\n" - "); - [0x00] -write flush - - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt index ddfc1801bf..4bbdeb8920 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt @@ -32,31 +32,26 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE ZFUNCTION send_payment_handler(\n" - " type VARCHAR,\n" +write "CREATE ZFUNCTION send_payment(\n" " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "RETURNS TABLE(\n" - " type VARCHAR,\n" + " event VARCHAR,\n" " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "LANGUAGE SQL AS $$\n" " SELECT\n" " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$" + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" + "WITH (\n" + " EVENTS = 'app_events'\n" + ");" [0x00] write flush diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt index aa734eae80..1c00e3315f 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt @@ -36,31 +36,27 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "CREATE ZFUNCTION send_payment_handler(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "RETURNS TABLE(\n" - " type VARCHAR,\n" - " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$" +write "CREATE ZFUNCTION send_payment(\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "RETURNS TABLE(\n" + " event VARCHAR,\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "LANGUAGE SQL AS $$\n" + " SELECT\n" + " CASE\n" + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" + "WITH (\n" + " EVENTS = 'app_events'\n" + ");" + [0x00] [0x00] write advise zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/client.rpt deleted file mode 100644 index 68b77e37dc..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/client.rpt +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -connect "zilla://streams/app0" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE ZSTREAM app_events (\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'SendPayment' TO 'send_payment_handler'\n" - " )\n" - ");" - [0x00] -write flush - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_ZSTREAM") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/server.rpt deleted file mode 100644 index 1dca7c028e..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zstream/server.rpt +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -property serverAddress "zilla://streams/app0" - -accept ${serverAddress} - option zilla:window 8192 - option zilla:transmission "duplex" - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "CREATE ZSTREAM app_events (\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'SendPayment' TO 'send_payment_handler'\n" - " )\n" - ");" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_ZSTREAM") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt similarity index 95% rename from incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/client.rpt rename to incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt index bda4c0b3fd..6a90215061 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt @@ -32,15 +32,14 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP ZSTREAM app_events;" +write "DROP ZFUNCTION weather;" [0x00] - write flush read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("DROP_ZSTREAM") + .tag("DROP_ZFUNCTION") .build() .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt similarity index 95% rename from incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/server.rpt rename to incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt index 0b90a76681..271bbb0348 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zstream/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt @@ -36,13 +36,13 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP ZSTREAM app_events;" +read "DROP ZFUNCTION weather;" [0x00] write advise zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("DROP_ZSTREAM") + .tag("DROP_ZFUNCTION") .build() .build()} diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/client.rpt deleted file mode 100644 index a80bf49be8..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/client.rpt +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -connect "zilla://streams/app0" - option zilla:window 8192 - option zilla:transmission "duplex" - -write zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "SHOW ZSTREAMS;" - [0x00] -write flush - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("Name") - .tableOid(0) - .index(0) - .typeOid(1043) - .length(4) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -read [0x00 0x01] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SHOW_COMMAND") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/server.rpt deleted file mode 100644 index 340df4d6bc..0000000000 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zstreams/server.rpt +++ /dev/null @@ -1,79 +0,0 @@ -# -# Copyright 2021-2024 Aklivity Inc -# -# Licensed under the Aklivity Community License (the "License"); you may not use -# this file except in compliance with the License. You may obtain a copy of the -# License at -# -# https://www.aklivity.io/aklivity-community-license/ -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# - -property serverAddress "zilla://streams/app0" - -accept ${serverAddress} - option zilla:window 8192 - option zilla:transmission "duplex" - -accepted - -read zilla:begin.ext ${pgsql:beginEx() - .typeId(zilla:id("pgsql")) - .parameter("user", "zillabase") - .parameter("database", "dev") - .parameter("application_name", "psql") - .parameter("client_encoding", "UTF8") - .build()} - -connected - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "SHOW ZSTREAMS;" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("Name") - .tableOid(0) - .index(0) - .typeOid(1043) - .length(4) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} -write flush - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -write [0x00 0x01] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SHOW_COMMAND") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} diff --git a/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/EffectiveIT.java b/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/EffectiveIT.java index a3f6049da1..fb8aef9429 100644 --- a/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/EffectiveIT.java +++ b/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/EffectiveIT.java @@ -46,16 +46,6 @@ public void shouldCreateZtableWithPrimaryKey() throws Exception k3po.finish(); } - @Test - @Specification({ - "${app}/create.zstream/client", - "${app}/create.zstream/server" - }) - public void shouldCreateZstream() throws Exception - { - k3po.finish(); - } - @Test @Specification({ "${app}/create.zview/client", @@ -182,18 +172,18 @@ public void shouldDropZtable() throws Exception @Test @Specification({ - "${app}/drop.zstream/client", - "${app}/drop.zstream/server" }) - public void shouldDropZstream() throws Exception + "${app}/drop.zview/client", + "${app}/drop.zview/server" }) + public void shouldDropZview() throws Exception { k3po.finish(); } @Test @Specification({ - "${app}/drop.zview/client", - "${app}/drop.zview/server" }) - public void shouldDropZview() throws Exception + "${app}/drop.zfunction/client", + "${app}/drop.zfunction/server" }) + public void shouldDropZfunction() throws Exception { k3po.finish(); } diff --git a/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/PgsqlIT.java b/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/PgsqlIT.java index 19ec9f9bd5..96b5d93902 100644 --- a/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/PgsqlIT.java +++ b/incubator/binding-risingwave.spec/src/test/java/io/aklivity/zilla/specs/binding/risingwave/streams/PgsqlIT.java @@ -46,16 +46,6 @@ public void shouldCreateZtableWithPrimaryKey() throws Exception k3po.finish(); } - @Test - @Specification({ - "${app}/create.zstream/client", - "${app}/create.zstream/server" - }) - public void shouldCreateZstream() throws Exception - { - k3po.finish(); - } - @Test @Specification({ "${app}/create.zview/client", @@ -182,9 +172,9 @@ public void shouldDropZtable() throws Exception @Test @Specification({ - "${app}/drop.zstream/client", - "${app}/drop.zstream/server" }) - public void shouldDropZstream() throws Exception + "${app}/drop.zfunction/client", + "${app}/drop.zfunction/server" }) + public void shouldDropZfunction() throws Exception { k3po.finish(); } diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java index 2aba28c614..4d7a7790da 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java @@ -24,7 +24,7 @@ public class RisingwaveCreateZfunctionMacro extends RisingwaveMacroBase { - private static final String ZFUNCTION_NAME = "zfunction"; + private static final String ZFUNCTION_NAME = "zfunctions"; private final String bootstrapServer; private final String schemaRegistry; @@ -116,11 +116,11 @@ private final class CreateSourceState implements RisingwaveMacroState INCLUDE header 'zilla:identity' VARCHAR AS owner_id INCLUDE timestamp AS created_at WITH ( - connector='kafka', - properties.bootstrap.server='%s', - topic='%s.%s_commands', - scan.startup.mode='latest', - scan.startup.timestamp.millis='%d' + connector = 'kafka', + properties.bootstrap.server = '%s', + topic = '%s.%s_commands', + scan.startup.mode = 'latest', + scan.startup.timestamp.millis = '%d' ) FORMAT PLAIN ENCODE AVRO ( schema.registry = '%s' );\u0000"""; @@ -232,15 +232,17 @@ public RisingwaveMacroState onError( private final class CreateSinkIntoState implements RisingwaveMacroState { private final String sqlFormat = """ - CREATE SINK %s.%_sink_into INTO %s FROM %s.%s_events;\u0000"""; + CREATE SINK %s_sink_into INTO %s FROM %s_events;\u0000"""; @Override public void onStarted( long traceId, long authorization) { + final String systemName = "%s.%s".formatted(systemSchema, command.name()); final String events = command.events(); - String sqlQuery = String.format(sqlFormat, systemSchema, command.name(), events, command.schema(), command.name()); + + String sqlQuery = String.format(sqlFormat, systemName, events, systemName); handler.doExecuteSystemClient(traceId, authorization, sqlQuery); } @@ -272,7 +274,7 @@ public RisingwaveMacroState onError( private final class CreateSinkTopicState implements RisingwaveMacroState { private final String sqlFormat = """ - CREATE TOPIC %s.%s_replies_sink (status VARCHAR, correlation_id VARCHAR);\u0000"""; + CREATE TOPIC %s.%s_replies (status VARCHAR, correlation_id VARCHAR);\u0000"""; @Override public void onStarted( @@ -313,19 +315,19 @@ public RisingwaveMacroState onError( private final class CreateReplySink implements RisingwaveMacroState { private final String sqlFormat = """ - CREATE SINK %s_replies_sink AS - SELECT - '200' AS status, - c.correlation_id - FROM %s_commands c - LEFT JOIN %s_events r - ON c.correlation_id = r.correlation_id + CREATE SINK %s_replies AS + SELECT + '200' AS status, + c.correlation_id + FROM %s_commands c + LEFT JOIN %s_events r + ON c.correlation_id = r.correlation_id WITH ( connector = 'kafka', - topic = '%s.%s_replies_sink', + topic = '%s.%s_replies', properties.bootstrap.server = '%s', ) FORMAT PLAIN ENCODE AVRO ( - force_append_only='true', + force_append_only = 'true', schema.registry = '%s' );\u0000"""; diff --git a/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java b/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java index d65f370f72..c3f6f92284 100644 --- a/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java +++ b/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java @@ -59,16 +59,6 @@ public void shouldCreateZtableWithPrimaryKey() throws Exception k3po.finish(); } - @Test - @Configuration("proxy.yaml") - @Specification({ - "${pgsql}/create.zstream/client", - "${effective}/create.zstream/server" }) - public void shouldCreateZstream() throws Exception - { - k3po.finish(); - } - @Test @Configuration("proxy.risingwave.yaml") @Specification({ @@ -192,16 +182,6 @@ public void shouldSetVariable() throws Exception k3po.finish(); } - @Test - @Configuration("proxy.yaml") - @Specification({ - "${pgsql}/drop.zstream/client", - "${effective}/drop.zstream/server" }) - public void shouldDropZstream() throws Exception - { - k3po.finish(); - } - @Test @Configuration("proxy.yaml") @Specification({ @@ -263,7 +243,7 @@ public void shouldShowZtables() throws Exception } @Test - @Configuration("proxy.risingwave.yaml") + @Configuration("proxy.yaml") @Specification({ "${pgsql}/create.zfunction/client", "${effective}/create.zfunction/server" }) @@ -281,14 +261,4 @@ public void shouldShowZfunctions() throws Exception { k3po.finish(); } - - @Test - @Configuration("proxy.risingwave.yaml") - @Specification({ - "${pgsql}/show.zstreams/client", - "${effective}/show.zstreams/server" }) - public void shouldShowZstreams() throws Exception - { - k3po.finish(); - } } From 87545590f3fac03d44d21e2132d2e1633be21658 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 13:13:37 -0800 Subject: [PATCH 05/10] WIP --- .../binding/pgsql/parser/PostgreSqlParser.g4 | 1 + .../binding/pgsql/parser/PgsqlParser.java | 2 +- .../binding/pgsql/parser/PgsqlParserTest.java | 14 +- .../effective/create.zfunction/client.rpt | 204 +++-------- .../effective/drop.zfunction/client.rpt | 110 +----- .../effective/drop.zfunction/server.rpt | 111 +----- .../streams/pgsql/create.zfunction/client.rpt | 1 - .../streams/pgsql/create.zfunction/server.rpt | 3 +- .../streams/pgsql/drop.zfunction/client.rpt | 2 +- .../streams/pgsql/drop.zfunction/server.rpt | 2 +- .../config/RisingwaveCommandType.java | 1 + .../macro/RisingwaveDropZfunctionMacro.java | 322 ++++++++++++++++++ .../stream/RisingwaveCompletionCommand.java | 1 + .../stream/RisingwaveProxyFactory.java | 24 ++ .../risingwave/internal/stream/ProxyIT.java | 10 + 15 files changed, 436 insertions(+), 372 deletions(-) create mode 100644 incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZfunctionMacro.java diff --git a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 index 4d29284083..3ad3996f95 100644 --- a/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 +++ b/incubator/binding-pgsql/src/main/antlr4/io/aklivity/zilla/runtime/binding/pgsql/parser/PostgreSqlParser.g4 @@ -1652,6 +1652,7 @@ object_type_any_name | MATERIALIZED VIEW | TOPIC | ZVIEW + | ZFUNCTION | ZTABLE | INDEX | FOREIGN TABLE diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 6d35805734..5f53688d30 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -171,7 +171,7 @@ public void syntaxError( RecognitionException e) { //Only for debugging - //System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); + System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); } @Override diff --git a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java index c0d7757602..41759aa106 100644 --- a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java +++ b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java @@ -473,7 +473,7 @@ RETURNS TABLE( WITH( EVENTS = 'app_events' ) - """; + """; CreateZfunction function = parser.parseCreateZfunction(sql); assertNotNull(function); @@ -506,4 +506,16 @@ RETURNS TABLE( assertEquals("app_events", function.events()); } + + @Test + public void shouldDropSingleZfunction() + { + String sql = "DROP ZFUNCTION test_function;"; + + List drops = parser.parseDrop(sql); + + assertEquals(1, drops.size()); + assertEquals("public", drops.get(0).schema()); + assertEquals("test_function", drops.get(0).name()); + } } diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt index 56d6f619a8..2ce14de612 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt @@ -27,80 +27,6 @@ write zilla:begin.ext ${pgsql:beginEx() connected -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "SELECT * FROM zb_catalog.zfunctions WHERE name IN ('send_payment_handler');" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(3) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -read [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x06] # Length - [0x63 0x69 0x74 0x69 0x65 0x73] # Data - [0x00 0x00 0x01 0x80] # Length - "CREATE ZFUNCTION send_payment_handler(\n" # Data - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "RETURNS TABLE(\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION)\n" - "LANGUAGE SQL AS $$\n" - " SELECT\n" - " CASE\n" - " WHEN balance >= args.amount THEN 'PaymentSent'\n" - " ELSE 'PaymentDeclined'\n" - " END AS event,\n" - " args.user_id,\n" - " args.amount\n" - " FROM balance WHERE user_id = args.user_id;\n" - "$$" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - read notify CREATE_TOPIC_COMPLETED write zilla:data.ext ${pgsql:dataEx() @@ -108,16 +34,16 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE SOURCE zb_catalog.app_events_commands (*)\n" +write "CREATE SOURCE zb_catalog.send_payment_commands (*)\n" "INCLUDE header 'zilla:correlation-id' VARCHAR AS correlation_id\n" "INCLUDE header 'zilla:identity' VARCHAR AS owner_id\n" "INCLUDE timestamp AS created_at\n" "WITH (\n" - " connector='kafka',\n" - " properties.bootstrap.server='localhost:9092',\n" - " topic='public.app_events_commands',\n" - " scan.startup.mode='latest',\n" - " scan.startup.timestamp.millis='140000000'\n" + " connector = 'kafka',\n" + " properties.bootstrap.server = 'localhost:9092',\n" + " topic = 'public.send_payment_commands',\n" + " scan.startup.mode = 'latest',\n" + " scan.startup.timestamp.millis = '140000000'\n" ") FORMAT PLAIN ENCODE AVRO (\n" " schema.registry = 'http://localhost:8081'\n" ");" @@ -142,7 +68,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_handler AS\n" +write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_events AS\n" " SELECT\n" " c.correlation_id,\n" " c.owner_id,\n" @@ -151,9 +77,8 @@ write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_handler AS\n" " WHEN balance >= c.amount THEN 'PaymentSent'\n" " ELSE 'PaymentDeclined'\n" " END AS event, c.user_id, c.amount\n" - " FROM zb_catalog.app_events_commands c\n" - " JOIN balance ON WHERE user_id = c.user_id\n" - " WHERE c.command = 'SendPayment';" + " FROM zb_catalog.send_payment_commands c\n" + " JOIN balance ON WHERE user_id = c.user_id;" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -175,62 +100,14 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE MATERIALIZED VIEW public.app_events AS\n" - " SELECT * FROM zb_catalog.send_payment_handler;" +write "CREATE SINK zb_catalog.send_payment_sink_into INTO app_events" + " FROM zb_catalog.send_payment_events;" [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("CREATE_MATERIALIZED_VIEW") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "GRANT ALL PRIVILEGES ON MATERIALIZED VIEW public.app_events TO zillabase;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("GRANT_PRIVILEGES") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "CREATE MATERIALIZED VIEW zb_catalog.app_events_reply_handler AS\n" - " SELECT\n" - " '200' AS status,\n" - " correlation_id\n" - " FROM public.app_events;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("CREATE_MATERIALIZED_VIEW") + .tag("CREATE_SINK") .build() .build()} @@ -246,19 +123,19 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE SINK zb_catalog.app_events_replies_sink AS\n" +write "CREATE SINK zb_catalog.send_payment_replies AS\n" " SELECT\n" - " COALESCE(r.status, '400') AS status,\n" - " c.correlation_id\n" - " FROM zb_catalog.app_events_commands c\n" - " LEFT JOIN zb_catalog.app_events_reply_handler r\n" - " ON c.correlation_id = r.correlation_id\n" + " '200' AS status,\n" + " c.correlation_id\n" + " FROM zb_catalog.send_payment_commands c\n" + " LEFT JOIN zb_catalog.send_payment_events r\n" + " ON c.correlation_id = r.correlation_id\n" "WITH (\n" " connector = 'kafka',\n" - " topic = 'public.app_events_replies_sink',\n" + " topic = 'public.send_payment_replies',\n" " properties.bootstrap.server = 'localhost:9092',\n" ") FORMAT PLAIN ENCODE AVRO (\n" - " force_append_only='true',\n" + " force_append_only = 'true',\n" " schema.registry = 'http://localhost:8081'\n" ");" [0x00] @@ -282,18 +159,25 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "INSERT INTO zb_catalog.zstreams (name, sql) VALUES ('app_events', 'CREATE ZSTREAM app_events (\n" - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" +write "INSERT INTO zb_catalog.zfunctions (name, sql) VALUES ('send_payment', 'CREATE ZFUNCTION send_payment(\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "RETURNS TABLE(\n" + " event VARCHAR,\n" + " user_id VARCHAR,\n" + " amount DOUBLE PRECISION)\n" + "LANGUAGE SQL AS $$\n" + " SELECT\n" + " CASE\n" + " WHEN balance >= args.amount THEN ''PaymentSent''\n" + " ELSE ''PaymentDeclined''\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" "WITH (\n" - " DISPATCH_ON = ''command'',\n" - " HANDLERS = (\n" - " ''SendPayment'' TO ''send_payment_handler''\n" - " )\n" + " EVENTS = ''app_events''\n" ");');" [0x00] @@ -344,9 +228,9 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE TOPIC public.app_events_commands " - "(command VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION);" - [0x00] +write "CREATE TOPIC public.send_payment_commands " + "(user_id VARCHAR, amount DOUBLE PRECISION);" + [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) @@ -367,9 +251,9 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE TOPIC public.app_events_replies_sink " - "(status VARCHAR, correlation_id VARCHAR);" - [0x00] +write "CREATE TOPIC public.send_payment_replies " + "(status VARCHAR, correlation_id VARCHAR);" + [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt index abde5a86fe..31d3590fa1 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/client.rpt @@ -32,79 +32,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "SELECT * FROM zb_catalog.zstreams WHERE name = 'app_events';" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(3) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -read [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - [0x00 0x00 0x01 0x4d] # Length - "CREATE ZSTREAM app_events (\n" # Data - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'RequestPayment' TO 'request_payment_handler'\n" - " )\n" - ");" - [0x00] - - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "DELETE FROM zb_catalog.zstreams WHERE name = 'app_events';" +write "DELETE FROM zb_catalog.zfunctions WHERE name = 'send_payment';" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -126,7 +54,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP SINK zb_catalog.app_events_replies_sink;" +write "DROP SINK zb_catalog.send_payment_replies;" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -148,35 +76,13 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP MATERIALIZED VIEW zb_catalog.app_events_reply_handler;" +write "DROP SINK zb_catalog.send_payment_sink_into;" [0x00] read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("DROP_MATERIALIZED_VIEW") - .build() - .build()} - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -write "DROP MATERIALIZED VIEW public.app_events;" - [0x00] - -read advised zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("DROP_MATERIALIZED_VIEW") + .tag("DROP_SINK") .build() .build()} @@ -192,7 +98,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP MATERIALIZED VIEW zb_catalog.request_payment_handler;" +write "DROP MATERIALIZED VIEW zb_catalog.send_payment_events;" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -214,7 +120,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP SOURCE zb_catalog.app_events_commands;" +write "DROP SOURCE zb_catalog.send_payment_commands;" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -264,7 +170,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP TOPIC public.app_events_replies_sink;" +write "DROP TOPIC public.send_payment_replies;" [0x00] read advised zilla:flush ${pgsql:flushEx() @@ -286,7 +192,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP TOPIC public.app_events_commands;" +write "DROP TOPIC public.send_payment_commands;" [0x00] read advised zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt index 02a2243e20..277ce0f55f 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/drop.zfunction/server.rpt @@ -34,80 +34,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "SELECT * FROM zb_catalog.zstreams WHERE name = 'app_events';" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .type() - .column() - .name("name") - .tableOid(0) - .index(0) - .typeOid(701) - .length(8) - .modifier(-1) - .format("TEXT") - .build() - .column() - .name("sql") - .tableOid(0) - .index(0) - .typeOid(20) - .length(3) - .modifier(-1) - .format("TEXT") - .build() - .build() - .build()} - -write zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .row() - .build() - .build()} -write [0x00 0x02] # Field Count - [0x00 0x00 0x00 0x0a] # Length - "app_events" # Data - [0x00 0x00 0x01 0x4d] # Length - "CREATE ZSTREAM app_events (\n" # Data - " event VARCHAR,\n" - " user_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR,\n" - " owner_id VARCHAR GENERATED ALWAYS AS IDENTITY,\n" - " created_at TIMESTAMP GENERATED ALWAYS AS NOW\n" - ")\n" - "WITH (\n" - " DISPATCH_ON = 'command',\n" - " HANDLERS = (\n" - " 'RequestPayment' TO 'request_payment_handler'\n" - " )\n" - ");" - [0x00] -write flush - - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("SELECT 1") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "DELETE FROM zb_catalog.zstreams WHERE name = 'app_events';" +read "DELETE FROM zb_catalog.zfunctions WHERE name = 'send_payment';" [0x00] write advise zilla:flush ${pgsql:flushEx() @@ -129,7 +56,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP SINK zb_catalog.app_events_replies_sink;" +read "DROP SINK zb_catalog.send_payment_replies;" [0x00] write advise zilla:flush ${pgsql:flushEx() @@ -151,35 +78,13 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP MATERIALIZED VIEW zb_catalog.app_events_reply_handler;" +read "DROP SINK zb_catalog.send_payment_sink_into;" [0x00] write advise zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) .completion() - .tag("DROP_MATERIALIZED_VIEW") - .build() - .build()} - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .ready() - .status("IDLE") - .build() - .build()} - -read zilla:data.ext ${pgsql:dataEx() - .typeId(zilla:id("pgsql")) - .query() - .build() - .build()} -read "DROP MATERIALIZED VIEW public.app_events;" - [0x00] - -write advise zilla:flush ${pgsql:flushEx() - .typeId(zilla:id("pgsql")) - .completion() - .tag("DROP_MATERIALIZED_VIEW") + .tag("DROP_SINK") .build() .build()} @@ -195,7 +100,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP MATERIALIZED VIEW zb_catalog.request_payment_handler;" +read "DROP MATERIALIZED VIEW zb_catalog.send_payment_events;" [0x00] write advise zilla:flush ${pgsql:flushEx() @@ -217,7 +122,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP SOURCE zb_catalog.app_events_commands;" +read "DROP SOURCE zb_catalog.send_payment_commands;" [0x00] write advise zilla:flush ${pgsql:flushEx() @@ -267,7 +172,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP TOPIC public.app_events_replies_sink;" +read "DROP TOPIC public.send_payment_replies;" [0x00] write advise zilla:flush ${pgsql:flushEx() @@ -289,7 +194,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP TOPIC public.app_events_commands;" +read "DROP TOPIC public.send_payment_commands;" [0x00] write advise zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt index 4bbdeb8920..fa8bdc841a 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/client.rpt @@ -53,7 +53,6 @@ write "CREATE ZFUNCTION send_payment(\n" " EVENTS = 'app_events'\n" ");" [0x00] - write flush read advised zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt index 1c00e3315f..ee8181f642 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/create.zfunction/server.rpt @@ -36,7 +36,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "CREATE ZFUNCTION send_payment(\n" +read "CREATE ZFUNCTION send_payment(\n" " user_id VARCHAR,\n" " amount DOUBLE PRECISION)\n" "RETURNS TABLE(\n" @@ -57,7 +57,6 @@ write "CREATE ZFUNCTION send_payment(\n" " EVENTS = 'app_events'\n" ");" [0x00] - [0x00] write advise zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt index 6a90215061..e2edce5ab1 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/client.rpt @@ -32,7 +32,7 @@ write zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -write "DROP ZFUNCTION weather;" +write "DROP ZFUNCTION send_payment;" [0x00] write flush diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt index 271bbb0348..294c43dcd5 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/drop.zfunction/server.rpt @@ -36,7 +36,7 @@ read zilla:data.ext ${pgsql:dataEx() .query() .build() .build()} -read "DROP ZFUNCTION weather;" +read "DROP ZFUNCTION send_payment;" [0x00] write advise zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java index 743fb886b1..8b97e14cdc 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java @@ -28,6 +28,7 @@ public enum RisingwaveCommandType DROP_TOPIC_COMMAND("DROP TOPIC".getBytes()), DROP_ZTABLE_COMMAND("DROP ZTABLE".getBytes()), DROP_ZVIEW_COMMAND("DROP ZVIEW".getBytes()), + DROP_ZFUNCTION_COMMAND("DROP ZFUNCTION".getBytes()), SHOW_ZTABLES_COMMAND("SHOW ZTABLES".getBytes()), SHOW_ZSTREAMS_COMMAND("SHOW ZSTREAMS".getBytes()), SHOW_ZVIEWS_COMMAND("SHOW ZVIEWS".getBytes()), diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZfunctionMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZfunctionMacro.java new file mode 100644 index 0000000000..be2a46c583 --- /dev/null +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveDropZfunctionMacro.java @@ -0,0 +1,322 @@ +/* + * Copyright 2021-2024 Aklivity Inc + * + * Licensed under the Aklivity Community License (the "License"); you may not use + * this file except in compliance with the License. You may obtain a copy of the + * License at + * + * https://www.aklivity.io/aklivity-community-license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package io.aklivity.zilla.runtime.binding.risingwave.internal.macro; + +import io.aklivity.zilla.runtime.binding.pgsql.parser.model.Drop; +import io.aklivity.zilla.runtime.binding.risingwave.internal.stream.RisingwaveCompletionCommand; +import io.aklivity.zilla.runtime.binding.risingwave.internal.types.stream.PgsqlFlushExFW; + +public class RisingwaveDropZfunctionMacro extends RisingwaveMacroBase +{ + private final String systemSchema; + private final Drop command; + + public RisingwaveDropZfunctionMacro( + String systemSchema, + String sql, + Drop command, + RisingwaveMacroHandler handler) + { + super(sql, handler); + + this.systemSchema = systemSchema; + this.command = command; + } + + public RisingwaveMacroState start() + { + return new DeleteCatalogState(); + } + + private final class DeleteCatalogState implements RisingwaveMacroState + { + private final String sqlFormat = """ + DELETE FROM %s.zfunctions WHERE name = '%s';\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropReplySink state = new DropReplySink(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + return errorState(); + } + } + + private final class DropReplySink implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP SINK %s.%s_replies;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String name = command.name(); + + String sqlQuery = String.format(sqlFormat, systemSchema, name); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropSinkTopicState state = new DropSinkTopicState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + return errorState(); + } + } + + private final class DropSinkTopicState implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP TOPIC %s.%s_replies;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String topic = command.name(); + + String sqlQuery = String.format(sqlFormat, command.schema(), topic); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropReplySinkInto state = new DropReplySinkInto(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + + return errorState(); + } + } + + private final class DropReplySinkInto implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP SINK %s.%s_sink_into;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String name = command.name(); + + String sqlQuery = String.format(sqlFormat, systemSchema, name); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropReplyMaterializedViewState state = new DropReplyMaterializedViewState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + return errorState(); + } + } + + private final class DropReplyMaterializedViewState implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP MATERIALIZED VIEW %s.%s_events;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropSourceState state = new DropSourceState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + + return errorState(); + } + } + + private final class DropSourceState implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP SOURCE %s.%s_commands;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String sqlQuery = String.format(sqlFormat, systemSchema, command.name()); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + DropSourceTopicState state = new DropSourceTopicState(); + state.onStarted(traceId, authorization); + + return state; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + return errorState(); + } + } + + private final class DropSourceTopicState implements RisingwaveMacroState + { + private final String sqlFormat = """ + DROP TOPIC %s.%s_commands;\u0000"""; + + @Override + public void onStarted( + long traceId, + long authorization) + { + String sqlQuery = String.format(sqlFormat, command.schema(), command.name()); + + handler.doExecuteSystemClient(traceId, authorization, sqlQuery); + } + + @Override + public RisingwaveMacroState onCompletion( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doCompletion(traceId, authorization, RisingwaveCompletionCommand.DROP_ZFUNCTION_COMMAND); + return this; + } + + @Override + public RisingwaveMacroState onReady( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doReady(traceId, authorization, sql.length()); + + return null; + } + + @Override + public RisingwaveMacroState onError( + long traceId, + long authorization, + PgsqlFlushExFW flushEx) + { + handler.doFlushProxy(traceId, authorization, flushEx); + return this; + } + } +} diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java index c90c3899bd..565e094738 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveCompletionCommand.java @@ -24,6 +24,7 @@ public enum RisingwaveCompletionCommand ALTER_ZTABLE_COMMAND("ALTER_ZTABLE".getBytes()), DROP_ZTABLE_COMMAND("DROP_ZTABLE".getBytes()), DROP_ZVIEW_COMMAND("DROP_ZVIEW".getBytes()), + DROP_ZFUNCTION_COMMAND("DROP_ZFUNCTION".getBytes()), SHOW_COMMAND("SHOW_COMMAND".getBytes()); private final byte[] value; diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java index 6cf52583a3..3964a02142 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java @@ -53,6 +53,7 @@ import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZfunctionMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZtableMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveCreateZviewMacro; +import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZfunctionMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZtableMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveDropZviewMacro; import io.aklivity.zilla.runtime.binding.risingwave.internal.macro.RisingwaveMacroHandler; @@ -166,6 +167,7 @@ public final class RisingwaveProxyFactory implements RisingwaveStreamFactory clientTransforms.put(RisingwaveCommandType.ALTER_ZTABLE_COMMAND, this::decodeAlterZtableCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZTABLE_COMMAND, this::decodeDropZtableCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZVIEW_COMMAND, this::decodeDropZviewCommand); + clientTransforms.put(RisingwaveCommandType.DROP_ZFUNCTION_COMMAND, this::decodeDropZfunctionCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZSTREAMS_COMMAND, this::decodeShowCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZTABLES_COMMAND, this::decodeShowCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZVIEWS_COMMAND, this::decodeShowCommand); @@ -1877,6 +1879,28 @@ private void decodeDropZviewCommand( server.macroState.onStarted(traceId, authorization); } + private void decodeDropZfunctionCommand( + PgsqlServer server, + long traceId, + long authorization, + String statement) + { + if (server.macroState == null) + { + // TODO: Enhance multiple streams + final Drop command = parser.parseDrop(statement).get(0); + + RisingwaveDropZfunctionMacro machine = new RisingwaveDropZfunctionMacro( + RisingwaveBindingConfig.INTERNAL_SCHEMA, + statement, + command, + server.macroHandler); + server.macroState = machine.start(); + } + + server.macroState.onStarted(traceId, authorization); + } + private void decodeShowCommand( PgsqlServer server, long traceId, diff --git a/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java b/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java index c3f6f92284..605cd812b1 100644 --- a/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java +++ b/incubator/binding-risingwave/src/test/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/ProxyIT.java @@ -252,6 +252,16 @@ public void shouldCreateZfunction() throws Exception k3po.finish(); } + @Test + @Configuration("proxy.yaml") + @Specification({ + "${pgsql}/drop.zfunction/client", + "${effective}/drop.zfunction/server" }) + public void shouldDropZfunction() throws Exception + { + k3po.finish(); + } + @Test @Configuration("proxy.risingwave.yaml") @Specification({ From 2244de1beabdcb71ac3d2d85021871e874c3cbb0 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 13:42:35 -0800 Subject: [PATCH 06/10] WIP --- .../binding/pgsql/parser/PgsqlParser.java | 2 +- .../effective/show.zfunctions/client.rpt | 34 ++++++++----------- .../effective/show.zfunctions/server.rpt | 34 ++++++++----------- .../streams/pgsql/show.zfunctions/client.rpt | 19 +++++------ .../streams/pgsql/show.zfunctions/server.rpt | 19 +++++------ .../RisingwaveShowZfunctionCommandMacro.java | 2 +- .../stream/RisingwaveProxyFactory.java | 1 + .../src/main/zilla/protocol.idl | 2 +- 8 files changed, 52 insertions(+), 61 deletions(-) diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 5f53688d30..6d35805734 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -171,7 +171,7 @@ public void syntaxError( RecognitionException e) { //Only for debugging - System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); + //System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); } @Override diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/client.rpt index c9f5a33479..fec623029c 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/client.rpt @@ -67,31 +67,27 @@ read zilla:data.ext ${pgsql:dataEx() read [0x00 0x02] # Field Count [0x00 0x00 0x00 0x06] # Length [0x63 0x69 0x74 0x69 0x65 0x73] # Data - [0x00 0x00 0x01 0xda] # Length - "CREATE ZFUNCTION test_command(\n" # Data + [0x00 0x00 0x01 0x99] # Length + "CREATE ZFUNCTION send_payment(\n" " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "RETURNS TABLE(\n" - " type VARCHAR,\n" + " event VARCHAR,\n" " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "LANGUAGE SQL AS $$\n" " SELECT\n" " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$" + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" + "WITH (\n" + " EVENTS = 'app_events'\n" + ");" [0x00] diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/server.rpt index cd087b99c4..4036448786 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/show.zfunctions/server.rpt @@ -69,31 +69,27 @@ write zilla:data.ext ${pgsql:dataEx() write [0x00 0x02] # Field Count [0x00 0x00 0x00 0x06] # Length [0x63 0x69 0x74 0x69 0x65 0x73] # Data - [0x00 0x00 0x01 0xda] # Length - "CREATE ZFUNCTION test_command(\n" # Data + [0x00 0x00 0x01 0x99] # Length + "CREATE ZFUNCTION send_payment(\n" " user_id VARCHAR,\n" - " random VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "RETURNS TABLE(\n" - " type VARCHAR,\n" + " event VARCHAR,\n" " user_id VARCHAR,\n" - " request_id VARCHAR,\n" - " amount DOUBLE PRECISION,\n" - " notes VARCHAR)\n" + " amount DOUBLE PRECISION)\n" "LANGUAGE SQL AS $$\n" " SELECT\n" " CASE\n" - " WHEN balance >= amount THEN \"PaymentSent\"\n" - " ELSE \"PaymentDeclined\"\n" - " END AS type,\n" - " user_id,\n" - " request_id,\n" - " amount,\n" - " balance,\n" - " notes\n" - " FROM balance as b WHERE b.user_id = user_id;\n" - "$$" + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + " ELSE 'PaymentDeclined'\n" + " END AS event,\n" + " args.user_id,\n" + " args.amount\n" + " FROM balance WHERE user_id = args.user_id;\n" + "$$\n" + "WITH (\n" + " EVENTS = 'app_events'\n" + ");" [0x00] write flush diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/client.rpt index 084e854178..a98047ec38 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/client.rpt @@ -76,11 +76,11 @@ read advised zilla:flush ${pgsql:flushEx() .format("TEXT") .build() .column() - .name("Link") + .name("Events") .tableOid(0) .index(0) .typeOid(1043) - .length(4) + .length(6) .modifier(-1) .format("TEXT") .build() @@ -94,16 +94,15 @@ read zilla:data.ext ${pgsql:dataEx() .build()} read [0x00 0x05] # Field Count [0x00 0x00 0x00 0x0c] # Length - "test_command" # Data - [0x00 0x00 0x00 0x47] # Length - "user_id VARCHAR, random VARCHAR, " # Data - "amount DOUBLE PRECISION, notes VARCHAR" - [0x00 0x00 0x00 0x59] # Length - "type VARCHAR, user_id VARCHAR, request_id VARCHAR, " # Data - "amount DOUBLE PRECISION, notes VARCHAR" + "send_payment" # Data + [0x00 0x00 0x00 0x28] # Length + "user_id VARCHAR, amount DOUBLE PRECISION" # Data + [0x00 0x00 0x00 0x37] # Length + "event VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION" # Data [0x00 0x00 0x00 0x03] # Length "SQL" # Data - [0xff 0xff 0xff 0xff] # Length + [0x00 0x00 0x00 0x0a] # Length + "app_events" # Data read advised zilla:flush ${pgsql:flushEx() .typeId(zilla:id("pgsql")) diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/server.rpt index d76cfe68f9..42526d5fd2 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/pgsql/show.zfunctions/server.rpt @@ -79,11 +79,11 @@ write advise zilla:flush ${pgsql:flushEx() .format("TEXT") .build() .column() - .name("Link") + .name("Events") .tableOid(0) .index(0) .typeOid(1043) - .length(4) + .length(6) .modifier(-1) .format("TEXT") .build() @@ -98,16 +98,15 @@ write zilla:data.ext ${pgsql:dataEx() .build()} write [0x00 0x05] # Field Count [0x00 0x00 0x00 0x0c] # Length - "test_command" # Data - [0x00 0x00 0x00 0x47] # Length - "user_id VARCHAR, random VARCHAR, " # Data - "amount DOUBLE PRECISION, notes VARCHAR" - [0x00 0x00 0x00 0x59] # Length - "type VARCHAR, user_id VARCHAR, request_id VARCHAR, " # Data - "amount DOUBLE PRECISION, notes VARCHAR" + "send_payment" # Data + [0x00 0x00 0x00 0x28] # Length + "user_id VARCHAR, amount DOUBLE PRECISION" # Data + [0x00 0x00 0x00 0x37] # Length + "event VARCHAR, user_id VARCHAR, amount DOUBLE PRECISION" # Data [0x00 0x00 0x00 0x03] # Length "SQL" # Data - [0xff 0xff 0xff 0xff] # Length + [0x00 0x00 0x00 0x0a] # Length + "app_events" # Data write flush diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveShowZfunctionCommandMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveShowZfunctionCommandMacro.java index 95c0e2f5bc..4c519ec888 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveShowZfunctionCommandMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveShowZfunctionCommandMacro.java @@ -31,7 +31,7 @@ public class RisingwaveShowZfunctionCommandMacro private final String sql; private final RisingwaveMacroHandler handler; - private final List columns = List.of("Name", "Arguments", "Return Type", "Language", "Link"); + private final List columns = List.of("Name", "Arguments", "Return Type", "Language", "Events"); public RisingwaveShowZfunctionCommandMacro( PgsqlParser parser, diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java index 3964a02142..ae4b442a62 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java @@ -911,6 +911,7 @@ public void doZfunctionRow( .arguments(arguments) .returnType(returnType) .language("SQL") + .events(command.events()) .build(); doAppData(client, traceId, authorization, FLAGS_COMP, diff --git a/incubator/binding-risingwave/src/main/zilla/protocol.idl b/incubator/binding-risingwave/src/main/zilla/protocol.idl index 5d83d81c92..87a095b5d2 100644 --- a/incubator/binding-risingwave/src/main/zilla/protocol.idl +++ b/incubator/binding-risingwave/src/main/zilla/protocol.idl @@ -25,7 +25,7 @@ scope protocol string32 arguments; string32 returnType; string32 language; - string32 link = null; + string32 events; } } } From b3dc0ce719f9e3c0737fb91cb0c3bd0c3476299b Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 16:28:03 -0800 Subject: [PATCH 07/10] WIP --- .../binding/pgsql/parser/PgsqlParser.java | 2 +- .../listener/SqlCreateZfunctionListener.java | 2 +- .../binding/pgsql/parser/PgsqlParserTest.java | 58 ++++++++++--------- .../macro/RisingwaveCreateZfunctionMacro.java | 3 +- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 6d35805734..5f53688d30 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -171,7 +171,7 @@ public void syntaxError( RecognitionException e) { //Only for debugging - //System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); + System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); } @Override diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java index 1e85221630..d75c31b56b 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/listener/SqlCreateZfunctionListener.java @@ -144,7 +144,7 @@ public void enterFrom_clause( public void enterWhere_clause( PostgreSqlParser.Where_clauseContext ctx) { - whereClause = tokens.getText(ctx); + whereClause = tokens.getText(ctx).replaceAll("(?i)\\bwhere\\s", ""); } @Override diff --git a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java index 41759aa106..bfcb952b4d 100644 --- a/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java +++ b/incubator/binding-pgsql/src/test/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParserTest.java @@ -453,56 +453,62 @@ public void shouldParseShowZtables() public void shouldParseCreateZfunctionWithTableReturnType() { String sql = """ - CREATE ZFUNCTION send_payment_handler( - user_id VARCHAR, - amount DOUBLE PRECISION) + CREATE ZFUNCTION send_payment_handler( + user_id VARCHAR, + request_id VARCHAR, + amount DOUBLE PRECISION, + notes VARCHAR) RETURNS TABLE( - event VARCHAR, - user_id VARCHAR, - amount DOUBLE PRECISION) + event VARCHAR, + user_id VARCHAR, + request_id VARCHAR, + amount DOUBLE PRECISION, + notes VARCHAR) LANGUAGE SQL AS $$ - SELECT - CASE - WHEN balance >= args.amount THEN "PaymentSent" - ELSE "PaymentDeclined" - END AS event, + SELECT + CASE + WHEN balance >= args.amount THEN 'PaymentSent' + ELSE 'PaymentDeclined' + END AS event, args.user_id, - args.amount - FROM balance WHERE user_id = args.user_id; + args.request_id, + args.amount, + args.notes + FROM balance b WHERE b.user_id = args.user_id; $$ WITH( EVENTS = 'app_events' - ) + ); """; CreateZfunction function = parser.parseCreateZfunction(sql); assertNotNull(function); assertEquals("send_payment_handler", function.name()); - assertEquals(2, function.arguments().size()); + assertEquals(4, function.arguments().size()); assertEquals("user_id", function.arguments().get(0).name()); assertEquals("VARCHAR", function.arguments().get(0).type()); - assertEquals("amount", function.arguments().get(1).name()); - assertEquals("DOUBLE PRECISION", function.arguments().get(1).type()); + assertEquals("request_id", function.arguments().get(1).name()); + assertEquals("VARCHAR", function.arguments().get(1).type()); - assertEquals(3, function.returnTypes().size()); + assertEquals(5, function.returnTypes().size()); assertEquals("event", function.returnTypes().get(0).name()); assertEquals("VARCHAR", function.returnTypes().get(0).type()); assertEquals("user_id", function.returnTypes().get(1).name()); assertEquals("VARCHAR", function.returnTypes().get(1).type()); - assertEquals("amount", function.returnTypes().get(2).name()); - assertEquals("DOUBLE PRECISION", function.returnTypes().get(2).type()); + assertEquals("request_id", function.returnTypes().get(2).name()); + assertEquals("VARCHAR", function.returnTypes().get(2).type()); Select select = function.select(); assertNotNull(select); - assertEquals(3, select.columns().size()); + assertEquals(5, select.columns().size()); assertEquals("CASE\n" + - " WHEN balance >= args.amount THEN \"PaymentSent\"\n" + - " ELSE \"PaymentDeclined\"\n" + + " WHEN balance >= args.amount THEN 'PaymentSent'\n" + + " ELSE 'PaymentDeclined'\n" + " END AS event", select.columns().get(0)); assertEquals("args.user_id", select.columns().get(1)); - assertEquals("args.amount", select.columns().get(2)); - assertEquals("balance", select.from()); - assertEquals("WHERE user_id = args.user_id", select.whereClause()); + assertEquals("args.request_id", select.columns().get(2)); + assertEquals("balance b", select.from()); + assertEquals("b.user_id = args.user_id", select.whereClause()); assertEquals("app_events", function.events()); } diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java index 4d7a7790da..77075f9f02 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/macro/RisingwaveCreateZfunctionMacro.java @@ -195,7 +195,8 @@ public void onStarted( if (select.whereClause() != null) { - join = String.format("%s ON %s", join, select.whereClause().replace("args", "c")); + join = String.format("%s ON %s", join, select.whereClause() + .replace("args", "c")); } } From 42430cc5d70065088834d0f300f815dde9fc4263 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 16:56:25 -0800 Subject: [PATCH 08/10] Disable debug printing --- .../zilla/runtime/binding/pgsql/parser/PgsqlParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java index 5f53688d30..6d35805734 100644 --- a/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java +++ b/incubator/binding-pgsql/src/main/java/io/aklivity/zilla/runtime/binding/pgsql/parser/PgsqlParser.java @@ -171,7 +171,7 @@ public void syntaxError( RecognitionException e) { //Only for debugging - System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); + //System.err.println("Syntax error at line " + line + ":" + charPositionInLine + " " + msg); } @Override From e8fdf424872ed0839df46922db23f27f7b6a43c4 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Wed, 22 Jan 2025 17:00:52 -0800 Subject: [PATCH 09/10] Fix scripts --- .../risingwave/streams/effective/create.zfunction/client.rpt | 2 +- .../risingwave/streams/effective/create.zfunction/server.rpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt index 2ce14de612..50b6757583 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/client.rpt @@ -78,7 +78,7 @@ write "CREATE MATERIALIZED VIEW zb_catalog.send_payment_events AS\n" " ELSE 'PaymentDeclined'\n" " END AS event, c.user_id, c.amount\n" " FROM zb_catalog.send_payment_commands c\n" - " JOIN balance ON WHERE user_id = c.user_id;" + " JOIN balance ON user_id = c.user_id;" [0x00] read advised zilla:flush ${pgsql:flushEx() diff --git a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt index 44ea65629b..a1c2fe7afc 100644 --- a/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt +++ b/incubator/binding-risingwave.spec/src/main/scripts/io/aklivity/zilla/specs/binding/risingwave/streams/effective/create.zfunction/server.rpt @@ -80,7 +80,7 @@ read "CREATE MATERIALIZED VIEW zb_catalog.send_payment_events AS\n" " ELSE 'PaymentDeclined'\n" " END AS event, c.user_id, c.amount\n" " FROM zb_catalog.send_payment_commands c\n" - " JOIN balance ON WHERE user_id = c.user_id;" + " JOIN balance ON user_id = c.user_id;" [0x00] write advise zilla:flush ${pgsql:flushEx() From 500477ca5940a3340f78590941cbdf3f1d752f1c Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Thu, 23 Jan 2025 07:44:38 -0800 Subject: [PATCH 10/10] Remove zstream command --- .../risingwave/internal/config/RisingwaveCommandType.java | 1 - .../risingwave/internal/stream/RisingwaveProxyFactory.java | 1 - 2 files changed, 2 deletions(-) diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java index 8b97e14cdc..9ce8f64738 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/config/RisingwaveCommandType.java @@ -30,7 +30,6 @@ public enum RisingwaveCommandType DROP_ZVIEW_COMMAND("DROP ZVIEW".getBytes()), DROP_ZFUNCTION_COMMAND("DROP ZFUNCTION".getBytes()), SHOW_ZTABLES_COMMAND("SHOW ZTABLES".getBytes()), - SHOW_ZSTREAMS_COMMAND("SHOW ZSTREAMS".getBytes()), SHOW_ZVIEWS_COMMAND("SHOW ZVIEWS".getBytes()), SHOW_ZFUNCTIONS_COMMAND("SHOW ZFUNCTIONS".getBytes()), UNKNOWN_COMMAND("UNKNOWN".getBytes()); diff --git a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java index ae4b442a62..d61492d92c 100644 --- a/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java +++ b/incubator/binding-risingwave/src/main/java/io/aklivity/zilla/runtime/binding/risingwave/internal/stream/RisingwaveProxyFactory.java @@ -168,7 +168,6 @@ public final class RisingwaveProxyFactory implements RisingwaveStreamFactory clientTransforms.put(RisingwaveCommandType.DROP_ZTABLE_COMMAND, this::decodeDropZtableCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZVIEW_COMMAND, this::decodeDropZviewCommand); clientTransforms.put(RisingwaveCommandType.DROP_ZFUNCTION_COMMAND, this::decodeDropZfunctionCommand); - clientTransforms.put(RisingwaveCommandType.SHOW_ZSTREAMS_COMMAND, this::decodeShowCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZTABLES_COMMAND, this::decodeShowCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZVIEWS_COMMAND, this::decodeShowCommand); clientTransforms.put(RisingwaveCommandType.SHOW_ZFUNCTIONS_COMMAND, this::decodeShowZfunctionCommand);