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