/** * Saves user metadata. * * @param userId user name * @param holder metadata * @param merge true if the metadata should be merged with existing metadata */ @Override public void saveMetadata(final String userId, final HasMetadata holder, final boolean merge) { if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata defDto = (HasDefinitionMetadata) holder; // If the user is updating the definition metadata do a merge on the existing metadata final ObjectNode newMetadata = defDto.getDefinitionMetadata(); if (newMetadata != null) { saveDefinitionMetadata(defDto.getDefinitionName(), userId, Optional.of(newMetadata), merge); } } if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; // If the user is updating the data metadata and a separate data location exists, // do a merge on the existing metadata final ObjectNode newMetadata = dataDto.getDataMetadata(); if (newMetadata != null && dataDto.isDataExternal()) { saveDataMetadata(dataDto.getDataUri(), userId, Optional.of(newMetadata), merge); } } }
/** * Populate metadata. * * @param holder metadata * @param definitionMetadata definition metadata * @param dataMetadata data metadata */ @Override public void populateMetadata( final HasMetadata holder, final ObjectNode definitionMetadata, final ObjectNode dataMetadata ) { if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata defDto = (HasDefinitionMetadata) holder; defDto.setDefinitionMetadata(definitionMetadata); } if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; //data Metadata can be populated from iceberg metrics directly if (dataDto.isDataExternal() || dataMetadata != null) { dataDto.setDataMetadata(dataMetadata); } } } }
@Override public void deleteMetadata(final String userId, final List<HasMetadata> holders) { try { final List<List<HasMetadata>> subLists = Lists.partition(holders, config.getUserMetadataMaxInClauseItems()); for (List<HasMetadata> hasMetadatas : subLists) { final List<QualifiedName> names = hasMetadatas.stream() .filter(m -> m instanceof HasDefinitionMetadata) .map(m -> ((HasDefinitionMetadata) m).getDefinitionName()) .collect(Collectors.toList()); if (!names.isEmpty()) { _deleteDefinitionMetadata(names); } if (config.canSoftDeleteDataMetadata()) { final List<String> uris = hasMetadatas.stream() .filter(m -> m instanceof HasDataMetadata && ((HasDataMetadata) m).isDataExternal()) .map(m -> ((HasDataMetadata) m).getDataUri()).collect(Collectors.toList()); if (!uris.isEmpty()) { _softDeleteDataMetadata(userId, uris); } } } } catch (Exception e) { log.error("Failed deleting metadatas", e); throw new UserMetadataServiceException("Failed deleting metadatas", e); } }
/** * Populate the given metadata. * * @param holder metadata */ @Override public void populateMetadata(final HasMetadata holder, final boolean disableIntercetpor) { Optional<ObjectNode> metadata = Optional.empty(); if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; if (dataDto.isDataExternal()) { metadata = getDataMetadata(dataDto.getDataUri()); } } Optional<ObjectNode> definitionMetadata = Optional.empty(); if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata definitionDto = (HasDefinitionMetadata) holder; definitionMetadata = disableIntercetpor ? this.getDefinitionMetadata(definitionDto.getDefinitionName()) : this.getDefinitionMetadataWithInterceptor(definitionDto.getDefinitionName(), GetMetadataInterceptorParameters.builder().hasMetadata(holder).build()); } populateMetadata(holder, definitionMetadata.orElse(null), metadata.orElse(null)); }
/** * Saves user metadata. * * @param userId user name * @param holder metadata * @param merge true if the metadata should be merged with existing metadata */ @Override public void saveMetadata(final String userId, final HasMetadata holder, final boolean merge) { if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata defDto = (HasDefinitionMetadata) holder; // If the user is updating the definition metadata do a merge on the existing metadata final ObjectNode newMetadata = defDto.getDefinitionMetadata(); if (newMetadata != null) { saveDefinitionMetadata(defDto.getDefinitionName(), userId, Optional.of(newMetadata), merge); } } if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; // If the user is updating the data metadata and a separate data location exists, // do a merge on the existing metadata final ObjectNode newMetadata = dataDto.getDataMetadata(); if (newMetadata != null && dataDto.isDataExternal()) { saveDataMetadata(dataDto.getDataUri(), userId, Optional.of(newMetadata), merge); } } }
/** * Populate the given metadata. * * @param holder metadata */ @Override public void populateMetadata(final HasMetadata holder, final boolean disableIntercetpor) { Optional<ObjectNode> metadata = Optional.empty(); if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; if (dataDto.isDataExternal()) { metadata = getDataMetadata(dataDto.getDataUri()); } } Optional<ObjectNode> definitionMetadata = Optional.empty(); if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata definitionDto = (HasDefinitionMetadata) holder; definitionMetadata = disableIntercetpor ? this.getDefinitionMetadata(definitionDto.getDefinitionName()) : this.getDefinitionMetadataWithInterceptor(definitionDto.getDefinitionName(), GetMetadataInterceptorParameters.builder().hasMetadata(holder).build()); } populateMetadata(holder, definitionMetadata.orElse(null), metadata.orElse(null)); }
/** * Populate metadata. * * @param holder metadata * @param definitionMetadata definition metadata * @param dataMetadata data metadata */ @Override public void populateMetadata( final HasMetadata holder, final ObjectNode definitionMetadata, final ObjectNode dataMetadata ) { if (holder instanceof HasDefinitionMetadata) { final HasDefinitionMetadata defDto = (HasDefinitionMetadata) holder; defDto.setDefinitionMetadata(definitionMetadata); } if (holder instanceof HasDataMetadata) { final HasDataMetadata dataDto = (HasDataMetadata) holder; //data Metadata can be populated from iceberg metrics directly if (dataDto.isDataExternal() || dataMetadata != null) { dataDto.setDataMetadata(dataMetadata); } } } }
if (hasMetadata instanceof HasDefinitionMetadata) { final HasDefinitionMetadata oDef = (HasDefinitionMetadata) hasMetadata; names.add(oDef.getDefinitionName()); if (oDef.getDefinitionMetadata() != null) { definitionMetadatas.add(oDef); final List<Object[]> updateDataMetadatas = Lists.newArrayList(); definitionMetadatas.forEach(oDef -> { final QualifiedName qualifiedName = oDef.getDefinitionName(); if (qualifiedName != null && oDef.getDefinitionMetadata() != null && oDef.getDefinitionMetadata().size() != 0) { final String name = qualifiedName.toString(); final ObjectNode oNode = definitionMap.get(name); if (oNode == null) { final Object[] o = new Object[]{ metacatJson.toJsonString(oDef.getDefinitionMetadata()), user, user, name, }; if (qualifiedName.isPartitionDefinition()) { insertPartitionDefinitionMetadatas.add(o); metacatJson.mergeIntoPrimary(oNode, oDef.getDefinitionMetadata()); final Object[] o = new Object[]{metacatJson.toJsonString(oNode), user, name}; if (qualifiedName.isPartitionDefinition()) {