From c22d52d1bcf2e7b654e920e8f097236b58a03bef Mon Sep 17 00:00:00 2001 From: leifker Date: Wed, 4 May 2022 09:53:08 -0500 Subject: [PATCH] feat(protobuf): adding deprecation support for datasets and fields (#4634) --- .../libs/datahub-protobuf.jar | Bin 91717 -> 96519 bytes .../schema/protobuf/meta/meta.proto | 19 ++-- .../v1/clickstream/ImpressionEvent.proto | 8 +- .../java/datahub-protobuf/README.md | 101 ++++++++++++++++-- .../datahub/protobuf/ProtobufDataset.java | 16 +-- .../java/datahub/protobuf/ProtobufUtils.java | 96 ++++++++++++++++- .../visitors/ProtobufExtensionUtil.java | 37 ++++--- .../visitors/dataset/DatasetVisitor.java | 11 +- .../visitors/dataset/DeprecationVisitor.java | 53 +++++++++ .../visitors/dataset/DomainVisitor.java | 9 +- .../visitors/dataset/OwnershipVisitor.java | 8 +- ...pertyVisitor.java => PropertyVisitor.java} | 9 +- ...isitor.java => TagAssociationVisitor.java} | 8 +- ...sitor.java => TermAssociationVisitor.java} | 6 +- .../field/ProtobufExtensionFieldVisitor.java | 17 +-- ...tensionTagVisitor.java => TagVisitor.java} | 15 +-- ...itorTest.java => PropertyVisitorTest.java} | 35 +++--- ...t.java => TermAssociationVisitorTest.java} | 6 +- .../ProtobufExtensionFieldVisitorTest.java | 1 + ...agVisitorTest.java => TagVisitorTest.java} | 18 ++-- .../extended_protobuf/messageA.protoc | Bin 57698 -> 58202 bytes .../extended_protobuf/messageB.proto | 14 ++- .../extended_protobuf/messageB.protoc | Bin 57713 -> 58414 bytes .../extended_protobuf/meta/meta.proto | 16 +-- 24 files changed, 403 insertions(+), 100 deletions(-) create mode 100644 metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DeprecationVisitor.java rename metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/{ProtobufExtensionPropertyVisitor.java => PropertyVisitor.java} (83%) rename metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/{ProtobufExtensionTagAssocVisitor.java => TagAssociationVisitor.java} (68%) rename metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/{ProtobufExtensionTermAssocVisitor.java => TermAssociationVisitor.java} (69%) rename metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/{ProtobufExtensionTagVisitor.java => TagVisitor.java} (73%) rename metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/{ProtobufExtensionPropertyVisitorTest.java => PropertyVisitorTest.java} (51%) rename metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/{ProtobufExtensionTermAssocVisitorTest.java => TermAssociationVisitorTest.java} (87%) rename metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/{ProtobufExtensionTagVisitorTest.java => TagVisitorTest.java} (87%) diff --git a/metadata-integration/java/datahub-protobuf-example/libs/datahub-protobuf.jar b/metadata-integration/java/datahub-protobuf-example/libs/datahub-protobuf.jar index 0d4197a7048cbe9ecde597806ac97213e19c2003..53486ecb61879ff8b0b57c5de431e34ec6eb93b1 100644 GIT binary patch delta 52142 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 delta 47448 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 getFieldOptions(DescriptorProtos.FieldDescriptorProto fieldProto) { + try { + LinkedList> options = new LinkedList<>(); + + options.addAll(((Map) FIELD_OPT_EXT_FIELDS_METHOD.invoke(fieldProto.getOptions())) + .entrySet() + .stream() + .map(e -> Pair.of(e.getKey(), e.getValue())) + .collect(Collectors.toList())); + + options.addAll(((Map) FIELD_OPT_ALL_FIELD_METHOD.invoke(fieldProto.getOptions(), false)) + .entrySet() + .stream() + .map(e -> Pair.of(e.getKey(), e.getValue())) + .collect(Collectors.toList())); + + return options; + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + public static List> getMessageOptions(DescriptorProtos.DescriptorProto messageProto) { + try { + LinkedList> options = new LinkedList<>(); + + options.addAll(((Map) MSG_OPT_EXT_FIELDS_METHOD.invoke(messageProto.getOptions())) + .entrySet() + .stream() + .map(e -> Pair.of(e.getKey(), e.getValue())) + .collect(Collectors.toList())); + + options.addAll(((Map) MSG_OPT_ALL_FIELD_METHOD.invoke(messageProto.getOptions(), + false)) + .entrySet() + .stream() + .map(e -> Pair.of(e.getKey(), e.getValue())) + .collect(Collectors.toList())); + + return options; + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + public static ExtensionRegistry buildRegistry(DescriptorProtos.FileDescriptorSet fileSet) { ExtensionRegistry registry = ExtensionRegistry.newInstance(); Map descriptorProtoMap = fileSet.getFileList().stream() @@ -94,7 +186,9 @@ public class ProtobufUtils { // Finally, construct the actual descriptor. Descriptors.FileDescriptor[] empty = new Descriptors.FileDescriptor[0]; - return Descriptors.FileDescriptor.buildFrom(descriptorProto, dependencies.build().toArray(empty), false); + Descriptors.FileDescriptor descript = Descriptors.FileDescriptor.buildFrom(descriptorProto, dependencies.build().toArray(empty), false); + descriptorCache.put(descript.getName(), descript); + return descript; } } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/ProtobufExtensionUtil.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/ProtobufExtensionUtil.java index 1541ca1e16..c14217fb9a 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/ProtobufExtensionUtil.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/ProtobufExtensionUtil.java @@ -8,9 +8,11 @@ import com.google.protobuf.InvalidProtocolBufferException; import com.linkedin.common.GlossaryTermAssociation; import com.linkedin.common.urn.GlossaryTermUrn; import com.linkedin.tag.TagProperties; +import com.linkedin.util.Pair; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -30,14 +32,14 @@ public class ProtobufExtensionUtil { } public enum DataHubMetadataType { - PROPERTY, TAG, TAG_LIST, TERM, OWNER, DOMAIN; + PROPERTY, TAG, TAG_LIST, TERM, OWNER, DOMAIN, DEPRECATION; public static final String PROTOBUF_TYPE = "DataHubMetadataType"; } - public static Map filterByDataHubType(Map options, + public static List> filterByDataHubType(List> options, ExtensionRegistry registry, DataHubMetadataType filterType) { - return options.entrySet().stream() + return options.stream() .filter(entry -> { DescriptorProtos.FieldDescriptorProto extendedProtoOptions = extendProto(entry.getKey().toProto(), registry); Optional dataHubMetadataType = extendedProtoOptions.getOptions().getAllFields().entrySet().stream() @@ -55,8 +57,7 @@ public class ProtobufExtensionUtil { .findFirst(); return filterType.equals(dataHubMetadataType.orElse(DataHubMetadataType.PROPERTY)); - }) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + }).collect(Collectors.toList()); } public static Stream> getProperties(Descriptors.FieldDescriptor field, DescriptorProtos.DescriptorProto value) { @@ -67,12 +68,12 @@ public class ProtobufExtensionUtil { }); } - public static Stream extractTagPropertiesFromOptions(Map options, ExtensionRegistry registry) { - Stream tags = filterByDataHubType(options, registry, DataHubMetadataType.TAG).entrySet().stream() + public static Stream extractTagPropertiesFromOptions(List> options, ExtensionRegistry registry) { + Stream tags = filterByDataHubType(options, registry, DataHubMetadataType.TAG).stream() .filter(e -> e.getKey().isExtension()) .flatMap(extEntry -> { if (extEntry.getKey().isRepeated()) { - return ((Collection) extEntry.getValue()).stream().map(v -> Map.entry(extEntry.getKey(), v)); + return ((Collection) extEntry.getValue()).stream().map(v -> Pair.of(extEntry.getKey(), v)); } else { return Stream.of(extEntry); } @@ -103,7 +104,7 @@ public class ProtobufExtensionUtil { } }).filter(Objects::nonNull); - Stream tagListTags = filterByDataHubType(options, registry, DataHubMetadataType.TAG_LIST).entrySet().stream() + Stream tagListTags = filterByDataHubType(options, registry, DataHubMetadataType.TAG_LIST).stream() .filter(e -> e.getKey().isExtension()) .flatMap(entry -> { switch (entry.getKey().getJavaType()) { @@ -117,16 +118,26 @@ public class ProtobufExtensionUtil { } }).filter(Objects::nonNull); - return Stream.concat(tags, tagListTags); + Stream deprecationTag; + if (options.stream().anyMatch(opt -> opt.getKey().getFullName().endsWith(".deprecated") + && opt.getKey().getFullName().startsWith("google.protobuf.") + && opt.getKey().getJavaType() == Descriptors.FieldDescriptor.JavaType.BOOLEAN + && (Boolean) opt.getValue())) { + deprecationTag = Stream.of(new TagProperties().setName("deprecated").setColorHex("#FF0000")); + } else { + deprecationTag = Stream.empty(); + } + + return Stream.of(tags, tagListTags, deprecationTag).reduce(Stream::concat).orElse(Stream.empty()); } - public static Stream extractTermAssociationsFromOptions(Map options, + public static Stream extractTermAssociationsFromOptions(List> fieldOptions, ExtensionRegistry registry) { - return filterByDataHubType(options, registry, DataHubMetadataType.TERM).entrySet().stream() + return filterByDataHubType(fieldOptions, registry, DataHubMetadataType.TERM).stream() .filter(e -> e.getKey().isExtension()) .flatMap(extEntry -> { if (extEntry.getKey().isRepeated()) { - return ((Collection) extEntry.getValue()).stream().map(v -> Map.entry(extEntry.getKey(), v)); + return ((Collection) extEntry.getValue()).stream().map(v -> Pair.of(extEntry.getKey(), v)); } else { return Stream.of(extEntry); } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DatasetVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DatasetVisitor.java index 60e0dff257..02a239d976 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DatasetVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DatasetVisitor.java @@ -1,5 +1,6 @@ package datahub.protobuf.visitors.dataset; +import com.linkedin.common.Deprecation; import com.linkedin.common.GlobalTags; import com.linkedin.common.GlossaryTermAssociation; import com.linkedin.common.GlossaryTermAssociationArray; @@ -30,6 +31,7 @@ import lombok.Builder; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -53,6 +55,8 @@ public class DatasetVisitor implements ProtobufModelVisitor descriptionVisitor = new DescriptionVisitor(); + @Builder.Default + private final ProtobufModelVisitor deprecationVisitor = new DeprecationVisitor(); @Override public Stream> visitGraph(VisitContext context) { @@ -90,7 +94,10 @@ public class DatasetVisitor implements ProtobufModelVisitor(DatasetUrn.ENTITY_TYPE, datasetUrn, ChangeType.UPSERT, new Domains(new DataMap(Map.of("domains", - new UrnArray(g.accept(context, domainVisitors).collect(Collectors.toList())).data()))), "domains") - ); + new UrnArray(g.accept(context, domainVisitors).collect(Collectors.toList())).data()))), "domains"), + g.accept(context, List.of(deprecationVisitor)).findFirst() + .map(dep -> new MetadataChangeProposalWrapper<>(DatasetUrn.ENTITY_TYPE, datasetUrn, ChangeType.UPSERT, + dep, "deprecation")).orElse(null) + ).filter(Objects::nonNull); } } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DeprecationVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DeprecationVisitor.java new file mode 100644 index 0000000000..612082e6a5 --- /dev/null +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DeprecationVisitor.java @@ -0,0 +1,53 @@ +package datahub.protobuf.visitors.dataset; + +import com.google.protobuf.Descriptors; +import com.linkedin.common.Deprecation; +import com.linkedin.util.Pair; +import datahub.protobuf.visitors.ProtobufExtensionUtil; +import datahub.protobuf.visitors.ProtobufModelVisitor; +import datahub.protobuf.visitors.VisitContext; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + +public class DeprecationVisitor implements ProtobufModelVisitor { + + @Override + public Stream visitGraph(VisitContext context) { + if (context.root().messageProto().getOptions().getDeprecated()) { + List> deprecationOptions = ProtobufExtensionUtil + .filterByDataHubType(getMessageOptions(context.root().messageProto()), + context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.DEPRECATION); + + String decommissionNote = deprecationOptions.stream() + .filter(opt -> opt.getKey().getJavaType() == Descriptors.FieldDescriptor.JavaType.STRING) + .flatMap(opt -> { + if (opt.getKey().isRepeated()) { + return ((Collection) opt.getValue()).stream(); + } else { + return Stream.of(opt.getValue()); + } + }) + .map(Object::toString) + .collect(Collectors.joining("\n")); + + Optional decommissionTime = deprecationOptions.stream() + .filter(opt -> opt.getKey().getJavaType() == Descriptors.FieldDescriptor.JavaType.LONG) + .map(opt -> (Long) opt.getValue()) + .findFirst(); + + return Stream.of(new Deprecation() + .setDeprecated(true) + .setNote(decommissionNote) + .setDecommissionTime(decommissionTime.orElse(0L)) + .setActor(context.getAuditStamp().getActor())); + } else { + return Stream.empty(); + } + } +} diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DomainVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DomainVisitor.java index b90f6197ff..ac9d092c23 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DomainVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/DomainVisitor.java @@ -1,19 +1,22 @@ package datahub.protobuf.visitors.dataset; import com.linkedin.common.urn.Urn; +import com.linkedin.util.Pair; import datahub.protobuf.visitors.ProtobufExtensionUtil; import datahub.protobuf.visitors.ProtobufModelVisitor; import datahub.protobuf.visitors.VisitContext; import java.util.stream.Stream; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + public class DomainVisitor implements ProtobufModelVisitor { @Override public Stream visitGraph(VisitContext context) { - return ProtobufExtensionUtil.filterByDataHubType(context.root().messageProto() - .getOptions().getAllFields(), context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.DOMAIN) - .values().stream().map(o -> + return ProtobufExtensionUtil.filterByDataHubType(getMessageOptions(context.root().messageProto()), + context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.DOMAIN) + .stream().map(Pair::getValue).map(o -> Urn.createFromTuple("domain", ((String) o).toLowerCase()) ); } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/OwnershipVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/OwnershipVisitor.java index c5ffa6535c..0f0ad2ea69 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/OwnershipVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/OwnershipVisitor.java @@ -15,13 +15,15 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Stream; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + public class OwnershipVisitor implements ProtobufModelVisitor { @Override public Stream visitGraph(VisitContext context) { - return ProtobufExtensionUtil.filterByDataHubType(context.root().messageProto() - .getOptions().getAllFields(), context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.OWNER) - .entrySet().stream() + return ProtobufExtensionUtil.filterByDataHubType(getMessageOptions(context.root().messageProto()), context.getGraph().getRegistry(), + ProtobufExtensionUtil.DataHubMetadataType.OWNER) + .stream() .flatMap(extEntry -> { if (extEntry.getKey().isRepeated()) { return ((Collection) extEntry.getValue()).stream().map(v -> Map.entry(extEntry.getKey(), v)); diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/PropertyVisitor.java similarity index 83% rename from metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitor.java rename to metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/PropertyVisitor.java index bc4569c171..9abd903f24 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/PropertyVisitor.java @@ -14,17 +14,18 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; import static datahub.protobuf.visitors.ProtobufExtensionUtil.getProperties; -public class ProtobufExtensionPropertyVisitor implements ProtobufModelVisitor { +public class PropertyVisitor implements ProtobufModelVisitor { private static final Gson GSON = new Gson(); @Override public Stream visitGraph(VisitContext context) { - Map properties = ProtobufExtensionUtil.filterByDataHubType(context.root().messageProto() - .getOptions().getAllFields(), context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.PROPERTY) - .entrySet().stream().flatMap(fd -> { + Map properties = ProtobufExtensionUtil.filterByDataHubType(getMessageOptions(context.root().messageProto()), + context.getGraph().getRegistry(), ProtobufExtensionUtil.DataHubMetadataType.PROPERTY) + .stream().flatMap(fd -> { if (fd.getKey().getJavaType() != Descriptors.FieldDescriptor.JavaType.MESSAGE) { if (fd.getKey().isRepeated()) { return Stream.of(Map.entry(fd.getKey().getName(), GSON.toJson( diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTagAssocVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TagAssociationVisitor.java similarity index 68% rename from metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTagAssocVisitor.java rename to metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TagAssociationVisitor.java index a19fc48099..f0ca32fbbc 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTagAssocVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TagAssociationVisitor.java @@ -8,13 +8,15 @@ import datahub.protobuf.visitors.VisitContext; import java.util.stream.Stream; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; -public class ProtobufExtensionTagAssocVisitor implements ProtobufModelVisitor { + +public class TagAssociationVisitor implements ProtobufModelVisitor { @Override public Stream visitGraph(VisitContext context) { - return ProtobufExtensionUtil.extractTagPropertiesFromOptions(context.root().messageProto().getOptions() - .getAllFields(), context.getGraph().getRegistry()) + return ProtobufExtensionUtil.extractTagPropertiesFromOptions(getMessageOptions(context.root().messageProto()), + context.getGraph().getRegistry()) .map(tag -> new TagAssociation().setTag(new TagUrn(tag.getName()))); } } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TermAssociationVisitor.java similarity index 69% rename from metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitor.java rename to metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TermAssociationVisitor.java index 00227954f8..7656bb5236 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/dataset/TermAssociationVisitor.java @@ -7,11 +7,13 @@ import datahub.protobuf.visitors.VisitContext; import java.util.stream.Stream; -public class ProtobufExtensionTermAssocVisitor implements ProtobufModelVisitor { +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + +public class TermAssociationVisitor implements ProtobufModelVisitor { @Override public Stream visitGraph(VisitContext context) { - return ProtobufExtensionUtil.extractTermAssociationsFromOptions(context.root().messageProto().getOptions().getAllFields(), + return ProtobufExtensionUtil.extractTermAssociationsFromOptions(getMessageOptions(context.root().messageProto()), context.getGraph().getRegistry()); } } diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitor.java index 45b72e0724..c67c7414e5 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitor.java @@ -19,16 +19,19 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import static datahub.protobuf.ProtobufUtils.getFieldOptions; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + public class ProtobufExtensionFieldVisitor extends SchemaFieldVisitor { @Override public Stream> visitField(ProtobufField field, VisitContext context) { - boolean isPrimaryKey = field.getFieldProto().getOptions().getAllFields().keySet().stream() + boolean isPrimaryKey = getFieldOptions(field.getFieldProto()).stream().map(Pair::getKey) .anyMatch(fieldDesc -> fieldDesc.getName().matches("(?i).*primary_?key")); List tags = Stream.concat( ProtobufExtensionUtil.extractTagPropertiesFromOptions( - field.getFieldProto().getOptions().getAllFields(), + getFieldOptions(field.getFieldProto()), context.getGraph().getRegistry()), promotedTags(field, context)) .distinct().map(tag -> new TagAssociation().setTag(new TagUrn(tag.getName()))) @@ -37,7 +40,7 @@ public class ProtobufExtensionFieldVisitor extends SchemaFieldVisitor { List terms = Stream.concat( ProtobufExtensionUtil.extractTermAssociationsFromOptions( - field.getFieldProto().getOptions().getAllFields(), context.getGraph().getRegistry()), + getFieldOptions(field.getFieldProto()), context.getGraph().getRegistry()), promotedTerms(field, context)) .distinct() .sorted(Comparator.comparing(a -> a.getUrn().getNameEntity())) @@ -65,8 +68,8 @@ public class ProtobufExtensionFieldVisitor extends SchemaFieldVisitor { private Stream promotedTags(ProtobufField field, VisitContext context) { if (field.isMessage()) { return context.getGraph().outgoingEdgesOf(field).stream().flatMap(e -> - ProtobufExtensionUtil.extractTagPropertiesFromOptions(e.getEdgeTarget().messageProto() - .getOptions().getAllFields(), context.getGraph().getRegistry()) + ProtobufExtensionUtil.extractTagPropertiesFromOptions(getMessageOptions(e.getEdgeTarget().messageProto()), + context.getGraph().getRegistry()) ).distinct(); } else { return Stream.of(); @@ -80,8 +83,8 @@ public class ProtobufExtensionFieldVisitor extends SchemaFieldVisitor { private Stream promotedTerms(ProtobufField field, VisitContext context) { if (field.isMessage()) { return context.getGraph().outgoingEdgesOf(field).stream().flatMap(e -> - ProtobufExtensionUtil.extractTermAssociationsFromOptions(e.getEdgeTarget().messageProto() - .getOptions().getAllFields(), context.getGraph().getRegistry()) + ProtobufExtensionUtil.extractTermAssociationsFromOptions(getMessageOptions(e.getEdgeTarget().messageProto()), + context.getGraph().getRegistry()) ).distinct(); } else { return Stream.of(); diff --git a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/ProtobufExtensionTagVisitor.java b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/TagVisitor.java similarity index 73% rename from metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/ProtobufExtensionTagVisitor.java rename to metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/TagVisitor.java index 07f2931a1a..eb41665323 100644 --- a/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/ProtobufExtensionTagVisitor.java +++ b/metadata-integration/java/datahub-protobuf/src/main/java/datahub/protobuf/visitors/tags/TagVisitor.java @@ -10,23 +10,26 @@ import datahub.protobuf.visitors.ProtobufExtensionUtil; import datahub.protobuf.visitors.VisitContext; import datahub.event.MetadataChangeProposalWrapper; +import static datahub.protobuf.ProtobufUtils.getFieldOptions; +import static datahub.protobuf.ProtobufUtils.getMessageOptions; + import java.util.stream.Stream; -public class ProtobufExtensionTagVisitor implements ProtobufModelVisitor> { +public class TagVisitor implements ProtobufModelVisitor> { private static final String TAG_PROPERTIES_ASPECT = "tagProperties"; @Override public Stream> visitGraph(VisitContext context) { - return ProtobufExtensionUtil.extractTagPropertiesFromOptions(context.root().messageProto().getOptions() - .getAllFields(), context.getGraph().getRegistry()) - .map(ProtobufExtensionTagVisitor::wrapTagProperty); + return ProtobufExtensionUtil.extractTagPropertiesFromOptions(getMessageOptions(context.root().messageProto()), + context.getGraph().getRegistry()) + .map(TagVisitor::wrapTagProperty); } @Override public Stream> visitField(ProtobufField field, VisitContext context) { - return ProtobufExtensionUtil.extractTagPropertiesFromOptions(field.getFieldProto().getOptions().getAllFields(), + return ProtobufExtensionUtil.extractTagPropertiesFromOptions(getFieldOptions(field.getFieldProto()), context.getGraph().getRegistry()) - .map(ProtobufExtensionTagVisitor::wrapTagProperty); + .map(TagVisitor::wrapTagProperty); } private static MetadataChangeProposalWrapper wrapTagProperty(TagProperties tagProperty) { diff --git a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitorTest.java b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/PropertyVisitorTest.java similarity index 51% rename from metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitorTest.java rename to metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/PropertyVisitorTest.java index e49aec91a1..2316416729 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionPropertyVisitorTest.java +++ b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/PropertyVisitorTest.java @@ -11,41 +11,48 @@ import java.util.stream.Collectors; import static datahub.protobuf.TestFixtures.getTestProtobufGraph; import static datahub.protobuf.TestFixtures.getVisitContextBuilder; +import static java.util.Map.entry; import static org.junit.jupiter.api.Assertions.assertEquals; -public class ProtobufExtensionPropertyVisitorTest { +public class PropertyVisitorTest { @Test public void extendedMessageTest() throws IOException { - ProtobufExtensionPropertyVisitor test = new ProtobufExtensionPropertyVisitor(); + PropertyVisitor test = new PropertyVisitor(); List actual = getTestProtobufGraph("extended_protobuf", "messageA") .accept(getVisitContextBuilder("extended_protobuf.Person"), List.of(test)).collect(Collectors.toList()); assertEquals(List.of( - new DatasetProperties().setCustomProperties(new StringMap(Map.of("classification_enum", "HighlyConfidential", - "bool_feature", "true", - "alert_channel", "#alerts", - "repeat_enum", "[\"ENTITY\",\"EVENT\"]", - "team", "[\"corpGroup:TeamB\",\"corpUser:datahub\"]", - "technical_owner", "[\"corpGroup:TechnicalOwner\"]", - "tag_list", "a, b, c", - "domain", "Engineering", - "repeat_string", "[\"a\",\"b\"]", - "type", "ENTITY")))), + new DatasetProperties().setCustomProperties(new StringMap(Map.ofEntries( + entry("classification_enum", "HighlyConfidential"), + entry("bool_feature", "true"), + entry("alert_channel", "#alerts"), + entry("repeat_enum", "[\"ENTITY\",\"EVENT\"]"), + entry("team", "[\"corpGroup:TeamB\",\"corpUser:datahub\"]"), + entry("technical_owner", "[\"corpGroup:TechnicalOwner\"]"), + entry("tag_list", "a, b, c"), + entry("domain", "Engineering"), + entry("repeat_string", "[\"a\",\"b\"]"), + entry("type", "ENTITY"))))), actual); } @Test public void extendedFieldTest() throws IOException { - ProtobufExtensionPropertyVisitor test = new ProtobufExtensionPropertyVisitor(); + PropertyVisitor test = new PropertyVisitor(); List actual = getTestProtobufGraph("extended_protobuf", "messageB") .accept(getVisitContextBuilder("extended_protobuf.Person"), List.of(test)).collect(Collectors.toList()); assertEquals(List.of(new DatasetProperties() - .setCustomProperties(new StringMap(Map.of("data_steward", "corpUser:datahub")))), actual); + .setCustomProperties(new StringMap(Map.ofEntries( + entry("data_steward", "corpUser:datahub"), + entry("deprecated", "true"), + entry("deprecation_note", "[\"Deprecated for this other message.\",\"Drop in replacement.\"]"), + entry("deprecation_time", "1649689387") + )))), actual); } } diff --git a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitorTest.java b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/TermAssociationVisitorTest.java similarity index 87% rename from metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitorTest.java rename to metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/TermAssociationVisitorTest.java index c86d87c3d3..04fd52cf82 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/ProtobufExtensionTermAssocVisitorTest.java +++ b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/dataset/TermAssociationVisitorTest.java @@ -14,11 +14,11 @@ import static datahub.protobuf.TestFixtures.getVisitContextBuilder; import static org.junit.jupiter.api.Assertions.assertEquals; -public class ProtobufExtensionTermAssocVisitorTest { +public class TermAssociationVisitorTest { @Test public void extendedMessageTest() throws IOException { - ProtobufExtensionTermAssocVisitor test = new ProtobufExtensionTermAssocVisitor(); + TermAssociationVisitor test = new TermAssociationVisitor(); assertEquals(Set.of( new GlossaryTermAssociation().setUrn(new GlossaryTermUrn("a")), new GlossaryTermAssociation().setUrn(new GlossaryTermUrn("b")), @@ -33,7 +33,7 @@ public class ProtobufExtensionTermAssocVisitorTest { @Test public void extendedFieldTest() throws IOException { - ProtobufExtensionTermAssocVisitor test = new ProtobufExtensionTermAssocVisitor(); + TermAssociationVisitor test = new TermAssociationVisitor(); assertEquals( Set.of(), getTestProtobufGraph("extended_protobuf", "messageB"). diff --git a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitorTest.java b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitorTest.java index 8eaeb58e7c..0a1928310b 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitorTest.java +++ b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/field/ProtobufExtensionFieldVisitorTest.java @@ -206,6 +206,7 @@ public class ProtobufExtensionFieldVisitorTest { .setGlobalTags(new GlobalTags().setTags(new TagAssociationArray( new TagAssociation().setTag(new TagUrn("MetaEnumExample.EVENT")), new TagAssociation().setTag(new TagUrn("d")), + new TagAssociation().setTag(new TagUrn("deprecated")), new TagAssociation().setTag(new TagUrn("e")), new TagAssociation().setTag(new TagUrn("f")), new TagAssociation().setTag(new TagUrn("product_type.my type")), diff --git a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/ProtobufExtensionTagVisitorTest.java b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/TagVisitorTest.java similarity index 87% rename from metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/ProtobufExtensionTagVisitorTest.java rename to metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/TagVisitorTest.java index 73824aa54d..6fe1098f5e 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/ProtobufExtensionTagVisitorTest.java +++ b/metadata-integration/java/datahub-protobuf/src/test/java/datahub/protobuf/visitors/tag/TagVisitorTest.java @@ -1,7 +1,7 @@ package datahub.protobuf.visitors.tag; import com.linkedin.tag.TagProperties; -import datahub.protobuf.visitors.tags.ProtobufExtensionTagVisitor; +import datahub.protobuf.visitors.tags.TagVisitor; import datahub.event.MetadataChangeProposalWrapper; import org.junit.Test; @@ -15,11 +15,11 @@ import static datahub.protobuf.TestFixtures.getVisitContextBuilder; import static org.junit.jupiter.api.Assertions.assertEquals; -public class ProtobufExtensionTagVisitorTest { +public class TagVisitorTest { @Test public void extendedMessageTest() throws IOException { - ProtobufExtensionTagVisitor test = new ProtobufExtensionTagVisitor(); + TagVisitor test = new TagVisitor(); assertEquals(Set.of( new TagProperties() .setName("bool_feature") @@ -44,7 +44,10 @@ public class ProtobufExtensionTagVisitorTest { .setDescription("meta.msg.repeat_string"), new TagProperties() .setName("repeat_string.b") - .setDescription("meta.msg.repeat_string") + .setDescription("meta.msg.repeat_string"), + new TagProperties() + .setName("deprecated") + .setColorHex("#FF0000") ), getTestProtobufGraph("extended_protobuf", "messageA") .accept(getVisitContextBuilder("extended_protobuf.Person"), List.of(test)) .map(MetadataChangeProposalWrapper::getAspect) @@ -71,12 +74,15 @@ public class ProtobufExtensionTagVisitorTest { .setDescription("meta.fld.tag_list"), new TagProperties() .setName("f") - .setDescription("meta.fld.tag_list") + .setDescription("meta.fld.tag_list"), + new TagProperties() + .setName("deprecated") + .setColorHex("#FF0000") ); assertEquals(expectedTagProperties, getTestProtobufGraph("extended_protobuf", "messageB") - .accept(getVisitContextBuilder("extended_protobuf.Person"), List.of(new ProtobufExtensionTagVisitor())) + .accept(getVisitContextBuilder("extended_protobuf.Person"), List.of(new TagVisitor())) .map(MetadataChangeProposalWrapper::getAspect) .collect(Collectors.toSet())); } diff --git a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageA.protoc b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageA.protoc index 94ae0487a268d99302116c9fb78805945c37f26c..b51fa43eca83e3c719444434a1e0030f65c5d915 100644 GIT binary patch delta 3365 zcmZ{m%WoT16vjPsugCTsKaz>trVmi;gvNO}A#F)XiXVB=7N;b(V<*9`lR%_aYLcpQ zC3b_<9SasUYyJkLN+84nsS*gaq_n&ih!tCeghUZy$9HD#T-!)2D)pRu&iQ@k-gCzJ z^&$KDEB5h|hx(tdJb3!>cU}KTJow_v1Ku}X5k2qh-M+K;_D=KW;X&izu-VFfJ$T{y z4{U&?Li54*{?-lr^A%$qVb>0ud;iUB-rT3mp}&x+rTG73mT&IwjoxZaK6wX zWEZ+laz=VB83*>%-REAu5zA5f>Ocow#Dl*`mq0&@BMdIaRK{^Zmkw#y$lR3IGI1oF>=VdGdsm)+$Z;o5unPy#LbA4w$lM)q#0Wzl` z%!SMWa?yd{)-tX5_p==ha5Run4RAD&F}?0NYG+bj101z8>6~nUyR|cuS=j*UWO-hy z!lZRH;CIfv8^%)DEE_uIg#waQ5I-PU1@XI(tb*VsatdN}K@8{28Bbg%?PM}LhBk4MvJ{0pu59}n&2(6A#4F32cI8L&{G zAg2x%WEA8;z=DiIdc%=HmNRt)3!9rUs`H8(UE2!Zlo;CTHuO5g;n1B!L{g|6 zLs+1$D5?hPilS;RbwyFhLD`_vVrle{tE~@yDs;3+i?ym+q{Uh_Jv1%W>e*4Lk``-q ztSmc{i?up_sl!3pnUZV~$!mOFCex<1TeKOdYl_N{x2C9!5*3v;ZB0?-rmZO|IVf9E zv3f;bl~mqE<<1#>%xpg{gEq1laiULrIUl?K|#;#fsCDmSt?p6PH09Llci`y+nxKNp~P+Xi>ev4u_dJe8_P=ZK`#*+N=gGQY-ubjk#b>6&_JIxjh3>k zko3-Nqya`*-8D^K*_NLk_U?4Y|U)#SAFkb~0CUy;<1#WwhPNey*TL+Euw{*Y-#2x%LkV_qbv8;TkNbt7?3 zGD0qNBROqLh_Kiue^sW6E{FhRQ(dS4WYhGfQvkB5AOeuh#6<}aE@U$~BN?W}wiLs3 z8MZ{4fNUv<3CNcG%xZ=S$d-bbfNUv<=|Z*?By6!7Kaf?!U5$h>@iqA;gl2?6tVL|^ z$-+R^;t4Mi$lBPHX8~Dzd0+Mwc9FH|g$@U0FRgbtK(1A9$<8Adt1D5FPEocIfvUPv z6~P?UBWENyg0l4&Ql14-btNhSQFSFM;)<#(QRJX(C5jv%*OjQK#Twjh$l}pXRYnw| z8cI|YSJhD8hA7H5;zM2@L^X!TJqw~56W8TEL|svh^m2!TvM<-=#l-Ntyv;ogu`UfU zP`A}c#E`dbo|c>#sN0Gf19e+bV=i@DQOQBsm+QO6?K_9f!*k+8AqMu|ZSEaBSpOyB F{})`HUj+aF delta 2912 zcmY+G&u<%55XZgmJ+F7)dK0>FY3UCdyCQLZG={WIo2YTzq@kiVB(ZU9%cclU9Qp&H z9+CFYJBKcR2vYbVxFA)61Erx9L?sR&ap%V!3GtoX*=PHfnKv_^@4Pp&&adCfKOV|Y z4j+ntmk*vi{8Na(oP)2wxue8WC6aF!%O5l8T(`)kHYui;XL_H#Xc3t=i&S8 zaDjZMV_!Cq$Kd<>aB%{@2bLCDD^O=LXQTIico3e+7PN;rOJo8$EhcncXUTwyY2l_8 z_|tix194OoJ|9`J<)jt@i(Z}sVU$FkkEpMb$fXvYAxv*UjtJCDWPQ}TB zivY6r{l2hg`gs>1;J`!*sj5+Zf2a=pQ;iVRxO-$;F z)TJ#d3Ekwdgj1dx~eC&LubxEOXzF0QlmSA1F>srlVc@F zLxx0qYbr?3tl)}Vo0>^YN;D7&$eMx31hNLmN$vH@1~-5@RdtnBVbVq#$i`>s4Pz-nS#?jOp@38kBnwE@K(Yy> zY9P3Y4Fj>qAa;Bfk0-9vMk5=AbO`8nHw?peLYM|(Cy)&T$px~eUS)Z?F-Q)b)XZ(= z0I7K?G6zV_KyqlLwzSQ+l}i}4$~6qTP(^$fu4Qf}lTQn1s7!0Sq3Z=sPojpf{Z#31T4s?FLh%XWW`fg$3V~+CJxHp z?8L8V(X};Hk1@2>L+DM2!(lRqh@?;+Ls+0T4Ala)VW?I@Z5S#!C>vB-EQ=m;C;I4F zW28k|tR2%LE!K{gqG_>qX69L?0BmRBP40*nYiIGwh=a1LEp8FXyQY})KBJFWn8jt#M(+8^RKY@(y~6P{ z5gPW42HMEIg?(<6H*#;WI^v-0TAMpZ;ijr_DO%BC=UHfIsxbMYS~hKL(`dlP%4Xqg zng|U|qk$H-xv;@VUf3oy&}Yq}rED1_z4H)hgV8c~O_SFO`O||uKw1W31JW`OUf7m_ zU}4+p4VFg>JA}}}whe?9w(T8BBf)5&Onx>jn-(@~7hmU2cw^h8iz5z7ztrH?5WlbL zT+11wI%s=erBCP}ZQneh1M0q^I#i{2gBhWdtjd0AnLXs7^b4;s)eU4vU0|v^Ms?9^ zhkwW{+eKQ(J(@;>+A&lY)K2j{Gu#B)DJ_Q#(Shu$RZi7o5DiGzT&M=5>!s7F0qGiu z2BcfO%n+SGx}{6Z@B-O03@>4XjPwBM8Hfi+k3X}P?E%s=5D$=^fp`g|XCV1N_SGG( znjdQ67Jw>=%k@B9Q%sms1PK{wue+uY7{+FK>-FD0{m-;sCkd zxy7CPfgBi7{-~(X_MvKERQZ^rfq#m@KFSVGms1O(21b+*Q3E5&PecujC~{D?5k(G= Z2c28*+V6jG_uk#}`eUsRuKzZb{U4@^59j~@ diff --git a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.proto b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.proto index bb8efa08b0..9cce2c0853 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.proto +++ b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.proto @@ -14,6 +14,11 @@ message Department { The comment added after thought */ message Person { + option deprecated = true; + option (meta.msg.deprecation_note) = "Deprecated for this other message."; + option (meta.msg.deprecation_note) = "Drop in replacement."; + option (meta.msg.deprecation_time) = 1649689387; + option(meta.msg.data_steward) = "corpUser:datahub"; string name = 1 [(meta.fld.classification) = "Classification.HighlyConfidential"]; // person name @@ -29,8 +34,9 @@ message Person { Department dept = 4; // department name of the person string test_coverage = 5 - [(meta.fld.product_type_bool) = true, - (meta.fld.product_type) = "my type", - (meta.fld.product_type_enum) = EVENT, - (meta.fld.tag_list) = "d, e, f"]; + [deprecated = true, + (meta.fld.product_type_bool) = true, + (meta.fld.product_type) = "my type", + (meta.fld.product_type_enum) = EVENT, + (meta.fld.tag_list) = "d, e, f"]; } diff --git a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.protoc b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/messageB.protoc index c6e189295ea6c8969023cc419710142fec2983fa..fdb8289afd2f25a356c9750e431efd0f5e5d0759 100644 GIT binary patch delta 4069 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 Hs3rafl#o+> diff --git a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/meta/meta.proto b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/meta/meta.proto index 08b179e7b8..ad11e86441 100644 --- a/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/meta/meta.proto +++ b/metadata-integration/java/datahub-protobuf/src/test/resources/extended_protobuf/meta/meta.proto @@ -16,12 +16,13 @@ import "google/protobuf/descriptor.proto"; */ enum DataHubMetadataType { - PROPERTY = 0; // Datahub Custom Property - TAG = 1; // Datahub Tag - TAG_LIST = 2; // comma delimited string - TERM = 3; // Datahub Term - OWNER = 4; // Datahub Owner - DOMAIN = 5; // Datahub Domain + PROPERTY = 0; // Datahub Custom Property + TAG = 1; // Datahub Tag + TAG_LIST = 2; // comma delimited string + TERM = 3; // Datahub Term + OWNER = 4; // Datahub Owner + DOMAIN = 5; // Datahub Domain + DEPRECATION = 6; // Datahub Deprecation } /* @@ -91,5 +92,8 @@ message msg { repeated string repeat_string = 60010 [(fld.type) = TERM, (fld.type) = TAG, (fld.type) = PROPERTY]; repeated MetaEnumExample repeat_enum = 60012 [(fld.type) = TERM, (fld.type) = TAG, (fld.type) = PROPERTY]; + + repeated string deprecation_note = 60020 [(fld.type) = DEPRECATION, (fld.type) = PROPERTY]; + uint64 deprecation_time = 60021 [(fld.type) = DEPRECATION, (fld.type) = PROPERTY]; } } \ No newline at end of file