generateIndexesSql function

List<String> generateIndexesSql(
  1. ModelMeta model,
  2. Dialect dialect
)

Generates all explicit and implied index SQL statements for a ModelMeta.

Includes:

  • Explicit composite indexes defined on ModelMeta.indexes
  • Single-column indexes for fields with dbIndex: true
  • Performance indexes on foreign key relation columns

Example:

final indexStatements = generateIndexesSql(userModelMeta, Dialect.postgres);
for (final stmt in indexStatements) {
  print(stmt);
}

Implementation

List<String> generateIndexesSql(ModelMeta model, Dialect dialect) {
  final stmts = <String>[];
  final ifNotExists = 'IF NOT EXISTS ';

  // Explicit model indexes
  for (final idx in model.indexes) {
    if (idx.fields.isEmpty) continue;
    final colList = idx.fields.join(', ');
    stmts.add('CREATE INDEX $ifNotExists${idx.name} ON ${model.tableName}($colList);');
  }

  // Field-level db_index
  for (final field in model.fields) {
    if (field.dbIndex && !field.primaryKey && !field.unique) {
      final idxName = '${model.tableName}_${field.columnName}_idx';
      stmts.add('CREATE INDEX $ifNotExists$idxName ON ${model.tableName}(${field.columnName});');
    }
  }

  // Foreign key relation indexes (standard practice for performance)
  for (final relation in model.relations) {
    if (relation.kind == RelationKind.foreignKey) {
      final idxName = '${model.tableName}_${relation.fieldName}_idx';
      stmts.add('CREATE INDEX $ifNotExists$idxName ON ${model.tableName}(${relation.fieldName});');
    }
  }

  return stmts;
}