createIndex method
Implementation
void createIndex(IndexDef def) {
if (indexDefs.containsKey(def.name)) {
throw StateError('Index ${def.name} already exists');
}
final tree = SplayTreeMap<Object, List<int>>(_compareKeys);
// For expression / partial indexes the engine fills in lazily — just
// record the def. The Database executor maintains them.
if (def.exprSql != null || def.whereSql != null) {
indexDefs[def.name] = def;
indexes[def.name] = tree;
return;
}
for (var i = 0; i < rows.length; i++) {
final key = _buildIndexKey(def, rows[i]);
if (key == null) continue;
final list = tree.putIfAbsent(key, () => <int>[]);
if (def.unique && list.isNotEmpty) {
throw StateError(
'Cannot build UNIQUE index ${def.name}: duplicate key $key');
}
list.add(i);
}
indexDefs[def.name] = def;
indexes[def.name] = tree;
}