introspect method
Reads schema metadata from executor.
Implementation
Future<SchemaDocument> introspect(
pg.SessionExecutor executor, {
String schemaName = 'public',
}) async {
final enums = await _introspectEnums(executor, schemaName);
final enumTypeNames = {
for (final definition in enums) definition.databaseName: definition.name,
};
final tableRows = await _query(
executor,
'''
SELECT table_name
FROM information_schema.tables
WHERE table_schema = \$1
AND table_type = 'BASE TABLE'
ORDER BY table_name ASC
''',
<Object?>[schemaName],
);
final explicitTableNames = <String>[];
final implicitRelationTables = <String>[];
for (final tableRow in tableRows) {
final tableName = tableRow['table_name'] as String;
if (isImplicitManyToManyTableName(tableName)) {
implicitRelationTables.add(tableName);
continue;
}
explicitTableNames.add(tableName);
}
final models = <ModelDefinition>[];
for (final tableName in explicitTableNames) {
models.add(
await _introspectModel(
executor,
schemaName,
tableName,
enumTypeNames: enumTypeNames,
),
);
}
final modelsWithImplicitRelations = _attachImplicitManyToManyRelations(
models,
implicitRelationTables,
);
return SchemaDocument(
models: List<ModelDefinition>.unmodifiable(modelsWithImplicitRelations),
enums: List<EnumDefinition>.unmodifiable(enums),
);
}