findIndexesNamesInUse method

  1. @override
FutureOr<Map<String, String?>?> findIndexesNamesInUse(
  1. String table,
  2. Iterable<String> indexesNames
)
override

Relation names are unique per schema (an index, a table, a sequence...): the ones visible in the search path.

Implementation

@override
FutureOr<Map<String, String?>?> findIndexesNamesInUse(
  String table,
  Iterable<String> indexesNames,
) {
  var names = indexesNames
      .map((n) => "'${n.replaceAll("'", "''")}'")
      .join(', ');
  if (names.isEmpty) return <String, String?>{};

  var sql =
      '''
  SELECT
    c.relname AS name,
    t.relname AS table_name
  FROM pg_class c
    LEFT JOIN pg_index ix ON ix.indexrelid = c.oid
    LEFT JOIN pg_class t ON t.oid = ix.indrelid
  WHERE
    c.relname IN ($names)
    AND pg_table_is_visible(c.oid);
  ''';

  return executeWithPool(
    (connection) => connection
        .mappedResultsQuery(sql)
        .then(
          (rows) => <String, String?>{
            for (var row in rows)
              row['name'].toString(): row['table_name']?.toString(),
          },
        ),
  );
}