Sort places by count instead of time

This commit is contained in:
Ming Ming 2022-08-29 01:43:32 +08:00
parent ac6b3586d3
commit 075d208fff
3 changed files with 24 additions and 22 deletions

View file

@ -8,19 +8,19 @@ import 'package:nc_photos/location_util.dart' as location_util;
class LocationGroup { class LocationGroup {
const LocationGroup( const LocationGroup(
this.place, this.countryCode, this.latest, this.latestFileId); this.place, this.countryCode, this.count, this.latestFileId);
@override @override
toString() => "$runtimeType {" toString() => "$runtimeType {"
"place: $place, " "place: $place, "
"countryCode: $countryCode, " "countryCode: $countryCode, "
"latest: $latest, " "count: $count, "
"latestFileId: $latestFileId, " "latestFileId: $latestFileId, "
"}"; "}";
final String place; final String place;
final String countryCode; final String countryCode;
final DateTime latest; final int count;
final int latestFileId; final int latestFileId;
} }
@ -60,14 +60,15 @@ class ListLocationGroup {
final countryCodeResult = <LocationGroup>[]; final countryCodeResult = <LocationGroup>[];
for (final r in account.roots) { for (final r in account.roots) {
final latest = db.accountFiles.bestDateTime.max(); final latest = db.accountFiles.bestDateTime.max();
final nameQ = final count = db.imageLocations.rowId.count();
_buildQuery(db, dbAccount, r, latest, db.imageLocations.name); final nameQ = _buildQuery(
db, dbAccount, r, latest, count, db.imageLocations.name);
try { try {
nameResult.addAll(await nameQ nameResult.addAll(await nameQ
.map((r) => LocationGroup( .map((r) => LocationGroup(
r.read(db.imageLocations.name)!, r.read(db.imageLocations.name)!,
r.read(db.imageLocations.countryCode)!, r.read(db.imageLocations.countryCode)!,
r.read(latest), r.read(count),
r.read(db.files.fileId)!, r.read(db.files.fileId)!,
)) ))
.get()); .get());
@ -75,14 +76,14 @@ class ListLocationGroup {
_log.shout("[call] Failed while query name group", e, stackTrace); _log.shout("[call] Failed while query name group", e, stackTrace);
} }
final admin1Q = final admin1Q = _buildQuery(
_buildQuery(db, dbAccount, r, latest, db.imageLocations.admin1); db, dbAccount, r, latest, count, db.imageLocations.admin1);
try { try {
admin1Result.addAll(await admin1Q admin1Result.addAll(await admin1Q
.map((r) => LocationGroup( .map((r) => LocationGroup(
r.read(db.imageLocations.admin1)!, r.read(db.imageLocations.admin1)!,
r.read(db.imageLocations.countryCode)!, r.read(db.imageLocations.countryCode)!,
r.read(latest), r.read(count),
r.read(db.files.fileId)!, r.read(db.files.fileId)!,
)) ))
.get()); .get());
@ -90,14 +91,14 @@ class ListLocationGroup {
_log.shout("[call] Failed while query admin1 group", e, stackTrace); _log.shout("[call] Failed while query admin1 group", e, stackTrace);
} }
final admin2Q = final admin2Q = _buildQuery(
_buildQuery(db, dbAccount, r, latest, db.imageLocations.admin2); db, dbAccount, r, latest, count, db.imageLocations.admin2);
try { try {
admin2Result.addAll(await admin2Q admin2Result.addAll(await admin2Q
.map((r) => LocationGroup( .map((r) => LocationGroup(
r.read(db.imageLocations.admin2)!, r.read(db.imageLocations.admin2)!,
r.read(db.imageLocations.countryCode)!, r.read(db.imageLocations.countryCode)!,
r.read(latest), r.read(count),
r.read(db.files.fileId)!, r.read(db.files.fileId)!,
)) ))
.get()); .get());
@ -106,12 +107,12 @@ class ListLocationGroup {
} }
final countryCodeQ = _buildQuery( final countryCodeQ = _buildQuery(
db, dbAccount, r, latest, db.imageLocations.countryCode); db, dbAccount, r, latest, count, db.imageLocations.countryCode);
try { try {
countryCodeResult.addAll(await countryCodeQ.map((r) { countryCodeResult.addAll(await countryCodeQ.map((r) {
final cc = r.read(db.imageLocations.countryCode)!; final cc = r.read(db.imageLocations.countryCode)!;
return LocationGroup(location_util.alpha2CodeToName(cc) ?? cc, cc, return LocationGroup(location_util.alpha2CodeToName(cc) ?? cc, cc,
r.read(latest), r.read(db.files.fileId)!); r.read(count), r.read(db.files.fileId)!);
}).get()); }).get());
} catch (e, stackTrace) { } catch (e, stackTrace) {
_log.shout( _log.shout(
@ -131,6 +132,7 @@ class ListLocationGroup {
sql.Account dbAccount, sql.Account dbAccount,
String dir, String dir,
sql.Expression<DateTime> latest, sql.Expression<DateTime> latest,
sql.Expression<int> count,
sql.GeneratedColumn<String?> groupColumn, sql.GeneratedColumn<String?> groupColumn,
) { ) {
final query = db.selectOnly(db.imageLocations).join([ final query = db.selectOnly(db.imageLocations).join([
@ -142,7 +144,7 @@ class ListLocationGroup {
]); ]);
if (identical(groupColumn, db.imageLocations.countryCode)) { if (identical(groupColumn, db.imageLocations.countryCode)) {
query query
..addColumns([db.imageLocations.countryCode, latest, db.files.fileId]) ..addColumns([db.imageLocations.countryCode, count, db.files.fileId])
..groupBy([db.imageLocations.countryCode], ..groupBy([db.imageLocations.countryCode],
having: db.accountFiles.bestDateTime.equalsExp(latest)); having: db.accountFiles.bestDateTime.equalsExp(latest));
} else { } else {
@ -150,7 +152,7 @@ class ListLocationGroup {
..addColumns([ ..addColumns([
groupColumn, groupColumn,
db.imageLocations.countryCode, db.imageLocations.countryCode,
latest, count,
db.files.fileId db.files.fileId
]) ])
..groupBy([groupColumn, db.imageLocations.countryCode], ..groupBy([groupColumn, db.imageLocations.countryCode],

View file

@ -191,11 +191,11 @@ class _PlacesBrowserState extends State<PlacesBrowser> {
} }
int sorter(LocationGroup a, LocationGroup b) { int sorter(LocationGroup a, LocationGroup b) {
final latestCompare = b.latest.compareTo(a.latest); final compare = b.count.compareTo(a.count);
if (latestCompare == 0) { if (compare == 0) {
return a.place.compareTo(b.place); return a.place.compareTo(b.place);
} else { } else {
return latestCompare; return compare;
} }
} }

View file

@ -269,11 +269,11 @@ class _SearchLandingState extends State<SearchLanding> {
void _transformLocations(LocationGroupResult locations) { void _transformLocations(LocationGroupResult locations) {
_locationItems = locations.name _locationItems = locations.name
.sorted((a, b) { .sorted((a, b) {
final latestCompare = b.latest.compareTo(a.latest); final compare = b.count.compareTo(a.count);
if (latestCompare == 0) { if (compare == 0) {
return a.place.compareTo(b.place); return a.place.compareTo(b.place);
} else { } else {
return latestCompare; return compare;
} }
}) })
.map((e) => _LandingLocationItem( .map((e) => _LandingLocationItem(