diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java index 4899f78e78e..48d07d3c5af 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java @@ -443,6 +443,10 @@ public interface CollectionDAO { List findFrom( @Bind("toId") String toId, @Bind("toEntity") String toEntity, @Bind("relation") int relation); + @SqlQuery("SELECT fromId, fromEntity, json FROM entity_relationship " + "WHERE toId = :toId ORDER BY fromId") + @RegisterRowMapper(FromRelationshipMapper.class) + List findFrom(@Bind("toId") String toId); + // // Delete Operations // diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java index 158aaf0234e..af283c5802f 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java @@ -897,6 +897,10 @@ public abstract class EntityRepository { .findFrom(toId.toString(), toEntityType, relationship.ordinal(), fromEntityType); } + public List findFrom(String toId) { + return daoCollection.relationshipDAO().findFrom(toId); + } + public EntityReference getContainer(UUID toId) throws IOException { return getFromEntityRef(toId, Relationship.CONTAINS, null, true); } diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/LocationRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/LocationRepository.java index e7b8c2ff3da..1dea62c01d6 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/LocationRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/LocationRepository.java @@ -31,6 +31,7 @@ import org.openmetadata.catalog.resources.locations.LocationResource; import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.type.Relationship; import org.openmetadata.catalog.type.TagLabel; +import org.openmetadata.catalog.util.EntityUtil; import org.openmetadata.catalog.util.EntityUtil.Fields; import org.openmetadata.catalog.util.FullyQualifiedName; import org.openmetadata.catalog.util.JsonUtils; @@ -209,6 +210,11 @@ public class LocationRepository extends EntityRepository { CatalogExceptionMessage.invalidServiceEntity(service.getType(), Entity.LOCATION, STORAGE_SERVICE)); } + public List getEntityDetails(String id) throws IOException { + List records = findFrom(id); + return EntityUtil.getEntityReferences(records); + } + public void setService(Location location, EntityReference service) throws IOException { if (service != null && location != null) { service = getService(service); // Populate service details diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/locations/LocationResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/locations/LocationResource.java index 7f48c9e90ad..e14571f34e8 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/locations/LocationResource.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/locations/LocationResource.java @@ -60,6 +60,7 @@ import org.openmetadata.catalog.resources.EntityResource; import org.openmetadata.catalog.security.Authorizer; import org.openmetadata.catalog.type.ChangeEvent; import org.openmetadata.catalog.type.EntityHistory; +import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.type.Include; import org.openmetadata.catalog.util.EntityUtil.Fields; import org.openmetadata.catalog.util.RestUtil; @@ -292,6 +293,33 @@ public class LocationResource extends EntityResource getTableFromLocation( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @Parameter(description = "location Id", schema = @Schema(type = "string")) @PathParam("id") String id, + @Parameter( + description = "location version number in the form `major`.`minor`", + schema = @Schema(type = "string", example = "0.1 or 1.1")) + @PathParam("version") + String version) + throws IOException { + return dao.getEntityDetails(id); + } + @GET @Path("/{id}/versions/{version}") @Operation( diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/locations/LocationResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/locations/LocationResourceTest.java index 52d8d3ebfe8..34e4b22061c 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/locations/LocationResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/locations/LocationResourceTest.java @@ -25,8 +25,10 @@ import java.io.IOException; import java.net.URISyntaxException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.ws.rs.client.WebTarget; @@ -36,6 +38,7 @@ import org.apache.http.client.HttpResponseException; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.openmetadata.catalog.CatalogApplicationTest; import org.openmetadata.catalog.Entity; import org.openmetadata.catalog.api.data.CreateLocation; import org.openmetadata.catalog.entity.data.Location; @@ -103,6 +106,26 @@ public class LocationResourceTest extends EntityResourceTest getAssociatedEntity(Location location) throws HttpResponseException { + WebTarget target = CatalogApplicationTest.getResource(String.format("locations/association/%s", location.getId())); + return (List) TestUtils.get(target, List.class, ADMIN_AUTH_HEADERS); + } + + @Test + void get_entity_from_location(TestInfo test) throws IOException { + Location location = createAndCheckEntity(createRequest(test), ADMIN_AUTH_HEADERS); + String actualValue = getAssociatedEntity(location).toString(); + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("id", location.getService().getId()); + expected.put("type", location.getService().getType()); + expected.put("name", location.getService().getName()); + expected.put("fullyQualifiedName", location.getService().getFullyQualifiedName()); + expected.put("deleted", location.getService().getDeleted()); + List> expectedValue = new ArrayList<>(); + expectedValue.add(expected); + assertEquals(expectedValue.toString(), actualValue); + } + @Test void get_locationListWithPrefix_2xx(TestInfo test) throws HttpResponseException { // Create some nested locations.