mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 18:38:36 +08:00
Optimize building of the NotesCache
This commit is contained in:
@ -1,9 +1,9 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/note.dart';
|
import 'package:gitjournal/core/note.dart';
|
||||||
import 'package:gitjournal/core/notes_folder.dart';
|
import 'package:gitjournal/core/notes_folder.dart';
|
||||||
@ -62,17 +62,36 @@ class NotesCache {
|
|||||||
if (!enabled) return;
|
if (!enabled) return;
|
||||||
|
|
||||||
print("Saving the NotesCache");
|
print("Saving the NotesCache");
|
||||||
// FIXME: This could be optimized quite a bit
|
|
||||||
var files = rootFolder.getAllNotes();
|
|
||||||
assert(files.every((n) => n.loadState == NoteLoadState.Loaded));
|
|
||||||
|
|
||||||
files.sort(sortingMode.sortingFunction());
|
|
||||||
files = files.sublist(0, min(10, files.length));
|
|
||||||
var fileList = files.map((f) => f.filePath).toList();
|
|
||||||
|
|
||||||
|
var notes = rootFolder.getAllNotes();
|
||||||
|
var fileList =
|
||||||
|
_fetchFirst10(notes, sortingMode).map((f) => f.filePath).toList();
|
||||||
return saveToDisk(fileList);
|
return saveToDisk(fileList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Iterable<Note> _fetchFirst10(
|
||||||
|
Iterable<Note> allNotes,
|
||||||
|
SortingMode sortingMode,
|
||||||
|
) {
|
||||||
|
var origFn = sortingMode.sortingFunction();
|
||||||
|
var reversedFn = (Note a, Note b) {
|
||||||
|
var r = origFn(a, b);
|
||||||
|
if (r < 0) return 1;
|
||||||
|
if (r > 0) return -1;
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
var heap = HeapPriorityQueue<Note>(reversedFn);
|
||||||
|
|
||||||
|
for (var note in allNotes) {
|
||||||
|
heap.add(note);
|
||||||
|
if (heap.length > 10) {
|
||||||
|
heap.removeFirst();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return heap.toList().reversed;
|
||||||
|
}
|
||||||
|
|
||||||
@visibleForTesting
|
@visibleForTesting
|
||||||
Future<List<String>> loadFromDisk() async {
|
Future<List<String>> loadFromDisk() async {
|
||||||
String contents = "";
|
String contents = "";
|
||||||
|
@ -305,12 +305,16 @@ class NotesFolder
|
|||||||
return folderPath.compareTo(other.folderPath);
|
return folderPath.compareTo(other.folderPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Note> getAllNotes() {
|
Iterable<Note> getAllNotes() sync* {
|
||||||
var notes = List<Note>.from(_notes);
|
for (var note in _notes) {
|
||||||
|
yield note;
|
||||||
|
}
|
||||||
|
|
||||||
for (var folder in _folders) {
|
for (var folder in _folders) {
|
||||||
notes.addAll(folder.getAllNotes());
|
var notes = folder.getAllNotes();
|
||||||
|
for (var note in notes) {
|
||||||
|
yield note;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return notes;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user