createIndex method

void createIndex(
  1. IndexDef def
)

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;
}