From 93cf65b46075c2d3381e4f4c2af2f3df6fdc6a3c Mon Sep 17 00:00:00 2001 From: Penlane Date: Sat, 1 Aug 2026 18:07:33 +0200 Subject: [PATCH] feat(mobile): restore db merged asset query, lose filter param --- .../entities/merged_asset.drift | 227 ++++++++---------- 1 file changed, 104 insertions(+), 123 deletions(-) diff --git a/mobile/lib/infrastructure/entities/merged_asset.drift b/mobile/lib/infrastructure/entities/merged_asset.drift index a3fc9f6330..d0321ab1ef 100644 --- a/mobile/lib/infrastructure/entities/merged_asset.drift +++ b/mobile/lib/infrastructure/entities/merged_asset.drift @@ -4,71 +4,123 @@ import 'local_asset.entity.dart'; import 'local_album.entity.dart'; import 'local_album_asset.entity.dart'; -mergedAsset(:filter AS INTEGER): -SELECT * FROM ( +mergedAsset: +SELECT + rae.id as remote_id, + (SELECT lae.id FROM local_asset_entity lae WHERE lae.checksum = rae.checksum LIMIT 1) as local_id, + rae.name, + rae."type", + rae.created_at as created_at, + rae.updated_at, + rae.width, + rae.height, + rae.duration_ms, + rae.is_favorite, + rae.thumb_hash, + rae.checksum, + rae.owner_id, + rae.live_photo_video_id, + 0 as orientation, + rae.stack_id, + NULL as i_cloud_id, + NULL as latitude, + NULL as longitude, + NULL as adjustmentTime, + rae.is_edited, + 0 as playback_style, + rae.uploaded_at +FROM + remote_asset_entity rae +LEFT JOIN + stack_entity se ON rae.stack_id = se.id +WHERE + rae.deleted_at IS NULL + AND rae.visibility = 0 -- timeline visibility + AND rae.owner_id IN :user_ids + AND ( + rae.stack_id IS NULL + OR rae.id = se.primary_asset_id + ) + +UNION ALL + +SELECT + NULL as remote_id, + lae.id as local_id, + lae.name, + lae."type", + lae.created_at as created_at, + lae.updated_at, + lae.width, + lae.height, + lae.duration_ms, + lae.is_favorite, + NULL as thumb_hash, + lae.checksum, + NULL as owner_id, + NULL as live_photo_video_id, + lae.orientation, + NULL as stack_id, + lae.i_cloud_id, + lae.latitude, + lae.longitude, + lae.adjustment_time, + 0 as is_edited, + lae.playback_style, + NULL as uploaded_at +FROM + local_asset_entity lae +WHERE NOT EXISTS ( + SELECT 1 FROM remote_asset_entity rae WHERE rae.checksum = lae.checksum AND rae.owner_id IN :user_ids +) +AND EXISTS ( + SELECT 1 FROM local_album_asset_entity laa + INNER JOIN local_album_entity la on laa.album_id = la.id + WHERE laa.asset_id = lae.id AND la.backup_selection = 0 -- selected +) +AND NOT EXISTS ( + SELECT 1 FROM local_album_asset_entity laa + INNER JOIN local_album_entity la on laa.album_id = la.id + WHERE laa.asset_id = lae.id AND la.backup_selection = 2 -- excluded +) +ORDER BY created_at DESC +LIMIT $limit; + +mergedBucket(:group_by AS INTEGER): +SELECT + COUNT(*) as asset_count, + bucket_date +FROM +( SELECT - rae.id as remote_id, - (SELECT lae.id FROM local_asset_entity lae WHERE lae.checksum = rae.checksum LIMIT 1) as local_id, - rae.name, - rae."type", - rae.created_at as created_at, - rae.updated_at, - rae.width, - rae.height, - rae.duration_ms, - rae.is_favorite, - rae.thumb_hash, - rae.checksum, - rae.owner_id, - rae.live_photo_video_id, - 0 as orientation, - rae.stack_id, - NULL as i_cloud_id, - NULL as latitude, - NULL as longitude, - NULL as adjustmentTime, - rae.is_edited, - 0 as playback_style, - rae.uploaded_at + CASE + WHEN :group_by = 0 THEN COALESCE( + STRFTIME('%Y-%m-%d', rae.local_date_time), + STRFTIME('%Y-%m-%d', rae.created_at, 'localtime') + ) + WHEN :group_by = 1 THEN COALESCE( + STRFTIME('%Y-%m', rae.local_date_time), + STRFTIME('%Y-%m', rae.created_at, 'localtime') + ) + END as bucket_date FROM remote_asset_entity rae LEFT JOIN - stack_entity se ON rae.stack_id = se.id + stack_entity se ON rae.stack_id = se.id WHERE rae.deleted_at IS NULL AND rae.visibility = 0 -- timeline visibility - AND rae.owner_id IN :user_ids + AND rae.owner_id in :user_ids AND ( rae.stack_id IS NULL OR rae.id = se.primary_asset_id ) - UNION ALL - SELECT - NULL as remote_id, - lae.id as local_id, - lae.name, - lae."type", - lae.created_at as created_at, - lae.updated_at, - lae.width, - lae.height, - lae.duration_ms, - lae.is_favorite, - NULL as thumb_hash, - lae.checksum, - NULL as owner_id, - NULL as live_photo_video_id, - lae.orientation, - NULL as stack_id, - lae.i_cloud_id, - lae.latitude, - lae.longitude, - lae.adjustment_time, - 0 as is_edited, - lae.playback_style, - NULL as uploaded_at + CASE + WHEN :group_by = 0 THEN STRFTIME('%Y-%m-%d', lae.created_at, 'localtime') + WHEN :group_by = 1 THEN STRFTIME('%Y-%m', lae.created_at, 'localtime') + END as bucket_date FROM local_asset_entity lae WHERE NOT EXISTS ( @@ -84,77 +136,6 @@ SELECT * FROM ( INNER JOIN local_album_entity la on laa.album_id = la.id WHERE laa.asset_id = lae.id AND la.backup_selection = 2 -- excluded ) -) AS merged -WHERE - :filter = 0 -- default - OR (:filter = 1 AND merged.remote_id IS NOT NULL AND merged.local_id IS NULL) -- remote only - OR (:filter = 2 AND merged.remote_id IS NULL AND merged.local_id IS NOT NULL) -- local only -ORDER BY created_at DESC -LIMIT $limit; - -mergedBucket(:group_by AS INTEGER, :filter AS INTEGER): -SELECT - COUNT(*) as asset_count, - bucket_date -FROM ( - SELECT * FROM ( - SELECT - rae.id as remote_id, - CASE - WHEN :filter IN (1, 2) THEN - (SELECT lae.id FROM local_asset_entity lae WHERE lae.checksum = rae.checksum LIMIT 1) - ELSE NULL - END as local_id, - CASE - WHEN :group_by = 0 THEN COALESCE( - STRFTIME('%Y-%m-%d', rae.local_date_time), - STRFTIME('%Y-%m-%d', rae.created_at, 'localtime') - ) - WHEN :group_by = 1 THEN COALESCE( - STRFTIME('%Y-%m', rae.local_date_time), - STRFTIME('%Y-%m', rae.created_at, 'localtime') - ) - END as bucket_date - FROM - remote_asset_entity rae - LEFT JOIN - stack_entity se ON rae.stack_id = se.id - WHERE - rae.deleted_at IS NULL - AND rae.visibility = 0 -- timeline visibility - AND rae.owner_id in :user_ids - AND ( - rae.stack_id IS NULL - OR rae.id = se.primary_asset_id - ) - UNION ALL - SELECT - NULL as remote_id, - lae.id as local_id, - CASE - WHEN :group_by = 0 THEN STRFTIME('%Y-%m-%d', lae.created_at, 'localtime') - WHEN :group_by = 1 THEN STRFTIME('%Y-%m', lae.created_at, 'localtime') - END as bucket_date - FROM - local_asset_entity lae - WHERE NOT EXISTS ( - SELECT 1 FROM remote_asset_entity rae WHERE rae.checksum = lae.checksum AND rae.owner_id IN :user_ids - ) - AND EXISTS ( - SELECT 1 FROM local_album_asset_entity laa - INNER JOIN local_album_entity la on laa.album_id = la.id - WHERE laa.asset_id = lae.id AND la.backup_selection = 0 -- selected - ) - AND NOT EXISTS ( - SELECT 1 FROM local_album_asset_entity laa - INNER JOIN local_album_entity la on laa.album_id = la.id - WHERE laa.asset_id = lae.id AND la.backup_selection = 2 -- excluded - ) - ) AS merged - WHERE - :filter = 0 -- default - OR (:filter = 1 AND merged.remote_id IS NOT NULL AND merged.local_id IS NULL) -- remote only - OR (:filter = 2 AND merged.remote_id IS NULL AND merged.local_id IS NOT NULL) -- local only ) GROUP BY bucket_date ORDER BY bucket_date DESC;