autotrie 2.0.0 autotrie: ^2.0.0 copied to clipboard
A auto-completion engine for Dart/Flutter, based around an optimized Trie implementation.
AutoTrie #
A versatile library which solves autocompletion in Dart/Flutter. It is based around a space-efficient implementation of Trie which uses variable-length lists. With this, serving auto-suggestions is both fast and no-hassle. Suggestions are also sorted by how often they've been entered and subsorted by recency of entry, for search-engine-like results.
Read more about Trie here.
A Brief Note #
It takes time, effort, and mental power to keep this package updated, useful, and improving. If you used or are using the package, I'd appreciate it if you could spare a few dollars to help me continue development.
Usage #
A usage example is provided below. Check the API Reference for detailed docs:
import 'dart:io'; // you don't need to import this, it just has the sleep method (which I use here).
import 'package:autotrie/autotrie.dart';
void main() {
var engine = AutoComplete(engine: SortEngine.configMulti(Duration(seconds: 1), 15, 0.5, 0.5)); //You can also initialize with a starting databank.
var interval = Duration(milliseconds: 1);
engine.enter('more'); // Enter more thrice.
engine.enter('more');
engine.enter('more');
engine.enter('moody'); // Enter moody twice.
engine.enter('moody');
engine.enter('morose'); // Enter scattered words (with mo).
engine.enter('morty');
sleep(interval);
engine.enter('moment');
sleep(interval);
engine.enter('momentum');
engine.enter('sorose'); // Enter scattered words (without mo).
engine.enter('sorty');
engine.delete('morose'); // Delete morose.
// Check if morose is deleted.
print('Morose deletion check: ${!engine.contains('morose')}');
// Check if engine is empty.
print('Engine emptiness check: ${engine.isEmpty}');
// Suggestions starting with 'mo'.
// They've been ranked by frequency and recency. Since they're all so similar
// in recency, frequency takes priority.
print("'mo' suggestions: ${engine.suggest('mo')}");
// Result: [more, moody, momentum, moment, morty]
// Get all entries.
// They've not been sorted.
print('All entries: ${engine.allEntries}');
// Result: [more, moody, sorty, sorose, momentum, moment, morty]
}
// Check the API Reference for the latest information and adv.
// methods from this class.
Sorting #
The AutoComplete constructor takes a SortEngine, which it uses to sort the result of the autocompletion operation. There are a few different modes it can operate in:
- SortEngine.entriesOnly() -> AutoComplete results are only sorted by number of entries in the engine (High to Low)
- SortEngine.msOnly() -> AutoComplete results are only sorted by how much time has passed since their last entry (Low to High)
- SortEngine.simpleMulti() ->
- Sorted using two logistic curves, one for ms and one for entries
- The ms curve is set to use 3 years (a LOT) as the upper end of how far back entries could have been entered
- The entries curve is set to use 30 entries as the max amount of entries
- These values are highly arbitrary and not likely to fit your project; this mode is not recommended unless you are just playing around.
- Takes two weights (one for recency and one for entries) which can be used to balance how heavily each factor should affect the final sorting.
- Sorted using two logistic curves, one for ms and one for entries
- SortEngine.configMulti() ->
- Sorted using two logistic curves, one for ms and one for entries
- The ms curve is balanced using a parameter (a Duration) for the max time since entry in this engine.
- The entries curve is balanced using a parameter (an int) for the max amount of entries in this engine.
- If you know approximately how old and how big this AutoComplete engine is, it is highly recommended that you use this mode.
- Takes two weights (one for recency and one for entries) which can be used to balance how heavily each factor should affect the final sorting.
- Sorted using two logistic curves, one for ms and one for entries
Note that all the recency sorting functionality has a granularity of one millisecond. If you add multiple elements to the tree within the span of a single millisecond, they are regarded as functionally equivalent in the recency metric.
Basic File Persistence #
AutoComplete is natively capable of writing itself to and reading itself from a file. To do this, persist to a file
using the persist
method (it takes a File
object):
await engine.persist(myFile);
Then you can rebuild using AutoComplete.fromFile
(it takes a File
along with the mandatory SortEngine
):
var engine = AutoComplete.fromFile(file: myFile, engine: SortEngine.entriesOnly());
This persistence will preserve all the metadata (last insert, number of entries) in the table as well as the core data (the Strings themselves).
Hive Integration #
- Hive is a speedy, local, and key-value database for Dart/Flutter. Go check it out if you haven't already!
- Hive integration is now available with autotrie:
- Our way of integration uses extension methods.
- Import Hive and AutoTrie, and create a normal Hive box using
Hive.openBox('nameHere')
. - You can then call
searchKeys(String prefix)
andsearchValues(String prefix)
on that box to get auto-suggestions. - There is no sorting options: only entry-level sorting is available.
Features and bugs #
Please file feature requests and bugs at the issue tracker.