improve tab reorder logic

This commit is contained in:
Fabian Freund
2025-07-17 21:59:33 +02:00
parent d41d56cbaf
commit 3c5bd4a8ad
9 changed files with 83 additions and 12 deletions
@@ -96,4 +96,11 @@ class ContainerDao extends DatabaseAccessor<TabDatabase>
) {
return db.orderKeyAfterTab(containerId: containerId, tabId: tabId);
}
SingleSelectable<String> generateOrderKeyBeforeTabId(
String? containerId,
String tabId,
) {
return db.orderKeyBeforeTab(containerId: containerId, tabId: tabId);
}
}
@@ -118,6 +118,18 @@ orderKeyAfterTab(:tab_id AS TEXT, :container_id AS TEXT OR NULL):
FROM ordered_table
WHERE id = :tab_id;
orderKeyBeforeTab(:tab_id AS TEXT, :container_id AS TEXT OR NULL):
WITH ordered_table AS (
SELECT id,
order_key,
LAG(order_key) OVER (ORDER BY order_key) AS prev_order_key
FROM tab
WHERE container_id IS :container_id
)
SELECT lexo_rank_reorder_before(order_key, prev_order_key)
FROM ordered_table
WHERE id = :tab_id;
queryTabsBasic WITH TabQueryResult:
WITH weights AS (
SELECT
@@ -1165,6 +1165,17 @@ abstract class _$TabDatabase extends GeneratedDatabase {
).map((QueryRow row) => row.read<String>('_c0'));
}
Selectable<String> orderKeyBeforeTab({
String? containerId,
required String tabId,
}) {
return customSelect(
'WITH ordered_table AS (SELECT id, order_key, LAG(order_key)OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS prev_order_key FROM tab WHERE container_id IS ?1) SELECT lexo_rank_reorder_before(order_key, prev_order_key) AS _c0 FROM ordered_table WHERE id = ?2',
variables: [Variable<String>(containerId), Variable<String>(tabId)],
readsFrom: {tab},
).map((QueryRow row) => row.read<String>('_c0'));
}
Selectable<TabQueryResult> queryTabsBasic({required String query}) {
return customSelect(
'WITH weights AS (SELECT 10.0 AS title_weight, 5.0 AS url_weight) SELECT t.id, t.title, CAST(t.url AS TEXT) AS url, t.url AS clean_url, bm25(tab_fts, weights.title_weight, weights.url_weight) AS weighted_rank FROM tab_fts AS fts INNER JOIN tab AS t ON t."rowid" = fts."rowid" CROSS JOIN weights WHERE fts.title LIKE ?1 OR fts.url LIKE ?1 ORDER BY weighted_rank ASC, t.timestamp DESC',