Add view to fix deduplication

This commit is contained in:
Andras Schmelczer 2024-12-12 21:32:26 +00:00
parent 3065edba37
commit 1403961a09
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C
3 changed files with 36 additions and 23 deletions

View file

@ -35,7 +35,6 @@
- add clap - add clap
- add auth middleware - add auth middleware
- add request logs - add request logs
- the is deleted logic is bad and we'll always read the previous version instead of the deleted
- CI for: - CI for:
- publish reconcile - publish reconcile
- cross-platform build server - cross-platform build server

View file

@ -64,23 +64,16 @@ impl Database {
DocumentVersionWithoutContent, DocumentVersionWithoutContent,
r#" r#"
select select
d.vault_id, vault_id,
d.document_id as "document_id: uuid::Uuid", document_id as "document_id: uuid::Uuid",
d.version_id, version_id,
created_date as "created_date: chrono::DateTime<Utc>", created_date as "created_date: chrono::DateTime<Utc>",
updated_date as "updated_date: chrono::DateTime<Utc>", updated_date as "updated_date: chrono::DateTime<Utc>",
d.relative_path, relative_path,
d.is_binary, is_binary,
d.is_deleted is_deleted
from documents d from latest_documents
where d.vault_id = ? where is_deleted = false and 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
)
"#, "#,
vault, vault,
); );
@ -112,10 +105,8 @@ impl Database {
content, content,
is_binary, is_binary,
is_deleted is_deleted
from documents from latest_documents
where vault_id = ? and document_id = ? where vault_id = ? and document_id = ?
ORDER BY version_id DESC
LIMIT 1
"#, "#,
vault, vault,
document document
@ -148,10 +139,8 @@ impl Database {
content, content,
is_binary, is_binary,
is_deleted is_deleted
from documents from latest_documents
where vault_id = ? and relative_path = ? and is_deleted = false where vault_id = ? and relative_path = ? and is_deleted = false
ORDER BY version_id DESC
LIMIT 1
"#, "#,
vault, vault,
relative_path relative_path
@ -207,7 +196,17 @@ impl Database {
) -> Result<()> { ) -> Result<()> {
let query = sqlx::query!( let query = sqlx::query!(
r#" 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 (?, ?, ?, ?, ?, ?, ?, ?, ?) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
"#, "#,
version.vault_id, version.vault_id,

View file

@ -10,3 +10,18 @@ CREATE TABLE IF NOT EXISTS documents (
is_deleted BOOLEAN NOT NULL, is_deleted BOOLEAN NOT NULL,
PRIMARY KEY (vault_id, document_id, version_id) 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);