diff --git a/metacat-client/src/main/java/com/netflix/metacat/client/api/MetacatV1.java b/metacat-client/src/main/java/com/netflix/metacat/client/api/MetacatV1.java index 0904f41c3..8aa8caa94 100644 --- a/metacat-client/src/main/java/com/netflix/metacat/client/api/MetacatV1.java +++ b/metacat-client/src/main/java/com/netflix/metacat/client/api/MetacatV1.java @@ -291,7 +291,36 @@ default TableDto getTable( Boolean includeInfoDetails ) { return getTable(catalogName, databaseName, tableName, includeInfo, - includeDefinitionMetadata, includeDataMetadata, includeInfoDetails, false); + includeDefinitionMetadata, includeDataMetadata, includeInfoDetails, false, + false); + } + + /** + * Get the table. + * Add this method to maintain backward compatability with dependent services which currently uses metacatClient + * @param catalogName catalog name + * @param databaseName database name + * @param tableName table name. + * @param includeInfo true if the details need to be included + * @param includeDefinitionMetadata true if the definition metadata to be included + * @param includeDataMetadata true if the data metadata to be included + * @param includeInfoDetails true if the more info details to be included + * @param includeMetadataLocationOnly true if includeMetadataLocationOnly + * @return table + */ + default TableDto getTable( + String catalogName, + String databaseName, + String tableName, + Boolean includeInfo, + Boolean includeDefinitionMetadata, + Boolean includeDataMetadata, + Boolean includeInfoDetails, + Boolean includeMetadataLocationOnly + ) { + return getTable(catalogName, databaseName, tableName, includeInfo, + includeDefinitionMetadata, includeDataMetadata, includeInfoDetails, includeMetadataLocationOnly, + false); } /** @@ -306,6 +335,7 @@ default TableDto getTable( * @param includeInfoDetails true if the more info details to be included * @param includeMetadataLocationOnly true if only metadata location needs to be included. * All other flags are ignored if this is set to true. + * @param includeParentChildInfo true if includeParentChildInfo * @return table */ @GET @@ -333,7 +363,10 @@ TableDto getTable( Boolean includeInfoDetails, @DefaultValue("false") @QueryParam("includeMetadataLocationOnly") - Boolean includeMetadataLocationOnly + Boolean includeMetadataLocationOnly, + @DefaultValue("false") + @QueryParam("includeParentChildInfo") + Boolean includeParentChildInfo ); /** diff --git a/metacat-common-server/src/main/java/com/netflix/metacat/common/server/api/v1/MetacatV1.java b/metacat-common-server/src/main/java/com/netflix/metacat/common/server/api/v1/MetacatV1.java index 82f256032..f992cf14b 100644 --- a/metacat-common-server/src/main/java/com/netflix/metacat/common/server/api/v1/MetacatV1.java +++ b/metacat-common-server/src/main/java/com/netflix/metacat/common/server/api/v1/MetacatV1.java @@ -81,7 +81,7 @@ default TableDto getTable( final boolean includeInfoDetails ) { return getTable(catalogName, databaseName, tableName, includeInfo, includeDefinitionMetadata, - includeDataMetadata, includeInfoDetails, false); + includeDataMetadata, includeInfoDetails, false, false); } /** @@ -96,6 +96,7 @@ default TableDto getTable( * @param includeInfoDetails true if the more info details to be included * @param includeMetadataLocationOnly true if only metadata location needs to be included. * All other flags are ignored + * @param includeParentChildInfo true if includeParentChildInfo needs to be included. * @return table */ TableDto getTable( @@ -106,7 +107,8 @@ TableDto getTable( final boolean includeDefinitionMetadata, final boolean includeDataMetadata, final boolean includeInfoDetails, - final boolean includeMetadataLocationOnly + final boolean includeMetadataLocationOnly, + final boolean includeParentChildInfo ); /** diff --git a/metacat-main/src/main/java/com/netflix/metacat/main/api/v1/MetacatController.java b/metacat-main/src/main/java/com/netflix/metacat/main/api/v1/MetacatController.java index 6ad96130f..53d447343 100644 --- a/metacat-main/src/main/java/com/netflix/metacat/main/api/v1/MetacatController.java +++ b/metacat-main/src/main/java/com/netflix/metacat/main/api/v1/MetacatController.java @@ -655,7 +655,10 @@ public TableDto getTable( @ApiParam(value = "Whether to include only the metadata location in the response") @RequestParam( name = "includeMetadataLocationOnly", - defaultValue = "false") final boolean includeMetadataLocationOnly + defaultValue = "false") final boolean includeMetadataLocationOnly, + @RequestParam( + name = "includeParentChildInfo", + defaultValue = "false") final boolean includeParentChildInfo ) { final Supplier qualifiedNameSupplier = () -> QualifiedName.ofTable(catalogName, databaseName, tableName); @@ -669,6 +672,7 @@ public TableDto getTable( .put("includeDataMetadata", String.valueOf(includeDataMetadata)) .put("includeMetadataFromConnector", String.valueOf(includeInfoDetails)) .put("includeMetadataLocationOnly", String.valueOf(includeMetadataLocationOnly)) + .put("includeParentChildInfo", String.valueOf(includeParentChildInfo)) .build(), () -> { final Optional table = this.tableService.get( @@ -680,6 +684,7 @@ public TableDto getTable( .disableOnReadMetadataIntercetor(false) .includeMetadataFromConnector(includeInfoDetails) .includeMetadataLocationOnly(includeMetadataLocationOnly) + .includeParentChildInfo(includeParentChildInfo) .useCache(true) .build() ); diff --git a/metacat-main/src/main/java/com/netflix/metacat/main/services/GetTableServiceParameters.java b/metacat-main/src/main/java/com/netflix/metacat/main/services/GetTableServiceParameters.java index e3cb5f358..99b2fb771 100644 --- a/metacat-main/src/main/java/com/netflix/metacat/main/services/GetTableServiceParameters.java +++ b/metacat-main/src/main/java/com/netflix/metacat/main/services/GetTableServiceParameters.java @@ -36,4 +36,5 @@ public class GetTableServiceParameters { private final boolean useCache; private final boolean includeMetadataFromConnector; private final boolean includeMetadataLocationOnly; + private final boolean includeParentChildInfo; } diff --git a/metacat-main/src/main/java/com/netflix/metacat/main/services/impl/TableServiceImpl.java b/metacat-main/src/main/java/com/netflix/metacat/main/services/impl/TableServiceImpl.java index df784eab8..aa385b122 100644 --- a/metacat-main/src/main/java/com/netflix/metacat/main/services/impl/TableServiceImpl.java +++ b/metacat-main/src/main/java/com/netflix/metacat/main/services/impl/TableServiceImpl.java @@ -518,7 +518,7 @@ public Optional get(final QualifiedName name, final GetTableServicePar && definitionMetadata.get().has(ParentChildRelMetadataConstants.PARENT_CHILD_RELINFO)) { definitionMetadata.get().remove(ParentChildRelMetadataConstants.PARENT_CHILD_RELINFO); } - if (config.isParentChildGetEnabled()) { + if (config.isParentChildGetEnabled() || getTableServiceParameters.isIncludeParentChildInfo()) { final ObjectNode parentChildRelObjectNode = createParentChildObjectNode(name); if (!parentChildRelObjectNode.isEmpty()) { if (!definitionMetadata.isPresent()) { diff --git a/metacat-main/src/test/groovy/com/netflix/metacat/main/services/impl/TableServiceImplSpec.groovy b/metacat-main/src/test/groovy/com/netflix/metacat/main/services/impl/TableServiceImplSpec.groovy index 5aedea827..144811412 100644 --- a/metacat-main/src/test/groovy/com/netflix/metacat/main/services/impl/TableServiceImplSpec.groovy +++ b/metacat-main/src/test/groovy/com/netflix/metacat/main/services/impl/TableServiceImplSpec.groovy @@ -480,7 +480,7 @@ class TableServiceImplSpec extends Specification { noExceptionThrown() } - def "Mock Parent Child Relationship Drop"() { + def "Mock Parent Child Relationship Drop with isParentChildGetEnabled enabled and getParameter disabled"() { given: def name = QualifiedName.ofTable("clone", "clone", "child") @@ -577,7 +577,7 @@ class TableServiceImplSpec extends Specification { noExceptionThrown() } - def "Mock Parent Child Relationship Get"() { + def "Mock Parent Child Relationship Get with GetTableServiceParameters disabled"() { when: service.get(name,GetTableServiceParameters.builder(). disableOnReadMetadataIntercetor(false) @@ -609,6 +609,39 @@ class TableServiceImplSpec extends Specification { 1 * parentChildRelSvc.isParentTable(name) } + def "Mock Parent Child Relationship Get with GetTableServiceParameters enabled"() { + when: + service.get(name,GetTableServiceParameters.builder(). + disableOnReadMetadataIntercetor(false) + .includeDataMetadata(true) + .includeDefinitionMetadata(true) + .includeParentChildInfo(true) + .build()) + then: + 1 * connectorManager.getCatalogConfig(_) >> catalogConfig + 1 * usermetadataService.getDefinitionMetadataWithInterceptor(_,_) >> Optional.empty() + 1 * usermetadataService.getDataMetadata(_) >> Optional.empty() + 0 * usermetadataService.getDefinitionMetadata(_) >> Optional.empty() + 1 * config.isParentChildGetEnabled() >> false + 1 * parentChildRelSvc.getParents(name) + 1 * parentChildRelSvc.isParentTable(name) + + when: + service.get(name,GetTableServiceParameters.builder(). + disableOnReadMetadataIntercetor(false) + .includeDataMetadata(true) + .includeDefinitionMetadata(true) + .build()) + then: + 1 * connectorManager.getCatalogConfig(_) >> catalogConfig + 1 * usermetadataService.getDefinitionMetadataWithInterceptor(_,_) >> Optional.empty() + 1 * usermetadataService.getDataMetadata(_) >> Optional.empty() + 0 * usermetadataService.getDefinitionMetadata(_) >> Optional.empty() + 1 * config.isParentChildGetEnabled() >> true + 1 * parentChildRelSvc.getParents(name) + 1 * parentChildRelSvc.isParentTable(name) + } + def "Will not throw on Successful Table Update with Failed Get"() { given: def updatedTableDto = new TableDto(name: name, serde: new StorageDto(uri: 's3:/a/b/c'))