/** * Convenience constructor for a single scope. * * @param scope the scope for all metadata * @param tags the names of the tags for this scope * @param properties the property names and values for this scope */ public Metadata(MetadataScope scope, Set<String> tags, Map<String, String> properties) { this.tags = tags.stream().map(tag -> new ScopedName(scope, tag)).collect(Collectors.toSet()); this.properties = properties.entrySet().stream().collect(Collectors.toMap( entry -> new ScopedName(scope, entry.getKey()), Map.Entry::getValue)); }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } if (!super.equals(o)) { return false; } ScopedNameOfKind that = (ScopedNameOfKind) o; return kind == that.kind; }
/** * @return all tags for the given scope */ public Set<String> getTags(MetadataScope scope) { return tags.stream() .filter(tag -> scope.equals(tag.getScope())) .map(ScopedName::getName) .collect(Collectors.toSet()); }
@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 int hashCode() { return Objects.hash(super.hashCode(), kind); }
@Override public String toString() { return '(' + kind.name().toLowerCase() + ')' + super.toString(); } }
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 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); }
ImmutableSet.of(new ScopedName(SYSTEM, "a"), new ScopedName(USER, "b")), ImmutableMap.of(new ScopedName(SYSTEM, "p"), "v", new ScopedName(USER, "k"), "v1")); change = mds.apply(new Update(entity, metadata)); Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change); ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(USER, "up1"), "uv1", new ScopedName(USER, "up2"), "uv2")); MetadataMutation create = new MetadataMutation.Create(entity, metadata, Collections.emptyMap()); change = mds.apply(create); ImmutableSet.of(new ScopedName(SYSTEM, "nst0")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp0"), "sv0")); MetadataMutation recreate = new MetadataMutation.Create(entity, recreatedMetadata, ImmutableMap.of( new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), MetadataDirective.KEEP, ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst0"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2",
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); }
program, new Metadata(ImmutableSet.of(), ImmutableMap.of(new ScopedName(USER, "key1"), "value1", new ScopedName(USER, "key2"), "value2", new ScopedName(USER, "multiword"), multiWordValue, new ScopedName(SYSTEM, "key3"), "value1")));
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())))); }
program, new Metadata(USER, props("key1", "value1", "key2", "value2", "multiword", multiWordValue))); MetadataRecord datasetRecord = new MetadataRecord(dataset, new Metadata(ImmutableSet.of(), ImmutableMap.of(new ScopedName(SYSTEM, "sKey1"), "sValue1", new ScopedName(USER, "Key1"), "Value1")));
Metadata metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "sysTag"), new ScopedName(USER, "userTag")), ImmutableMap.of(new ScopedName(SYSTEM, "sysProp"), "sysVal", new ScopedName(USER, "userProp"), "userVal")); MetadataChange change = mds.apply(new Update(entity, metadata)); Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change);