feat(mobile): restore db merged asset query, lose filter param

This commit is contained in:
Penlane 2026-08-01 18:07:33 +02:00
parent 0bcb8fdecf
commit 93cf65b460

View file

@ -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;