introspect method

Future<SchemaDocument> introspect(
  1. SessionExecutor executor, {
  2. String schemaName = 'public',
})

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