lexicographical_order 1.3.2
lexicographical_order: ^1.3.2 copied to clipboard
A string generator that helps to implement a lexicographical order(lexical order). this makes reordering transactions faster and simpler.
About #
A string generator that helps to implement reordering on top of a database
It makes reordering, sorting, interleaving transactions faster and simpler.
Usage #
-
Get a string between two strings in the lexicographical(lexical or alphabetical) order.
final mid = between(prev: 'B', next: 'D'); assert( areListsEqual( [mid, 'D', 'B']..sort(), ['B', mid, 'D'], ), ); -
Generate order keys.
final keyCount = 100; final orderKeys = generateOrderKeys(keyCount);This is useful for the following cases:
-
betweencannot be used because the table (collection) is empty.Future<void> addTodo(CreateTodo command) async { final String orderKey = todos.isEmpty ? generateOrderKeys(1).first // <== : between(prev: todos.last.orderKey); final todo = await todoRepository.create(command, orderKey); todos.add(todo); } -
when migrating to an efficient reorderable system.
Future<void> migrateToLexicalOrderSystem(Table table) async { final itemCount = table.count(); final orderKeys = generateOrderKeys(itemCount); /* omitted */ }
-
Caution #
The between function accepts only allowed characters as arguments #
more precisely, the following code is used inside between.
LexOrderValidator().checkBetweenArgs(prev: prev, next: next);
The LexOrderValidator checks the follwing constraints:
-
both
prevandnextmust be empty or composed of alphabets. -
nextmust not be 'A' -
prevandnextmust not be equal to each other. -
if both
prevandnextare not empty,prevmust not succeednextin the lexicographical order. for example:between(prev: 'C', next: 'B');
In debug mode, you get an error if you violate the above constraints. but not in release mode. you can check the constraints manually by using LexOrderValidator.