mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2025-12-24 04:09:49 +00:00
Improve speed of getUnreadByConversationAndMarkRead query
This commit is contained in:
94
ts/test-node/sql/migration_1540_test.node.ts
Normal file
94
ts/test-node/sql/migration_1540_test.node.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
// Copyright 2025 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
import { assert } from 'chai';
|
||||
|
||||
import { type WritableDB } from '../../sql/Interface.std.js';
|
||||
import { sql, sqlFragment } from '../../sql/util.std.js';
|
||||
import { createDB, explain, updateToVersion } from './helpers.node.js';
|
||||
|
||||
describe('SQL/updateToSchemaVersion1540', () => {
|
||||
let db: WritableDB;
|
||||
|
||||
beforeEach(() => {
|
||||
db = createDB();
|
||||
updateToVersion(db, 1540);
|
||||
});
|
||||
afterEach(() => {
|
||||
db.close();
|
||||
});
|
||||
|
||||
const CORE_UPDATE_QUERY = sqlFragment`
|
||||
UPDATE messages
|
||||
INDEXED BY messages_conversationId_expirationStartTimestamp
|
||||
SET
|
||||
expirationStartTimestamp = 342342
|
||||
WHERE
|
||||
conversationId = 'conversationId' AND
|
||||
type IN ('incoming', 'poll-terminate') AND
|
||||
hasExpireTimer IS 1 AND
|
||||
received_at < 1304923
|
||||
`;
|
||||
|
||||
const UPDATE_WHEN_NULL_START_QUERY = sqlFragment`
|
||||
${CORE_UPDATE_QUERY} AND
|
||||
expirationStartTimestamp IS NULL
|
||||
`;
|
||||
const UPDATE_WHEN_LATE_START_QUERY = sqlFragment`
|
||||
${CORE_UPDATE_QUERY} AND
|
||||
expirationStartTimestamp > 342342
|
||||
`;
|
||||
|
||||
it('uses index efficiently with null start + storyId condition', () => {
|
||||
const detail = explain(
|
||||
db,
|
||||
sql`
|
||||
${UPDATE_WHEN_NULL_START_QUERY} AND
|
||||
storyId is NULL
|
||||
`
|
||||
);
|
||||
|
||||
assert.strictEqual(
|
||||
detail,
|
||||
'SEARCH messages USING INDEX messages_conversationId_expirationStartTimestamp' +
|
||||
' (conversationId=? AND expirationStartTimestamp=?)'
|
||||
);
|
||||
});
|
||||
it('uses index efficiently with null start + no storyId condition', () => {
|
||||
const detail = explain(
|
||||
db,
|
||||
sql`
|
||||
${UPDATE_WHEN_NULL_START_QUERY}
|
||||
`
|
||||
);
|
||||
|
||||
assert.strictEqual(
|
||||
detail,
|
||||
'SEARCH messages USING INDEX messages_conversationId_expirationStartTimestamp' +
|
||||
' (conversationId=? AND expirationStartTimestamp=?)'
|
||||
);
|
||||
});
|
||||
|
||||
it('uses index efficiently with lateStart query and no storyId condition', () => {
|
||||
const detail = explain(db, sql`${UPDATE_WHEN_LATE_START_QUERY}`);
|
||||
|
||||
assert.strictEqual(
|
||||
detail,
|
||||
'SEARCH messages USING INDEX messages_conversationId_expirationStartTimestamp' +
|
||||
' (conversationId=? AND expirationStartTimestamp>?)'
|
||||
);
|
||||
});
|
||||
|
||||
it('uses index efficiently with lateStart query and storyId condition', () => {
|
||||
const detail = explain(
|
||||
db,
|
||||
sql`${UPDATE_WHEN_LATE_START_QUERY} AND
|
||||
storyId is NULL`
|
||||
);
|
||||
|
||||
assert.strictEqual(
|
||||
detail,
|
||||
'SEARCH messages USING INDEX messages_conversationId_expirationStartTimestamp' +
|
||||
' (conversationId=? AND expirationStartTimestamp>?)'
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user