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