Skip to content

Commit

Permalink
feat: by id queries
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasn committed May 5, 2024
1 parent 1a413a6 commit 33e80ba
Show file tree
Hide file tree
Showing 6 changed files with 308 additions and 92 deletions.
124 changes: 56 additions & 68 deletions lib/blocs/journal/journal_page_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,36 +84,17 @@ class JournalPageCubit extends Cubit<JournalPageState> {
);
}

if (showTasks) {
_db
.watchTasks(
starredStatuses: [true, false],
taskStatuses: state.taskStatuses,
)
.throttleTime(
const Duration(seconds: 1),
leading: false,
trailing: true,
)
.where(makeDuplicateFilter())
.listen((_) {
if (_isVisible) {
//refreshQuery();
}
});
} else {
_updateNotifications.updateStream
.throttleTime(
const Duration(seconds: 1),
leading: false,
trailing: true,
)
.listen((_) {
if (_isVisible) {
refreshQuery();
}
});
}
_updateNotifications.updateStream
.throttleTime(
const Duration(milliseconds: 500),
leading: false,
trailing: true,
)
.listen((_) {
if (_isVisible) {
refreshQuery();
}
});
}

static const selectedTaskStatusesKey = 'SELECTED_TASK_STATUSES';
Expand All @@ -132,6 +113,7 @@ class JournalPageCubit extends Cubit<JournalPageState> {
bool taskAsListView = true;

Set<String> _fullTextMatches = {};
Set<String> _lastIds = {};

Set<String> _selectedTaskStatuses = {
'OPEN',
Expand Down Expand Up @@ -224,7 +206,7 @@ class JournalPageCubit extends Cubit<JournalPageState> {
}

Future<void> persistTaskStatuses() async {
refreshQuery();
await refreshQuery();

await getIt<SettingsDb>().saveSettingsItem(
selectedTaskStatusesKey,
Expand All @@ -233,7 +215,7 @@ class JournalPageCubit extends Cubit<JournalPageState> {
}

Future<void> persistEntryTypes() async {
refreshQuery();
await refreshQuery();

await getIt<SettingsDb>().saveSettingsItem(
selectedEntryTypesKey,
Expand All @@ -252,12 +234,17 @@ class JournalPageCubit extends Cubit<JournalPageState> {

Future<void> setSearchString(String query) async {
_query = query;
refreshQuery();
await refreshQuery();
}

void refreshQuery() {
emitState();
state.pagingController.refresh();
Future<void> refreshQuery() async {
final newIds = (await _runQuery(0)).toSet();
if (!setEquals(_lastIds, newIds)) {
_lastIds = newIds;

emitState();
state.pagingController.refresh();
}
}

void updateVisibility(VisibilityInfo visibilityInfo) {
Expand All @@ -271,38 +258,7 @@ class JournalPageCubit extends Cubit<JournalPageState> {
Future<void> _fetchPage(int pageKey) async {
try {
final start = DateTime.now();
final types = state.selectedEntryTypes.toList();

await _fts5Search();

final fullTextMatches = _fullTextMatches.toList();
final ids = _query.isNotEmpty ? fullTextMatches : null;

final starredEntriesOnly =
_filters.contains(DisplayFilter.starredEntriesOnly);
final privateEntriesOnly =
_filters.contains(DisplayFilter.privateEntriesOnly);
final flaggedEntriesOnly =
_filters.contains(DisplayFilter.flaggedEntriesOnly);

final newItems = showTasks
? await _db.getTasksIds(
ids: ids,
starredStatuses: starredEntriesOnly ? [true] : [true, false],
taskStatuses: _selectedTaskStatuses.toList(),
limit: _pageSize,
offset: pageKey,
)
: await _db.getJournalEntityIds(
types: types,
ids: ids,
starredStatuses: starredEntriesOnly ? [true] : [true, false],
privateStatuses: privateEntriesOnly ? [true] : [true, false],
flaggedStatuses: flaggedEntriesOnly ? [1] : [1, 0],
limit: _pageSize,
offset: pageKey,
);

final newItems = await _runQuery(pageKey);
final isLastPage = newItems.length < _pageSize;

if (isLastPage) {
Expand All @@ -320,6 +276,38 @@ class JournalPageCubit extends Cubit<JournalPageState> {
}
}

Future<List<String>> _runQuery(int pageKey) async {
final types = state.selectedEntryTypes.toList();
await _fts5Search();
final fullTextMatches = _fullTextMatches.toList();
final ids = _query.isNotEmpty ? fullTextMatches : null;

final starredEntriesOnly =
_filters.contains(DisplayFilter.starredEntriesOnly);
final privateEntriesOnly =
_filters.contains(DisplayFilter.privateEntriesOnly);
final flaggedEntriesOnly =
_filters.contains(DisplayFilter.flaggedEntriesOnly);

return showTasks
? await _db.getTasksIds(
ids: ids,
starredStatuses: starredEntriesOnly ? [true] : [true, false],
taskStatuses: _selectedTaskStatuses.toList(),
limit: _pageSize,
offset: pageKey,
)
: await _db.getJournalEntityIds(
types: types,
ids: ids,
starredStatuses: starredEntriesOnly ? [true] : [true, false],
privateStatuses: privateEntriesOnly ? [true] : [true, false],
flaggedStatuses: flaggedEntriesOnly ? [1] : [1, 0],
limit: _pageSize,
offset: pageKey,
);
}

@override
Future<void> close() async {
state.pagingController.dispose();
Expand Down
74 changes: 57 additions & 17 deletions lib/database/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ class JournalDb extends _$JournalDb {
int limit = 500,
int offset = 0,
}) async {
final res = await _selectJournalEntities(
return _selectJournalEntityIds(
types: types,
starredStatuses: starredStatuses,
privateStatuses: privateStatuses,
Expand All @@ -279,7 +279,6 @@ class JournalDb extends _$JournalDb {
limit: limit,
offset: offset,
).get();
return res.map((e) => e.id).toList();
}

Selectable<JournalDbEntity> _selectJournalEntities({
Expand Down Expand Up @@ -313,6 +312,37 @@ class JournalDb extends _$JournalDb {
}
}

Selectable<String> _selectJournalEntityIds({
required List<String> types,
required List<bool> starredStatuses,
required List<bool> privateStatuses,
required List<int> flaggedStatuses,
required List<String>? ids,
int limit = 500,
int offset = 0,
}) {
if (ids != null) {
return filteredJournalIds2(
types,
ids,
starredStatuses,
privateStatuses,
flaggedStatuses,
limit,
offset,
);
} else {
return filteredJournalIds(
types,
starredStatuses,
privateStatuses,
flaggedStatuses,
limit,
offset,
);
}
}

Stream<List<JournalEntity>> watchJournalEntitiesByTag({
required String tagId,
required DateTime rangeStart,
Expand Down Expand Up @@ -362,34 +392,44 @@ class JournalDb extends _$JournalDb {
int limit = 500,
int offset = 0,
}) async {
final res = await _selectTasks(
return _selectTaskIds(
starredStatuses: starredStatuses,
taskStatuses: taskStatuses,
ids: ids,
limit: limit,
offset: offset,
).get();
return res.map((e) => e.id).toList();
}

Future<List<JournalEntity>> getTasks({
Selectable<JournalDbEntity> _selectTasks({
required List<bool> starredStatuses,
required List<String> taskStatuses,
List<String>? ids,
int limit = 500,
int offset = 0,
}) async {
final res = await _selectTasks(
starredStatuses: starredStatuses,
taskStatuses: taskStatuses,
ids: ids,
limit: limit,
offset: offset,
).get();
return res.map(fromDbEntity).toList();
}) {
final types = <String>['Task'];
if (ids != null) {
return filteredTasks2(
types,
ids,
starredStatuses,
taskStatuses,
limit,
offset,
);
} else {
return filteredTasks(
types,
starredStatuses,
taskStatuses,
limit,
offset,
);
}
}

Selectable<JournalDbEntity> _selectTasks({
Selectable<String> _selectTaskIds({
required List<bool> starredStatuses,
required List<String> taskStatuses,
List<String>? ids,
Expand All @@ -398,7 +438,7 @@ class JournalDb extends _$JournalDb {
}) {
final types = <String>['Task'];
if (ids != null) {
return filteredTasksByTag(
return filteredTaskIds2(
types,
ids,
starredStatuses,
Expand All @@ -407,7 +447,7 @@ class JournalDb extends _$JournalDb {
offset,
);
} else {
return filteredTasks(
return filteredTaskIds(
types,
starredStatuses,
taskStatuses,
Expand Down
54 changes: 52 additions & 2 deletions lib/database/database.drift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CREATE TABLE journal (

CREATE INDEX idx_journal_created_at ON journal (created_at);
CREATE INDEX idx_journal_updated_at ON journal (updated_at);
CREATE INDEX idx_journal_date_from ON journal (date_from);
CREATE INDEX idx_journal_date_from ON journal (date_from DESC);
CREATE INDEX idx_journal_date_to ON journal (date_to);
CREATE INDEX idx_journal_deleted ON journal (deleted);
CREATE INDEX idx_journal_starred ON journal (starred);
Expand Down Expand Up @@ -185,6 +185,31 @@ SELECT * FROM journal
LIMIT :limit
OFFSET :offset;

filteredJournalIds:
SELECT id FROM journal
WHERE type IN :types
AND deleted = false
AND private IN (0, (SELECT status FROM config_flags WHERE name = 'private'))
AND starred IN :starredStatuses
AND private IN :privateStatuses
AND flag IN :flaggedStatuses
ORDER BY date_from DESC
LIMIT :limit
OFFSET :offset;

filteredJournalIds2:
SELECT id FROM journal
WHERE type IN :types
AND deleted = false
AND id IN :ids
AND private IN (0, (SELECT status FROM config_flags WHERE name = 'private'))
AND starred IN :starredStatuses
AND private IN :privateStatuses
AND flag IN :flaggedStatuses
ORDER BY date_from DESC
LIMIT :limit
OFFSET :offset;

filteredByTagJournal:
SELECT * FROM journal
WHERE type IN :types
Expand Down Expand Up @@ -244,7 +269,7 @@ SELECT * FROM journal
LIMIT :limit
OFFSET :offset;

filteredTasksByTag:
filteredTasks2:
SELECT * FROM journal
WHERE type IN :types
AND deleted = false
Expand All @@ -257,6 +282,31 @@ SELECT * FROM journal
LIMIT :limit
OFFSET :offset;

filteredTaskIds:
SELECT id FROM journal
WHERE type IN :types
AND deleted = false
AND private IN (0, (SELECT status FROM config_flags WHERE name = 'private'))
AND starred IN :starredStatuses
AND task = 1
AND task_status IN :taskStatuses
ORDER BY date_from DESC
LIMIT :limit
OFFSET :offset;

filteredTaskIds2:
SELECT id FROM journal
WHERE type IN :types
AND deleted = false
AND id IN :ids
AND private IN (0, (SELECT status FROM config_flags WHERE name = 'private'))
AND starred IN :starredStatuses
AND task = 1
AND task_status IN :taskStatuses
ORDER BY date_from DESC
LIMIT :limit
OFFSET :offset;

orderedJournal:
SELECT * FROM journal
WHERE deleted = false
Expand Down
Loading

0 comments on commit 33e80ba

Please sign in to comment.