/** * Helper method to merge disjoint metadata objects. This is used to merge the metadata fro (up to) two * metadata records returned by the datasets (one per scope) into a single Metadata object. */ private static Metadata mergeDisjointMetadata(Metadata meta, Metadata other) { return new Metadata(Sets.union(meta.getTags(), other.getTags()), // this will not conflict because the two metadata are mutually disjoint ImmutableMap.<ScopedName, String>builder() .putAll(meta.getProperties()) .putAll(other.getProperties()).build()); } }
@Override public Map<String, String> getProperties(MetadataEntity entity) { Metadata metadata = performRead(new Read(entity, MetadataKind.PROPERTY)); return metadata.getProperties().entrySet().stream() .collect(Collectors.toMap(entry -> entry.getKey().getName(), Map.Entry::getValue)); }
@Override public Map<String, String> getProperties(MetadataScope scope, MetadataEntity entity) { Metadata metadata = performRead(new Read(entity, scope, MetadataKind.PROPERTY)); return metadata.getProperties(scope); }
@Override public Set<MetadataRecord> getMetadata(MetadataEntity metadataEntity) { Metadata metadata = performRead(new Read(metadataEntity)); return MetadataScope.ALL.stream() .map(scope -> new MetadataRecord(metadataEntity, scope, metadata.getProperties(scope), metadata.getTags(scope))) .collect(Collectors.toSet()); }
private MetadataChange update(MetadataDatasetContext context, MetadataEntity entity, Metadata updates) { Set<String> userTagsToAdd = new HashSet<>(); Set<String> systemTagsToAdd = new HashSet<>(); Map<String, String> userPropertiesToAdd = new HashMap<>(); Map<String, String> systemPropertiesToAdd = new HashMap<>(); updates.getTags().forEach(tag -> (USER == tag.getScope() ? userTagsToAdd : systemTagsToAdd).add(tag.getName())); updates.getProperties().forEach( (key, value) -> (USER == key.getScope() ? userPropertiesToAdd : systemPropertiesToAdd).put(key.getName(), value)); MetadataDataset.Change userChange = addInScope(context, USER, entity, userTagsToAdd, userPropertiesToAdd); MetadataDataset.Change systemChange = addInScope(context, SYSTEM, entity, systemTagsToAdd, systemPropertiesToAdd); return combineChanges(entity, userChange, systemChange); }
private MetadataChange create(MetadataDatasetContext context, MetadataEntity entity, Metadata metadata, Map<ScopedNameOfKind, MetadataDirective> directives) { Set<String> newUserTags = new HashSet<>(); Set<String> newSystemTags = new HashSet<>(); Map<String, String> newUserProperties = new HashMap<>(); Map<String, String> newSystemProperties = new HashMap<>(); metadata.getTags().forEach(tag -> (USER == tag.getScope() ? newUserTags : newSystemTags).add(tag.getName())); metadata.getProperties().forEach( (key, value) -> (USER == key.getScope() ? newUserProperties : newSystemProperties).put(key.getName(), value)); MetadataDataset.Change userChange = replaceInScope(context, USER, entity, newUserTags, newUserProperties, directives); MetadataDataset.Change systemChange = replaceInScope(context, SYSTEM, entity, newSystemTags, newSystemProperties, directives); return combineChanges(entity, userChange, systemChange); }
protected static Metadata union(Metadata meta, Metadata other) { return new Metadata(Sets.union(meta.getTags(), other.getTags()), ImmutableMap.<ScopedName, String>builder() .putAll(meta.getProperties()) .putAll(other.getProperties()).build()); }
@Override public MetadataRecord getMetadata(MetadataScope scope, MetadataEntity metadataEntity) { Metadata metadata = performRead(new Read(metadataEntity, scope)); return new MetadataRecord(metadataEntity, scope, metadata.getProperties(scope), metadata.getTags(scope)); }
private void publishAudit(MetadataChange change, MetadataScope scope) { Map<String, String> propsBefore = change.getBefore().getProperties(scope); Map<String, String> propsAfter = change.getAfter().getProperties(scope); Set<String> tagsBefore = change.getBefore().getTags(scope); Set<String> tagsAfter = change.getAfter().getTags(scope);
private Metadata filterBy(Metadata metadata, MetadataScope scope, MetadataKind kind) { //noinspection ConstantConditions return new Metadata( kind == PROPERTY ? Collections.emptySet() : Sets.filter(metadata.getTags(), tag -> scope == null || scope.equals(tag.getScope())), kind == MetadataKind.TAG ? Collections.EMPTY_MAP : Maps.filterKeys(metadata.getProperties(), key -> scope == null || scope.equals(key.getScope()))); }
private Metadata filterBy(Metadata metadata, ImmutableSet<ScopedNameOfKind> selection) { //noinspection ConstantConditions return new Metadata( Sets.filter(metadata.getTags(), tag -> selection.contains(new ScopedNameOfKind(MetadataKind.TAG, tag.getScope(), tag.getName()))), Maps.filterKeys(metadata.getProperties(), key -> selection.contains(new ScopedNameOfKind(PROPERTY, key.getScope(), key.getName())))); }
Map<MetadataScope, co.cask.cdap.api.metadata.Metadata> metaMap = new HashMap<>(); MetadataScope.ALL.forEach(scope -> { Map<String, String> props = record.getMetadata().getProperties(scope); Set<String> tags = record.getMetadata().getTags(scope); if (!props.isEmpty() || !tags.isEmpty()) {