public static List getDependencies()

in baremaps-postgres/src/main/java/org/apache/baremaps/postgres/refresh/DatabaseMetadataRetriever.java [98:154]


  public static List<DatabaseDependency> getDependencies(Connection connection, String schema,
      List<DatabaseObject> objects) throws SQLException {
    var sql = """
            SELECT dependent_ns.nspname   AS dependent_schema,
                   dependent_c.relname    AS dependent_name,
                   source_ns.nspname      AS source_schema,
                   source_c.relname       AS source_name
              FROM pg_depend d
              JOIN pg_rewrite r
                ON r.oid = d.objid
              JOIN pg_class dependent_c
                ON r.ev_class = dependent_c.oid
              JOIN pg_namespace dependent_ns
                ON dependent_c.relnamespace = dependent_ns.oid
              JOIN pg_class source_c
                ON d.refobjid = source_c.oid
              JOIN pg_namespace source_ns
                ON source_c.relnamespace = source_ns.oid
             WHERE dependent_ns.nspname = ?
               AND source_ns.nspname = ?
        """;

    // Create a fast lookup by (schema + name).
    var lookupMap = new HashMap<String, DatabaseObject>();
    for (var obj : objects) {
      var key = obj.schemaName() + "." + obj.objectName();
      lookupMap.put(key, obj);
    }

    var result = new ArrayList<DatabaseDependency>();
    try (var ps = connection.prepareStatement(sql)) {
      ps.setString(1, schema);
      ps.setString(2, schema);
      try (var rs = ps.executeQuery()) {
        while (rs.next()) {
          var dependentSchema = rs.getString("dependent_schema");
          var dependentName = rs.getString("dependent_name");
          var sourceSchema = rs.getString("source_schema");
          var sourceName = rs.getString("source_name");

          var dependentKey = dependentSchema + "." + dependentName;
          var sourceKey = sourceSchema + "." + sourceName;

          var dependentObj = lookupMap.get(dependentKey);
          var sourceObj = lookupMap.get(sourceKey);

          if (dependentObj != null && sourceObj != null) {
            // Skip self-loop dependencies.
            if (!dependentObj.equals(sourceObj)) {
              result.add(new DatabaseDependency(sourceObj, dependentObj));
            }
          }
        }
      }
    }
    return result;
  }