diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3ffbaba6..49bfb73b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -139,6 +139,12 @@ jobs: compile aggregation-query-test-iceberg-package.json compile aggregation-query-subscription-test-package.json + - example: canary-mutation + path: test-jobs/mutation-tests + tag: canary + test_commands: | + compile mutation-test-package.json + - example: canary-failures path: test-jobs/failure-tests tag: canary diff --git a/test-jobs/mutation-tests/mutation-test-package.json b/test-jobs/mutation-tests/mutation-test-package.json new file mode 100644 index 00000000..28125e17 --- /dev/null +++ b/test-jobs/mutation-tests/mutation-test-package.json @@ -0,0 +1,18 @@ +{ + "version": "1", + "enabled-engines": ["vertx", "postgres", "kafka", "flink"], + "script": { + "main": "sensors.sqrl" + }, + "engines": { + "flink" : { + "config" : { + "table.exec.source.idle-timeout": "5s" + } + } + }, + "test-runner": { + "delay-sec": 30, + "mutation-delay-sec": 1 + } +} diff --git a/test-jobs/mutation-tests/sensors.sqrl b/test-jobs/mutation-tests/sensors.sqrl new file mode 100644 index 00000000..c9270e02 --- /dev/null +++ b/test-jobs/mutation-tests/sensors.sqrl @@ -0,0 +1,29 @@ +/*+ engine(kafka) */ +CREATE TABLE SensorReading ( + sensor_id INT NOT NULL, + temperature FLOAT NOT NULL, + placement STRING NOT NULL, + event_time TIMESTAMP_LTZ(3) NOT NULL METADATA FROM 'timestamp' +) PARTITIONED BY (placement); + +/*+ engine(kafka) */ +CREATE TABLE SensorUpdate ( + sensor_id INT NOT NULL, + sensor_name STRING NOT NULL, + last_updated TIMESTAMP_LTZ(3) NOT NULL METADATA FROM 'timestamp', + PRIMARY KEY (sensor_id) NOT ENFORCED +); + +EXPORT SensorReading TO print.SensorReading; +EXPORT SensorUpdate TO print.SensorUpdate; + +EnrichedReading := SELECT r.*, u.sensor_name + FROM SensorReading r + LEFT JOIN SensorUpdate FOR SYSTEM_TIME AS OF r.event_time u + ON r.sensor_id = u.sensor_id + ORDER BY r.event_time ASC; + +EnrichedReadingByPlacement(placement STRING NOT NULL) := + SELECT * FROM EnrichedReading WHERE placement = :placement; + +EXPORT EnrichedReading TO print.EnrichedReading; diff --git a/test-jobs/mutation-tests/snapshots/Mutation_1_AddUpdates.snapshot b/test-jobs/mutation-tests/snapshots/Mutation_1_AddUpdates.snapshot new file mode 100644 index 00000000..9d6246f3 --- /dev/null +++ b/test-jobs/mutation-tests/snapshots/Mutation_1_AddUpdates.snapshot @@ -0,0 +1,16 @@ +{ + "data" : { + "update1" : { + "sensor_id" : 101, + "sensor_name" : "Living Room Sensor" + }, + "update2" : { + "sensor_id" : 111, + "sensor_name" : "Dining Room Sensor" + }, + "update3" : { + "sensor_id" : 121, + "sensor_name" : "Bathroom Room Sensor" + } + } +} \ No newline at end of file diff --git a/test-jobs/mutation-tests/snapshots/Mutation_2_AddReadings.snapshot b/test-jobs/mutation-tests/snapshots/Mutation_2_AddReadings.snapshot new file mode 100644 index 00000000..d3f7ec84 --- /dev/null +++ b/test-jobs/mutation-tests/snapshots/Mutation_2_AddReadings.snapshot @@ -0,0 +1,19 @@ +{ + "data" : { + "add1" : { + "sensor_id" : 101, + "temperature" : 23.5, + "placement" : "DOWNSTAIRS" + }, + "add2" : { + "sensor_id" : 101, + "temperature" : 33.5, + "placement" : "DOWNSTAIRS" + }, + "add3" : { + "sensor_id" : 111, + "temperature" : 13.5, + "placement" : "UPSTAIRS" + } + } +} \ No newline at end of file diff --git a/test-jobs/mutation-tests/snapshots/Query_EnrichedByPlacement.snapshot b/test-jobs/mutation-tests/snapshots/Query_EnrichedByPlacement.snapshot new file mode 100644 index 00000000..64bd0177 --- /dev/null +++ b/test-jobs/mutation-tests/snapshots/Query_EnrichedByPlacement.snapshot @@ -0,0 +1,15 @@ +{ + "data" : { + "EnrichedReadingByPlacement" : [ { + "sensor_id" : 101, + "temperature" : 23.5, + "placement" : "DOWNSTAIRS", + "sensor_name" : "Living Room Sensor" + }, { + "sensor_id" : 101, + "temperature" : 33.5, + "placement" : "DOWNSTAIRS", + "sensor_name" : "Living Room Sensor" + } ] + } +} \ No newline at end of file diff --git a/test-jobs/mutation-tests/snapshots/Query_EnrichedReadings.snapshot b/test-jobs/mutation-tests/snapshots/Query_EnrichedReadings.snapshot new file mode 100644 index 00000000..8f4fc113 --- /dev/null +++ b/test-jobs/mutation-tests/snapshots/Query_EnrichedReadings.snapshot @@ -0,0 +1,20 @@ +{ + "data" : { + "EnrichedReading" : [ { + "sensor_id" : 101, + "temperature" : 23.5, + "placement" : "DOWNSTAIRS", + "sensor_name" : "Living Room Sensor" + }, { + "sensor_id" : 101, + "temperature" : 33.5, + "placement" : "DOWNSTAIRS", + "sensor_name" : "Living Room Sensor" + }, { + "sensor_id" : 111, + "temperature" : 13.5, + "placement" : "UPSTAIRS", + "sensor_name" : "Dining Room Sensor" + } ] + } +} \ No newline at end of file diff --git a/test-jobs/mutation-tests/tests/Mutation_1_AddUpdates.graphql b/test-jobs/mutation-tests/tests/Mutation_1_AddUpdates.graphql new file mode 100644 index 00000000..0f08e97f --- /dev/null +++ b/test-jobs/mutation-tests/tests/Mutation_1_AddUpdates.graphql @@ -0,0 +1,23 @@ +mutation SensorUpdates { + update1: SensorUpdate(event: { + sensor_id: 101, + sensor_name: "Living Room Sensor" + }) { + sensor_id + sensor_name + } + update2: SensorUpdate(event: { + sensor_id: 111, + sensor_name: "Dining Room Sensor" + }) { + sensor_id + sensor_name + } + update3: SensorUpdate(event: { + sensor_id: 121, + sensor_name: "Bathroom Room Sensor" + }) { + sensor_id + sensor_name + } +} diff --git a/test-jobs/mutation-tests/tests/Mutation_2_AddReadings.graphql b/test-jobs/mutation-tests/tests/Mutation_2_AddReadings.graphql new file mode 100644 index 00000000..4db2da17 --- /dev/null +++ b/test-jobs/mutation-tests/tests/Mutation_2_AddReadings.graphql @@ -0,0 +1,29 @@ +mutation SensorReadings { + add1: SensorReading(event: { + sensor_id: 101, + temperature: 23.5, + placement: "DOWNSTAIRS" + }) { + sensor_id + temperature + placement + } + add2: SensorReading(event: { + sensor_id: 101, + temperature: 33.5 + placement: "DOWNSTAIRS" + }) { + sensor_id + temperature + placement + } + add3: SensorReading(event: { + sensor_id: 111, + temperature: 13.5 + placement: "UPSTAIRS" + }) { + sensor_id + temperature + placement + } +} diff --git a/test-jobs/mutation-tests/tests/Query_EnrichedByPlacement.graphql b/test-jobs/mutation-tests/tests/Query_EnrichedByPlacement.graphql new file mode 100644 index 00000000..7eb8216a --- /dev/null +++ b/test-jobs/mutation-tests/tests/Query_EnrichedByPlacement.graphql @@ -0,0 +1,8 @@ +query GetEnrichedReadingByPlacement { + EnrichedReadingByPlacement(placement: "DOWNSTAIRS", limit: 10, offset: 0) { + sensor_id + temperature + placement + sensor_name + } +} diff --git a/test-jobs/mutation-tests/tests/Query_EnrichedReadings.graphql b/test-jobs/mutation-tests/tests/Query_EnrichedReadings.graphql new file mode 100644 index 00000000..9333089d --- /dev/null +++ b/test-jobs/mutation-tests/tests/Query_EnrichedReadings.graphql @@ -0,0 +1,8 @@ +query GetEnrichedReadings { + EnrichedReading(limit: 10, offset: 0) { + sensor_id + temperature + placement + sensor_name + } +}