mirror of
https://github.com/immich-app/immich
synced 2025-11-14 17:36:12 +00:00
refactor: map query
This commit is contained in:
parent
d308d023c2
commit
5d722eef98
5 changed files with 78 additions and 51 deletions
|
|
@ -1,7 +1,9 @@
|
|||
import 'package:drift/drift.dart';
|
||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||
import 'package:immich_mobile/domain/models/map.model.dart';
|
||||
import 'package:immich_mobile/domain/services/map.service.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/exif.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
||||
import 'package:maplibre_gl/maplibre_gl.dart';
|
||||
import 'package:stream_transform/stream_transform.dart';
|
||||
|
|
@ -11,36 +13,44 @@ class DriftMapRepository extends DriftDatabaseRepository {
|
|||
|
||||
const DriftMapRepository(super._db) : _db = _db;
|
||||
|
||||
Stream<List<Marker>> watchMainMarker(
|
||||
List<String> userIds, {
|
||||
required LatLngBounds bounds,
|
||||
}) {
|
||||
final query = _db.remoteExifEntity.select().join([
|
||||
innerJoin(
|
||||
_db.remoteAssetEntity,
|
||||
_db.remoteAssetEntity.id.equalsExp(_db.remoteExifEntity.assetId),
|
||||
useColumns: false,
|
||||
),
|
||||
])
|
||||
..where(
|
||||
_db.remoteExifEntity.latitude.isNotNull() &
|
||||
_db.remoteExifEntity.longitude.isNotNull() &
|
||||
_db.remoteExifEntity.inBounds(bounds) &
|
||||
_db.remoteAssetEntity.visibility
|
||||
.equalsValue(AssetVisibility.timeline) &
|
||||
_db.remoteAssetEntity.deletedAt.isNull() &
|
||||
_db.remoteAssetEntity.ownerId.isIn(userIds),
|
||||
MapQuery remote(String ownerId) => _mapQueryBuilder(
|
||||
assetFilter: (row) =>
|
||||
row.deletedAt.isNull() &
|
||||
row.visibility.equalsValue(AssetVisibility.timeline) &
|
||||
row.ownerId.equals(ownerId),
|
||||
);
|
||||
|
||||
return query
|
||||
.map((row) => row.readTable(_db.remoteExifEntity).toMarker())
|
||||
.watch()
|
||||
.throttle(const Duration(seconds: 3));
|
||||
MapQuery favorite(String ownerId) => _mapQueryBuilder(
|
||||
assetFilter: (row) =>
|
||||
row.deletedAt.isNull() &
|
||||
row.isFavorite.equals(true) &
|
||||
row.ownerId.equals(ownerId),
|
||||
);
|
||||
|
||||
MapQuery locked(String userId) => _mapQueryBuilder(
|
||||
assetFilter: (row) =>
|
||||
row.deletedAt.isNull() &
|
||||
row.visibility.equalsValue(AssetVisibility.locked) &
|
||||
row.ownerId.equals(userId),
|
||||
);
|
||||
|
||||
MapQuery _mapQueryBuilder({
|
||||
Expression<bool> Function($RemoteAssetEntityTable row)? assetFilter,
|
||||
Expression<bool> Function($RemoteExifEntityTable row)? exifFilter,
|
||||
}) {
|
||||
return (
|
||||
markerSource: (bounds) => _watchMapMarker(
|
||||
assetFilter: assetFilter,
|
||||
exifFilter: exifFilter,
|
||||
bounds: bounds,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Stream<List<Marker>> watchRemoteAlbumMarker(
|
||||
String albumId, {
|
||||
required LatLngBounds bounds,
|
||||
Stream<List<Marker>> _watchMapMarker({
|
||||
Expression<bool> Function($RemoteAssetEntityTable row)? assetFilter,
|
||||
Expression<bool> Function($RemoteExifEntityTable row)? exifFilter,
|
||||
LatLngBounds? bounds,
|
||||
}) {
|
||||
final query = _db.remoteExifEntity.select().join([
|
||||
innerJoin(
|
||||
|
|
@ -48,20 +58,24 @@ class DriftMapRepository extends DriftDatabaseRepository {
|
|||
_db.remoteAssetEntity.id.equalsExp(_db.remoteExifEntity.assetId),
|
||||
useColumns: false,
|
||||
),
|
||||
leftOuterJoin(
|
||||
_db.remoteAlbumAssetEntity,
|
||||
_db.remoteAlbumAssetEntity.assetId.equalsExp(_db.remoteAssetEntity.id),
|
||||
useColumns: false,
|
||||
),
|
||||
])
|
||||
..where(
|
||||
_db.remoteExifEntity.latitude.isNotNull() &
|
||||
_db.remoteExifEntity.longitude.isNotNull() &
|
||||
_db.remoteExifEntity.inBounds(bounds) &
|
||||
_db.remoteAssetEntity.deletedAt.isNull() &
|
||||
_db.remoteAlbumAssetEntity.albumId.equals(albumId),
|
||||
_db.remoteExifEntity.longitude.isNotNull(),
|
||||
);
|
||||
|
||||
if (assetFilter != null) {
|
||||
query.where(assetFilter(_db.remoteAssetEntity));
|
||||
}
|
||||
|
||||
if (exifFilter != null) {
|
||||
query.where(exifFilter(_db.remoteExifEntity));
|
||||
}
|
||||
|
||||
if (bounds != null) {
|
||||
query.where(_db.remoteExifEntity.inBounds(bounds));
|
||||
}
|
||||
|
||||
return query
|
||||
.map((row) => row.readTable(_db.remoteExifEntity).toMarker())
|
||||
.watch()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue