diff --git a/src/AggregateFunctions/AggregateFunctionSequenceNextNode.cpp b/src/AggregateFunctions/AggregateFunctionSequenceNextNode.cpp index b185859e00e..47279aa882d 100644 --- a/src/AggregateFunctions/AggregateFunctionSequenceNextNode.cpp +++ b/src/AggregateFunctions/AggregateFunctionSequenceNextNode.cpp @@ -94,9 +94,7 @@ AggregateFunctionPtr createAggregateFunctionSequenceNextNode(const std::string & void registerAggregateFunctionSequenceNextNode(AggregateFunctionFactory & factory) { - AggregateFunctionProperties properties = { .returns_default_when_only_null = true, .is_order_dependent = false }; - - factory.registerFunction("sequenceNextNode", { createAggregateFunctionSequenceNextNode, properties }); + factory.registerFunction("sequenceNextNode", { createAggregateFunctionSequenceNextNode }); } } diff --git a/src/AggregateFunctions/AggregateFunctionSequenceNextNode.h b/src/AggregateFunctions/AggregateFunctionSequenceNextNode.h index 44a2018980a..3fbb481c19a 100644 --- a/src/AggregateFunctions/AggregateFunctionSequenceNextNode.h +++ b/src/AggregateFunctions/AggregateFunctionSequenceNextNode.h @@ -158,7 +158,7 @@ public: // aggregated events: [A -> B -> C] // events to find: [C -> D] // [C -> D] is not matched to 'A -> B -> C' so that it returns null. - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } void insert(Data & a, const Node * v, Arena * arena) const diff --git a/tests/queries/0_stateless/01656_sequence_next_node.reference b/tests/queries/0_stateless/01656_sequence_next_node.reference index 540e5bdfb5a..ecb39686bfa 100644 --- a/tests/queries/0_stateless/01656_sequence_next_node.reference +++ b/tests/queries/0_stateless/01656_sequence_next_node.reference @@ -118,3 +118,135 @@ (1, B->A->A) 4 A (1, B->A->A) 5 \N (1, B->A->A) 6 \N +(0, A) id >= 10 10 B +(0, A) id >= 10 10 C +(0, A) id >= 10 10 D +(0, A) id >= 10 10 B +(0, A) id >= 10 10 B +(0, A) id >= 10 10 A +(0, A) 1 B +(0, A) 2 B +(0, A) 3 B +(0, A) 4 A +(0, A) 5 B +(0, A) 6 B +(0, B) 1 C +(0, B) 2 D +(0, B) 3 \N +(0, B) 4 C +(0, B) 5 A +(0, B) 6 A +(0, C) 1 D +(0, C) 2 \N +(0, C) 3 \N +(0, C) 4 \N +(0, C) 5 \N +(0, C) 6 \N +(0, D) 1 \N +(0, D) 2 C +(0, D) 3 \N +(0, D) 4 \N +(0, D) 5 \N +(0, D) 6 \N +(0, E) 1 \N +(0, E) 2 \N +(0, E) 3 \N +(0, E) 4 \N +(0, E) 5 \N +(0, E) 6 \N +(1, A) 1 \N +(1, A) 2 \N +(1, A) 3 \N +(1, A) 4 A +(1, A) 5 B +(1, A) 6 B +(1, B) 1 A +(1, B) 2 A +(1, B) 3 A +(1, B) 4 A +(1, B) 5 A +(1, B) 6 A +(1, C) 1 B +(1, C) 2 D +(1, C) 3 \N +(1, C) 4 B +(1, C) 5 A +(1, C) 6 B +(1, D) 1 C +(1, D) 2 B +(1, D) 3 \N +(1, D) 4 \N +(1, D) 5 \N +(1, D) 6 \N +(1, E) 1 \N +(1, E) 2 \N +(1, E) 3 \N +(1, E) 4 \N +(1, E) 5 \N +(1, E) 6 \N +(0, A->B) 1 C +(0, A->B) 2 D +(0, A->B) 3 \N +(0, A->B) 4 C +(0, A->B) 5 A +(0, A->B) 6 A +(0, A->C) 1 \N +(0, A->C) 2 \N +(0, A->C) 3 \N +(0, A->C) 4 \N +(0, A->C) 5 \N +(0, A->C) 6 \N +(0, B->A) 1 \N +(0, B->A) 2 \N +(0, B->A) 3 \N +(0, B->A) 4 \N +(0, B->A) 5 C +(0, B->A) 6 B +(1, A->B) 1 \N +(1, A->B) 2 \N +(1, A->B) 3 \N +(1, A->B) 4 \N +(1, A->B) 5 A +(1, A->B) 6 A +(1, A->C) 1 \N +(1, A->C) 2 \N +(1, A->C) 3 \N +(1, A->C) 4 \N +(1, A->C) 5 \N +(1, A->C) 6 \N +(1, B->A) 1 \N +(1, B->A) 2 \N +(1, B->A) 3 \N +(1, B->A) 4 A +(1, B->A) 5 \N +(1, B->A) 6 B +(0, A->A->B) 1 \N +(0, A->A->B) 2 \N +(0, A->A->B) 3 \N +(0, A->A->B) 4 C +(0, A->A->B) 5 \N +(0, A->A->B) 6 \N +(0, B->A->A) 1 \N +(0, B->A->A) 2 \N +(0, B->A->A) 3 \N +(0, B->A->A) 4 \N +(0, B->A->A) 5 \N +(0, B->A->A) 6 \N +(1, A->A->B) 1 \N +(1, A->A->B) 2 \N +(1, A->A->B) 3 \N +(1, A->A->B) 4 \N +(1, A->A->B) 5 \N +(1, A->A->B) 6 \N +(1, B->A->A) 1 \N +(1, B->A->A) 2 \N +(1, B->A->A) 3 \N +(1, B->A->A) 4 A +(1, B->A->A) 5 \N +(1, B->A->A) 6 \N +(0, A) id >= 10 10 B +(0, A) id >= 10 10 C +(0, A) id >= 10 10 D +(0, A) id >= 10 10 B +(0, A) id >= 10 10 B +(0, A) id >= 10 10 A diff --git a/tests/queries/0_stateless/01656_sequence_next_node.sql b/tests/queries/0_stateless/01656_sequence_next_node.sql index b11a5c7bc0e..e5a89da7341 100644 --- a/tests/queries/0_stateless/01656_sequence_next_node.sql +++ b/tests/queries/0_stateless/01656_sequence_next_node.sql @@ -1,3 +1,70 @@ +DROP TABLE IF EXISTS test_sequenceNextNode_Nullable; + +CREATE TABLE iF NOT EXISTS test_sequenceNextNode_Nullable (dt DateTime, id int, action Nullable(String)) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; + +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',1,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',1,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',1,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',1,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',2,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',2,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',2,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',2,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',3,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',3,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',4,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:05',4,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',5,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',5,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',5,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',5,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',6,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',6,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',6,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',6,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:05',6,'C'); + +SELECT '(0, A)', id, sequenceNextNode(0)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, B)', id, sequenceNextNode(0)(dt, action, action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, C)', id, sequenceNextNode(0)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, D)', id, sequenceNextNode(0)(dt, action, action = 'D') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, E)', id, sequenceNextNode(0)(dt, action, action = 'E') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, A)', id, sequenceNextNode(1)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, B)', id, sequenceNextNode(1)(dt, action, action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, C)', id, sequenceNextNode(1)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, D)', id, sequenceNextNode(1)(dt, action, action = 'D') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, E)', id, sequenceNextNode(1)(dt, action, action = 'E') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, A->C)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'C') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, B->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, A->C)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'C') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, B->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, A->A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(0, B->A->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, A->A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; +SELECT '(1, B->A->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; + +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',10,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',10,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',10,NULL); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',10,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',10,'D'); + +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'C') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'D', action = 'C') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'C', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; + +DROP TABLE IF EXISTS test_sequenceNextNode_Nullable; + +-- The same testcases for a non-null type. + DROP TABLE IF EXISTS test_sequenceNextNode; CREATE TABLE iF NOT EXISTS test_sequenceNextNode (dt DateTime, id int, action String) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; @@ -27,25 +94,37 @@ INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',6,'A'); INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',6,'B'); INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:05',6,'C'); -SELECT '(0, A)', id, sequenceNextNode(0)(dt, action, action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, B)', id, sequenceNextNode(0)(dt, action, action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, C)', id, sequenceNextNode(0)(dt, action, action = 'C') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, D)', id, sequenceNextNode(0)(dt, action, action = 'D') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, E)', id, sequenceNextNode(0)(dt, action, action = 'E') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, A)', id, sequenceNextNode(1)(dt, action, action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, B)', id, sequenceNextNode(1)(dt, action, action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, C)', id, sequenceNextNode(1)(dt, action, action = 'C') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, D)', id, sequenceNextNode(1)(dt, action, action = 'D') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, E)', id, sequenceNextNode(1)(dt, action, action = 'E') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, A->C)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'C') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, B->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, A->C)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'C') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, B->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, A->A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(0, B->A->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, A->A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test GROUP BY id ORDER BY id; -SELECT '(1, B->A->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test GROUP BY id ORDER BY id; +SELECT '(0, A)', id, sequenceNextNode(0)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, B)', id, sequenceNextNode(0)(dt, action, action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, C)', id, sequenceNextNode(0)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, D)', id, sequenceNextNode(0)(dt, action, action = 'D') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, E)', id, sequenceNextNode(0)(dt, action, action = 'E') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, A)', id, sequenceNextNode(1)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, B)', id, sequenceNextNode(1)(dt, action, action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, C)', id, sequenceNextNode(1)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, D)', id, sequenceNextNode(1)(dt, action, action = 'D') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, E)', id, sequenceNextNode(1)(dt, action, action = 'E') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, A->C)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'C') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, B->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, A->C)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'C') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, B->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, A->A->B)', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(0, B->A->A)', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, A->A->B)', id, sequenceNextNode(1)(dt, action, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; +SELECT '(1, B->A->A)', id, sequenceNextNode(1)(dt, action, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; + +INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',10,'A'); +INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',10,'B'); +INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',10,'C'); +INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',10,'D'); + +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'A') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(0)(dt, action, action = 'B', action = 'C') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'C') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'D', action = 'C') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; +SELECT '(0, A) id >= 10', id, sequenceNextNode(1)(dt, action, action = 'C', action = 'B') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; DROP TABLE IF EXISTS test_sequenceNextNode;