From e1d19fc8c2221a98368e5a8e2fe770d8af4fd9d4 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Thu, 5 Mar 2020 01:36:58 +0100 Subject: [PATCH] Optimize building of the NotesCache --- lib/core/notes_cache.dart | 35 +++++++++++++++++++++++++++-------- lib/core/notes_folder.dart | 12 ++++++++---- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/lib/core/notes_cache.dart b/lib/core/notes_cache.dart index 81360ec1..d7bbda06 100644 --- a/lib/core/notes_cache.dart +++ b/lib/core/notes_cache.dart @@ -1,9 +1,9 @@ import 'dart:convert'; import 'dart:io'; -import 'dart:math'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as p; +import 'package:collection/collection.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; @@ -62,17 +62,36 @@ class NotesCache { if (!enabled) return; 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); } + Iterable _fetchFirst10( + Iterable 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(reversedFn); + + for (var note in allNotes) { + heap.add(note); + if (heap.length > 10) { + heap.removeFirst(); + } + } + + return heap.toList().reversed; + } + @visibleForTesting Future> loadFromDisk() async { String contents = ""; diff --git a/lib/core/notes_folder.dart b/lib/core/notes_folder.dart index eb18faa2..a6386511 100644 --- a/lib/core/notes_folder.dart +++ b/lib/core/notes_folder.dart @@ -305,12 +305,16 @@ class NotesFolder return folderPath.compareTo(other.folderPath); } - List getAllNotes() { - var notes = List.from(_notes); + Iterable getAllNotes() sync* { + for (var note in _notes) { + yield note; + } for (var folder in _folders) { - notes.addAll(folder.getAllNotes()); + var notes = folder.getAllNotes(); + for (var note in notes) { + yield note; + } } - return notes; } }