Skip to content

Commit 273b447

Browse files
authored
Merge pull request #534 from rusq/i533
Transformer unaccounted for channels with no threads
2 parents 57c0338 + 2f03d13 commit 273b447

File tree

4 files changed

+112
-0
lines changed

4 files changed

+112
-0
lines changed

internal/chunk/backend/dbase/repository/dbmessage_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,8 @@ var (
495495
tmC = slack.Message{Msg: slack.Msg{Timestamp: "125.000", ThreadTimestamp: testThreadID, Text: "C"}}
496496
tmD = slack.Message{Msg: slack.Msg{Timestamp: "126.000", ThreadTimestamp: testThreadID, Text: "D"}}
497497
tmC_ = slack.Message{Msg: slack.Msg{Timestamp: "125.000", ThreadTimestamp: testThreadID, Text: "C'"}}
498+
499+
mNoThread = slack.Message{Msg: slack.Msg{Timestamp: "130.000", Text: "No thread"}}
498500
// special additional message to test the reference counter
499501
tmXExtra = slack.Message{Msg: slack.Msg{Timestamp: "127.000", ThreadTimestamp: "127.000", Text: "X"}}
500502
// thread lead that has replies deleted
@@ -510,6 +512,8 @@ var (
510512
// these go into chunk 1
511513
dbtmXExtra = must(NewDBMessage(1, 0, testChannelID, &tmXExtra))
512514
dbtmYExtra = must(NewDBMessage(1, 0, testChannelID, &tmYExtra))
515+
516+
dbmNoThread = must(NewDBMessage(1, 0, testChannelID, &mNoThread))
513517
)
514518

515519
// mkThreadSetupFn creates a utility function that sets up the thread messages.
@@ -827,6 +831,56 @@ func Test_messageRepository_CountUnfinished(t *testing.T) {
827831
}
828832
},
829833
},
834+
{
835+
name: "channel with no threads #533, unfinished",
836+
fields: fields{
837+
genericRepository: genericRepository[DBMessage]{DBMessage{}},
838+
},
839+
args: args{
840+
ctx: t.Context(),
841+
conn: testConn(t),
842+
sessionID: 1,
843+
channelID: "C123",
844+
},
845+
prepFn: func(t *testing.T, conn PrepareExtContext) {
846+
prepChunkWithFinal(
847+
testChunk{typeID: chunk.CMessages, channelID: "C123", final: false},
848+
)(t, conn)
849+
mr := NewMessageRepository()
850+
if err := mr.Insert(t.Context(), conn,
851+
dbmNoThread,
852+
); err != nil {
853+
t.Fatalf("insert: %v", err)
854+
}
855+
},
856+
want: 0,
857+
wantErr: true, // no rows in the result set. Set will be empty until there's a "final" message chunk for the channel.
858+
},
859+
{
860+
name: "channel with no threads #533, finished",
861+
fields: fields{
862+
genericRepository: genericRepository[DBMessage]{DBMessage{}},
863+
},
864+
args: args{
865+
ctx: t.Context(),
866+
conn: testConn(t),
867+
sessionID: 1,
868+
channelID: "C123",
869+
},
870+
prepFn: func(t *testing.T, conn PrepareExtContext) {
871+
prepChunkWithFinal(
872+
testChunk{typeID: chunk.CMessages, channelID: "C123", final: true},
873+
)(t, conn)
874+
mr := NewMessageRepository()
875+
if err := mr.Insert(t.Context(), conn,
876+
dbmNoThread,
877+
); err != nil {
878+
t.Fatalf("insert: %v", err)
879+
}
880+
},
881+
want: 0,
882+
wantErr: false,
883+
},
830884
}
831885
for _, tt := range tests {
832886
t.Run(tt.name, func(t *testing.T) {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
-- +goose Up
2+
-- +goose StatementBegin
3+
DROP VIEW IF EXISTS V_CHANNEL_THREADS;
4+
-- +goose StatementEnd
5+
-- +goose StatementBegin
6+
CREATE VIEW IF NOT EXISTS V_CHANNEL_THREADS AS
7+
WITH MSG AS (SELECT ID, CHANNEL_ID, IS_PARENT, CHUNK_ID
8+
FROM MESSAGE
9+
EXCEPT
10+
SELECT ID, CHANNEL_ID, IS_PARENT, CHUNK_ID
11+
FROM MESSAGE
12+
WHERE LATEST_REPLY = '0000000000.000000' -- EMPTY THREADS
13+
AND IS_PARENT = TRUE)
14+
SELECT C.SESSION_ID, M.CHANNEL_ID, SUM(M.IS_PARENT) THREADS
15+
FROM MSG M
16+
JOIN CHUNK C ON C.ID = M.CHUNK_ID
17+
WHERE 1 = 1
18+
AND C.TYPE_ID = 0
19+
AND EXISTS (
20+
-- CHANNEL MUST BE FINISHED
21+
SELECT 1
22+
FROM CHUNK MC
23+
WHERE MC.CHANNEL_ID = C.CHANNEL_ID
24+
AND MC.TYPE_ID = C.TYPE_ID
25+
AND MC.SESSION_ID = C.SESSION_ID
26+
AND FINAL)
27+
GROUP BY M.CHANNEL_ID
28+
-- +goose StatementEnd
29+
30+
-- +goose Down
31+
-- +goose StatementBegin
32+
DROP VIEW IF EXISTS V_CHANNEL_THREADS;
33+
-- +goose StatementEnd
34+
-- +goose StatementBegin
35+
CREATE VIEW IF NOT EXISTS V_CHANNEL_THREADS AS
36+
WITH MSG AS (SELECT ID, CHANNEL_ID, IS_PARENT, CHUNK_ID
37+
FROM MESSAGE
38+
WHERE IS_PARENT = TRUE
39+
EXCEPT
40+
SELECT ID, CHANNEL_ID, IS_PARENT, CHUNK_ID
41+
FROM MESSAGE
42+
WHERE LATEST_REPLY = '0000000000.000000' -- EMPTY THREADS
43+
AND IS_PARENT = TRUE)
44+
SELECT C.SESSION_ID, M.CHANNEL_ID, SUM(M.IS_PARENT) THREADS
45+
FROM MSG M
46+
JOIN CHUNK C ON C.ID = M.CHUNK_ID
47+
WHERE IS_PARENT = TRUE
48+
AND C.TYPE_ID = 0
49+
AND EXISTS (
50+
-- CHANNEL MUST BE FINISHED
51+
SELECT 1
52+
FROM CHUNK MC
53+
WHERE MC.CHANNEL_ID = C.CHANNEL_ID
54+
AND MC.TYPE_ID = C.TYPE_ID
55+
AND MC.SESSION_ID = C.SESSION_ID
56+
AND FINAL)
57+
GROUP BY M.CHANNEL_ID;
58+
-- +goose StatementEnd
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)