findFieldsReferencedTablesImpl method

  1. @override
Future<Map<String, TableFieldReference>> findFieldsReferencedTablesImpl(
  1. DBMySqlConnectionWrapper connection,
  2. String table
)
override

Finds the foreign keys of table, with connection: the referenced table (and field) of each referencing field, by the field name.

Implemented by the adapters that introspect their schema (see listTablesNamesImpl). Default: throws UnsupportedError.

Implementation

@override
Future<Map<String, TableFieldReference>> findFieldsReferencedTablesImpl(
  DBMySqlConnectionWrapper connection,
  String table,
) async {
  var sql = findFieldsReferencedTablesSQL(databaseName, table);

  var results = await connection.query(sql);

  var referenceFields = results
      .map((r) => r.toColumnMap())
      .toList(growable: false);

  var mapEntriesRet = referenceFields
      .map((e) {
        var sourceTable = e['TABLE_NAME'];
        var sourceField = e['COLUMN_NAME'];
        var targetTable = e['REFERENCED_TABLE_NAME'];
        var targetField = e['REFERENCED_COLUMN_NAME'];
        if (targetTable == null || targetField == null) return null;

        var sourceFieldsTypesRet = getTableFieldsTypes(table);
        var targetFieldsTypesRet = getTableFieldsTypes(targetTable);

        return sourceFieldsTypesRet.resolveBoth(targetFieldsTypesRet, (
          sourceFieldsTypes,
          targetFieldsTypes,
        ) {
          var sourceFieldType = sourceFieldsTypes?[sourceField] ?? String;
          var targetFieldType = targetFieldsTypes?[targetField] ?? String;

          var reference = TableFieldReference(
            sourceTable,
            sourceField,
            sourceFieldType,
            targetTable,
            targetField,
            targetFieldType,
          );

          return MapEntry<String, TableFieldReference>(
            sourceField,
            reference,
          );
        });
      })
      .nonNulls
      .resolveAll();

  return mapEntriesRet.resolveMapped((mapEntries) {
    var map = Map<String, TableFieldReference>.fromEntries(mapEntries);
    return map;
  });
}