| 611 | * Session-aware when message_context table is available, falls back to id-based ordering. |
| 612 | */ |
| 613 | export function getSearchMessageContext( |
| 614 | db: DatabaseAdapter, |
| 615 | messageIds: number[], |
| 616 | contextBefore: number = 2, |
| 617 | contextAfter: number = 2 |
| 618 | ): MappedMessage[] { |
| 619 | if (messageIds.length === 0) return [] |
| 620 | |
| 621 | const contextIds = new Set<number>() |
| 622 | |
| 623 | const hasSessionData = |
| 624 | hasTable(db, 'message_context') && |
| 625 | (db.prepare('SELECT 1 FROM message_context LIMIT 1').get() as Record<string, unknown> | undefined) !== undefined |
| 626 | |
| 627 | for (const messageId of messageIds) { |
| 628 | contextIds.add(messageId) |
| 629 | |
| 630 | if (hasSessionData) { |
| 631 | const sessionRow = db.prepare('SELECT segment_id FROM message_context WHERE message_id = ?').get(messageId) as |
| 632 | | { segment_id: number } |
| 633 | | undefined |
| 634 | |
| 635 | if (sessionRow) { |
| 636 | if (contextBefore > 0) { |
| 637 | const rows = db |
| 638 | .prepare( |
| 639 | `SELECT mc.message_id as id FROM message_context mc |
| 640 | WHERE mc.segment_id = ? AND mc.message_id < ? |
| 641 | ORDER BY mc.message_id DESC LIMIT ?` |
| 642 | ) |
| 643 | .all(sessionRow.segment_id, messageId, contextBefore) as { id: number }[] |
| 644 | rows.forEach((r) => contextIds.add(r.id)) |
| 645 | } |
| 646 | if (contextAfter > 0) { |
| 647 | const rows = db |
| 648 | .prepare( |
| 649 | `SELECT mc.message_id as id FROM message_context mc |
| 650 | WHERE mc.segment_id = ? AND mc.message_id > ? |
| 651 | ORDER BY mc.message_id ASC LIMIT ?` |
| 652 | ) |
| 653 | .all(sessionRow.segment_id, messageId, contextAfter) as { id: number }[] |
| 654 | rows.forEach((r) => contextIds.add(r.id)) |
| 655 | } |
| 656 | continue |
| 657 | } |
| 658 | } |
| 659 | |
| 660 | if (contextBefore > 0) { |
| 661 | const rows = db |
| 662 | .prepare('SELECT id FROM message WHERE id < ? ORDER BY id DESC LIMIT ?') |
| 663 | .all(messageId, contextBefore) as { id: number }[] |
| 664 | rows.forEach((r) => contextIds.add(r.id)) |
| 665 | } |
| 666 | if (contextAfter > 0) { |
| 667 | const rows = db |
| 668 | .prepare('SELECT id FROM message WHERE id > ? ORDER BY id ASC LIMIT ?') |
| 669 | .all(messageId, contextAfter) as { id: number }[] |
| 670 | rows.forEach((r) => contextIds.add(r.id)) |