From 1403961a09187a42a3076a2e9976ee2951fbb4b0 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Thu, 12 Dec 2024 21:32:26 +0000 Subject: [PATCH] Add view to fix deduplication --- README.md | 1 - backend/sync_server/src/database.rs | 43 +++++++++---------- .../migrations/20241207143519_bootstrap.sql | 15 +++++++ 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 848373b..0be0983 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ - add clap - add auth middleware - add request logs -- the is deleted logic is bad and we'll always read the previous version instead of the deleted - CI for: - publish reconcile - cross-platform build server diff --git a/backend/sync_server/src/database.rs b/backend/sync_server/src/database.rs index 901c844..5373f56 100644 --- a/backend/sync_server/src/database.rs +++ b/backend/sync_server/src/database.rs @@ -64,23 +64,16 @@ impl Database { DocumentVersionWithoutContent, r#" select - d.vault_id, - d.document_id as "document_id: uuid::Uuid", - d.version_id, + vault_id, + document_id as "document_id: uuid::Uuid", + version_id, created_date as "created_date: chrono::DateTime", updated_date as "updated_date: chrono::DateTime", - d.relative_path, - d.is_binary, - d.is_deleted - from documents d - where d.vault_id = ? - and d.is_deleted = false - and d.version_id = ( - SELECT MAX(sub.version_id) - FROM documents sub - WHERE sub.vault_id = d.vault_id - AND sub.document_id = d.document_id - ) + relative_path, + is_binary, + is_deleted + from latest_documents + where is_deleted = false and vault_id = ? "#, vault, ); @@ -112,10 +105,8 @@ impl Database { content, is_binary, is_deleted - from documents + from latest_documents where vault_id = ? and document_id = ? - ORDER BY version_id DESC - LIMIT 1 "#, vault, document @@ -148,10 +139,8 @@ impl Database { content, is_binary, is_deleted - from documents + from latest_documents where vault_id = ? and relative_path = ? and is_deleted = false - ORDER BY version_id DESC - LIMIT 1 "#, vault, relative_path @@ -207,7 +196,17 @@ impl Database { ) -> Result<()> { let query = sqlx::query!( r#" - insert into documents (vault_id, document_id, version_id, created_date, updated_date, relative_path, content, is_binary, is_deleted) + insert into documents ( + vault_id, + document_id, + version_id, + created_date, + updated_date, + relative_path, + content, + is_binary, + is_deleted + ) values (?, ?, ?, ?, ?, ?, ?, ?, ?) "#, version.vault_id, diff --git a/backend/sync_server/src/database/migrations/20241207143519_bootstrap.sql b/backend/sync_server/src/database/migrations/20241207143519_bootstrap.sql index 95dab9d..91e4b78 100644 --- a/backend/sync_server/src/database/migrations/20241207143519_bootstrap.sql +++ b/backend/sync_server/src/database/migrations/20241207143519_bootstrap.sql @@ -10,3 +10,18 @@ CREATE TABLE IF NOT EXISTS documents ( is_deleted BOOLEAN NOT NULL, PRIMARY KEY (vault_id, document_id, version_id) ); + +CREATE VIEW IF NOT EXISTS latest_documents AS +SELECT d.* +FROM documents d +INNER JOIN ( + SELECT vault_id, document_id, MAX(version_id) AS max_version_id + FROM documents + GROUP BY vault_id, document_id +) max_versions +ON d.vault_id = max_versions.vault_id +AND d.document_id = max_versions.document_id +AND d.version_id = max_versions.max_version_id; + +CREATE INDEX IF NOT EXISTS idx_documents_vault_doc +ON documents (vault_id, document_id);