feat(forms) Extend forms support to other entity types (#9801)

This commit is contained in:
Chris Collins 2024-02-13 15:02:52 -05:00 committed by GitHub
parent e0276cf123
commit ea4a9b281b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
71 changed files with 717 additions and 537 deletions

View File

@ -82,7 +82,8 @@ public class ChartType
DATA_PRODUCTS_ASPECT_NAME,
BROWSE_PATHS_V2_ASPECT_NAME,
SUB_TYPES_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private static final Set<String> FACET_FIELDS =
ImmutableSet.of("access", "queryType", "tool", "type");

View File

@ -7,6 +7,7 @@ import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Embed;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InputFields;
@ -41,6 +42,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.SubTypesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -128,6 +130,10 @@ public class ChartMapper implements ModelMapper<EntityResponse, Chart> {
((chart, dataMap) ->
chart.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -52,7 +52,8 @@ public class ContainerType
Constants.DOMAINS_ASPECT_NAME,
Constants.DEPRECATION_ASPECT_NAME,
Constants.DATA_PRODUCTS_ASPECT_NAME,
Constants.STRUCTURED_PROPERTIES_ASPECT_NAME);
Constants.STRUCTURED_PROPERTIES_ASPECT_NAME,
Constants.FORMS_ASPECT_NAME);
private static final Set<String> FACET_FIELDS = ImmutableSet.of("origin", "platform");
private static final String ENTITY_NAME = "container";

View File

@ -4,6 +4,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -26,6 +27,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.SubTypesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
import com.linkedin.datahub.graphql.types.tag.mappers.GlobalTagsMapper;
@ -148,6 +150,12 @@ public class ContainerMapper {
new StructuredProperties(envelopedStructuredProps.getValue().data())));
}
final EnvelopedAspect envelopedForms = aspects.get(FORMS_ASPECT_NAME);
if (envelopedForms != null) {
result.setForms(
FormsMapper.map(new Forms(envelopedForms.getValue().data()), entityUrn.toString()));
}
return result;
}

View File

@ -2,6 +2,7 @@ package com.linkedin.datahub.graphql.types.corpgroup.mappers;
import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.Forms;
import com.linkedin.common.Origin;
import com.linkedin.common.Ownership;
import com.linkedin.common.urn.Urn;
@ -10,6 +11,7 @@ import com.linkedin.datahub.graphql.generated.CorpGroup;
import com.linkedin.datahub.graphql.generated.EntityType;
import com.linkedin.datahub.graphql.types.common.mappers.OwnershipMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
import com.linkedin.entity.EntityResponse;
@ -52,6 +54,10 @@ public class CorpGroupMapper implements ModelMapper<EntityResponse, CorpGroup> {
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
if (aspectMap.containsKey(ORIGIN_ASPECT_NAME)) {
mappingHelper.mapToResult(ORIGIN_ASPECT_NAME, this::mapEntityOriginType);
} else {

View File

@ -2,6 +2,7 @@ package com.linkedin.datahub.graphql.types.corpuser.mappers;
import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.urn.Urn;
import com.linkedin.data.DataMap;
@ -15,6 +16,7 @@ import com.linkedin.datahub.graphql.generated.DataHubView;
import com.linkedin.datahub.graphql.generated.EntityType;
import com.linkedin.datahub.graphql.types.common.mappers.CustomPropertiesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
import com.linkedin.datahub.graphql.types.tag.mappers.GlobalTagsMapper;
import com.linkedin.entity.EntityResponse;
@ -80,6 +82,10 @@ public class CorpUserMapper {
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
mapCorpUserSettings(
result, aspectMap.getOrDefault(CORP_USER_SETTINGS_ASPECT_NAME, null), featureFlags);

View File

@ -82,7 +82,8 @@ public class DashboardType
EMBED_ASPECT_NAME,
DATA_PRODUCTS_ASPECT_NAME,
BROWSE_PATHS_V2_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private static final Set<String> FACET_FIELDS = ImmutableSet.of("access", "tool");
private final EntityClient _entityClient;

View File

@ -6,6 +6,7 @@ import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Embed;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InputFields;
@ -39,6 +40,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.SubTypesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -129,6 +131,10 @@ public class DashboardMapper implements ModelMapper<EntityResponse, Dashboard> {
((dashboard, dataMap) ->
dashboard.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -77,7 +77,8 @@ public class DataFlowType
DATA_PLATFORM_INSTANCE_ASPECT_NAME,
DATA_PRODUCTS_ASPECT_NAME,
BROWSE_PATHS_V2_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private static final Set<String> FACET_FIELDS = ImmutableSet.of("orchestrator", "cluster");
private final EntityClient _entityClient;

View File

@ -5,6 +5,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -28,6 +29,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -106,6 +108,10 @@ public class DataFlowMapper implements ModelMapper<EntityResponse, DataFlow> {
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -79,7 +79,8 @@ public class DataJobType
DATA_PRODUCTS_ASPECT_NAME,
BROWSE_PATHS_V2_ASPECT_NAME,
SUB_TYPES_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private static final Set<String> FACET_FIELDS = ImmutableSet.of("flow");
private final EntityClient _entityClient;

View File

@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList;
import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -33,6 +34,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.SubTypesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -124,6 +126,8 @@ public class DataJobMapper implements ModelMapper<EntityResponse, DataJob> {
} else if (STRUCTURED_PROPERTIES_ASPECT_NAME.equals(name)) {
result.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(data)));
} else if (FORMS_ASPECT_NAME.equals(name)) {
result.setForms(FormsMapper.map(new Forms(data), entityUrn.toString()));
}
});

View File

@ -3,6 +3,7 @@ package com.linkedin.datahub.graphql.types.dataproduct;
import static com.linkedin.metadata.Constants.DATA_PRODUCT_ENTITY_NAME;
import static com.linkedin.metadata.Constants.DATA_PRODUCT_PROPERTIES_ASPECT_NAME;
import static com.linkedin.metadata.Constants.DOMAINS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.FORMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOBAL_TAGS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOSSARY_TERMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.INSTITUTIONAL_MEMORY_ASPECT_NAME;
@ -51,7 +52,8 @@ public class DataProductType
GLOSSARY_TERMS_ASPECT_NAME,
DOMAINS_ASPECT_NAME,
INSTITUTIONAL_MEMORY_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private final EntityClient _entityClient;
@Override

View File

@ -2,12 +2,14 @@ package com.linkedin.datahub.graphql.types.dataproduct.mappers;
import static com.linkedin.metadata.Constants.DATA_PRODUCT_PROPERTIES_ASPECT_NAME;
import static com.linkedin.metadata.Constants.DOMAINS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.FORMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOBAL_TAGS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOSSARY_TERMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.INSTITUTIONAL_MEMORY_ASPECT_NAME;
import static com.linkedin.metadata.Constants.OWNERSHIP_ASPECT_NAME;
import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTIES_ASPECT_NAME;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -22,6 +24,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.InstitutionalMemoryMapp
import com.linkedin.datahub.graphql.types.common.mappers.OwnershipMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -82,6 +85,10 @@ public class DataProductMapper implements ModelMapper<EntityResponse, DataProduc
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return result;
}

View File

@ -1,7 +1,9 @@
package com.linkedin.datahub.graphql.types.domain;
import static com.linkedin.metadata.Constants.FORMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTIES_ASPECT_NAME;
import com.linkedin.common.Forms;
import com.linkedin.common.InstitutionalMemory;
import com.linkedin.common.Ownership;
import com.linkedin.common.urn.Urn;
@ -9,6 +11,7 @@ import com.linkedin.datahub.graphql.generated.Domain;
import com.linkedin.datahub.graphql.generated.EntityType;
import com.linkedin.datahub.graphql.types.common.mappers.InstitutionalMemoryMapper;
import com.linkedin.datahub.graphql.types.common.mappers.OwnershipMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
import com.linkedin.domain.DomainProperties;
import com.linkedin.entity.EntityResponse;
@ -64,6 +67,12 @@ public class DomainMapper {
new StructuredProperties(envelopedStructuredProps.getValue().data())));
}
final EnvelopedAspect envelopedForms = aspects.get(FORMS_ASPECT_NAME);
if (envelopedForms != null) {
result.setForms(
FormsMapper.map(new Forms(envelopedForms.getValue().data()), entityUrn.toString()));
}
return result;
}

View File

@ -39,7 +39,8 @@ public class DomainType
Constants.DOMAIN_PROPERTIES_ASPECT_NAME,
Constants.OWNERSHIP_ASPECT_NAME,
Constants.INSTITUTIONAL_MEMORY_ASPECT_NAME,
Constants.STRUCTURED_PROPERTIES_ASPECT_NAME);
Constants.STRUCTURED_PROPERTIES_ASPECT_NAME,
Constants.FORMS_ASPECT_NAME);
private final EntityClient _entityClient;
public DomainType(final EntityClient entityClient) {

View File

@ -1,5 +1,6 @@
package com.linkedin.datahub.graphql.types.glossary;
import static com.linkedin.metadata.Constants.FORMS_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOSSARY_NODE_ENTITY_NAME;
import static com.linkedin.metadata.Constants.GLOSSARY_NODE_INFO_ASPECT_NAME;
import static com.linkedin.metadata.Constants.GLOSSARY_NODE_KEY_ASPECT_NAME;
@ -33,7 +34,8 @@ public class GlossaryNodeType
GLOSSARY_NODE_KEY_ASPECT_NAME,
GLOSSARY_NODE_INFO_ASPECT_NAME,
OWNERSHIP_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private final EntityClient _entityClient;

View File

@ -59,7 +59,8 @@ public class GlossaryTermType
BROWSE_PATHS_ASPECT_NAME,
DOMAINS_ASPECT_NAME,
DEPRECATION_ASPECT_NAME,
STRUCTURED_PROPERTIES_ASPECT_NAME);
STRUCTURED_PROPERTIES_ASPECT_NAME,
FORMS_ASPECT_NAME);
private final EntityClient _entityClient;

View File

@ -2,6 +2,7 @@ package com.linkedin.datahub.graphql.types.glossary.mappers;
import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.Forms;
import com.linkedin.common.Ownership;
import com.linkedin.common.urn.Urn;
import com.linkedin.data.DataMap;
@ -11,6 +12,7 @@ import com.linkedin.datahub.graphql.generated.GlossaryNodeProperties;
import com.linkedin.datahub.graphql.types.common.mappers.CustomPropertiesMapper;
import com.linkedin.datahub.graphql.types.common.mappers.OwnershipMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
import com.linkedin.entity.EntityResponse;
@ -51,6 +53,10 @@ public class GlossaryNodeMapper implements ModelMapper<EntityResponse, GlossaryN
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -3,6 +3,7 @@ package com.linkedin.datahub.graphql.types.glossary.mappers;
import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.InstitutionalMemory;
import com.linkedin.common.Ownership;
import com.linkedin.common.urn.Urn;
@ -15,6 +16,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.InstitutionalMemoryMapp
import com.linkedin.datahub.graphql.types.common.mappers.OwnershipMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.GlossaryTermUtils;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -81,6 +83,10 @@ public class GlossaryTermMapper implements ModelMapper<EntityResponse, GlossaryT
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
// If there's no name property, resort to the legacy name computation.
if (result.getGlossaryTermInfo() != null && result.getGlossaryTermInfo().getName() == null) {

View File

@ -5,6 +5,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -26,6 +27,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -104,6 +106,10 @@ public class MLFeatureMapper implements ModelMapper<EntityResponse, MLFeature> {
((mlFeature, dataMap) ->
mlFeature.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -5,6 +5,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -26,6 +27,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -107,6 +109,10 @@ public class MLFeatureTableMapper implements ModelMapper<EntityResponse, MLFeatu
((mlFeatureTable, dataMap) ->
mlFeatureTable.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -5,6 +5,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.Ownership;
@ -25,6 +26,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -99,6 +101,10 @@ public class MLModelGroupMapper implements ModelMapper<EntityResponse, MLModelGr
((mlModelGroup, dataMap) ->
mlModelGroup.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -6,6 +6,7 @@ import com.linkedin.common.BrowsePathsV2;
import com.linkedin.common.Cost;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -29,6 +30,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -164,6 +166,10 @@ public class MLModelMapper implements ModelMapper<EntityResponse, MLModel> {
((dataset, dataMap) ->
dataset.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -4,6 +4,7 @@ import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.DataPlatformInstance;
import com.linkedin.common.Deprecation;
import com.linkedin.common.Forms;
import com.linkedin.common.GlobalTags;
import com.linkedin.common.GlossaryTerms;
import com.linkedin.common.InstitutionalMemory;
@ -24,6 +25,7 @@ import com.linkedin.datahub.graphql.types.common.mappers.StatusMapper;
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
import com.linkedin.datahub.graphql.types.common.mappers.util.SystemMetadataUtils;
import com.linkedin.datahub.graphql.types.domain.DomainAssociationMapper;
import com.linkedin.datahub.graphql.types.form.FormsMapper;
import com.linkedin.datahub.graphql.types.glossary.mappers.GlossaryTermsMapper;
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
import com.linkedin.datahub.graphql.types.structuredproperty.StructuredPropertiesMapper;
@ -99,6 +101,10 @@ public class MLPrimaryKeyMapper implements ModelMapper<EntityResponse, MLPrimary
((entity, dataMap) ->
entity.setStructuredProperties(
StructuredPropertiesMapper.map(new StructuredProperties(dataMap)))));
mappingHelper.mapToResult(
FORMS_ASPECT_NAME,
((entity, dataMap) ->
entity.setForms(FormsMapper.map(new Forms(dataMap), entityUrn.toString()))));
return mappingHelper.getResult();
}

View File

@ -1988,6 +1988,11 @@ type GlossaryTerm implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -2136,6 +2141,11 @@ type GlossaryNode implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -2552,6 +2562,11 @@ type Container implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -2932,6 +2947,11 @@ type SchemaFieldEntity implements Entity {
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
"""
Granular API for querying edges extending from this entity
"""
@ -3580,6 +3600,11 @@ type CorpUser implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -3951,6 +3976,11 @@ type CorpGroup implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -5130,6 +5160,11 @@ type Dashboard implements EntityWithRelationships & Entity & BrowsableEntity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -5451,6 +5486,11 @@ type Chart implements EntityWithRelationships & Entity & BrowsableEntity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -5819,6 +5859,11 @@ type DataFlow implements EntityWithRelationships & Entity & BrowsableEntity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -6030,6 +6075,11 @@ type DataJob implements EntityWithRelationships & Entity & BrowsableEntity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -8986,6 +9036,11 @@ type MLModel implements EntityWithRelationships & Entity & BrowsableEntity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -9108,6 +9163,11 @@ type MLModelGroup implements EntityWithRelationships & Entity & BrowsableEntity
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
type MLModelGroupProperties {
@ -9243,6 +9303,11 @@ type MLFeature implements EntityWithRelationships & Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
type MLHyperParam {
@ -9423,6 +9488,11 @@ type MLPrimaryKey implements EntityWithRelationships & Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
type MLPrimaryKeyProperties {
@ -9561,6 +9631,11 @@ type MLFeatureTable implements EntityWithRelationships & Entity & BrowsableEntit
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
type MLFeatureTableEditableProperties {
@ -9963,6 +10038,11 @@ type Domain implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""
@ -11356,6 +11436,11 @@ type DataProduct implements Entity {
Structured properties about this asset
"""
structuredProperties: StructuredProperties
"""
The forms associated with the Dataset
"""
forms: Forms
}
"""

View File

@ -7,6 +7,7 @@ import { Entity, EntityCapabilityType, IconStyleType, PreviewType } from '../Ent
import { getDataForEntityType } from '../shared/containers/profile/utils';
import { urlEncodeUrn } from '../shared/utils';
import RoleEntityProfile from './RoleEntityProfile';
import { useGetExternalRoleQuery } from '../../../graphql/accessrole.generated';
const PreviewTagIcon = styled(TagOutlined)`
font-size: 20px;
@ -50,6 +51,8 @@ export class RoleEntity implements Entity<Role> {
getEntityName: () => string = () => 'Role';
useEntityQuery = useGetExternalRoleQuery;
renderProfile: (urn: string) => JSX.Element = (_) => <RoleEntityProfile />;
renderPreview = (_: PreviewType, data: Role) => (

View File

@ -1,4 +1,5 @@
import { EntityType, SearchResult } from '../../types.generated';
import { QueryHookOptions, QueryResult } from '@apollo/client';
import { EntityType, Exact, SearchResult } from '../../types.generated';
import { FetchedEntity } from '../lineage/types';
import { EntitySidebarSection, GenericEntityProperties } from './shared/types';
@ -181,4 +182,21 @@ export interface Entity<T> {
* Returns the entity profile sidebar sections for an entity type. Only implemented on Datasets for now.
*/
getSidebarSections?: () => EntitySidebarSection[];
/**
* Get the query necessary for refetching data on an entity profile page
*/
useEntityQuery?: (
baseOptions: QueryHookOptions<
any,
Exact<{
urn: string;
}>
>,
) => QueryResult<
any,
Exact<{
urn: string;
}>
>;
}

View File

@ -1,5 +1,6 @@
import { QueryHookOptions, QueryResult } from '@apollo/client';
import React from 'react';
import { Entity as EntityInterface, EntityType, SearchResult } from '../../types.generated';
import { Entity as EntityInterface, EntityType, Exact, SearchResult } from '../../types.generated';
import { FetchedEntity } from '../lineage/types';
import { SearchResultProvider } from '../search/context/SearchResultContext';
import { Entity, EntityCapabilityType, IconStyleType, PreviewType } from './Entity';
@ -115,6 +116,25 @@ export default class EntityRegistry {
}
}
getEntityQuery(type: EntityType):
| ((
baseOptions: QueryHookOptions<
any,
Exact<{
urn: string;
}>
>,
) => QueryResult<
any,
Exact<{
urn: string;
}>
>)
| undefined {
const entity = validatedGet(type, this.entityTypeToEntity);
return entity.useEntityQuery;
}
renderProfile(type: EntityType, urn: string): JSX.Element {
const entity = validatedGet(type, this.entityTypeToEntity);
return entity.renderProfile(urn);

View File

@ -73,11 +73,35 @@ export class ChartEntity implements Entity<Chart> {
getCollectionName = () => 'Charts';
useEntityQuery = useGetChartQuery;
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.Chart}
useEntityQuery={useGetChartQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={useUpdateChartMutation}
getOverrideProperties={this.getOverridePropertiesFromEntity}
headerDropdownItems={new Set([EntityMenuItems.UPDATE_DEPRECATION])}
@ -127,27 +151,7 @@ export class ChartEntity implements Entity<Chart> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
@ -258,7 +262,7 @@ export class ChartEntity implements Entity<Chart> {
<EmbeddedProfile
urn={urn}
entityType={EntityType.Chart}
useEntityQuery={useGetChartQuery}
useEntityQuery={this.useEntityQuery}
getOverrideProperties={this.getOverridePropertiesFromEntity}
/>
);

View File

@ -63,11 +63,13 @@ export class ContainerEntity implements Entity<Container> {
getCollectionName = () => 'Containers';
useEntityQuery = useGetContainerQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.Container}
useEntityQuery={useGetContainerQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={undefined}
getOverrideProperties={this.getOverridePropertiesFromEntity}
tabs={[
@ -84,34 +86,36 @@ export class ContainerEntity implements Entity<Container> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
// TODO: Add back once entity-level recommendations are complete.
// {
// component: SidebarRecommendationsSection,
// },
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
// TODO: Add back once entity-level recommendations are complete.
// {
// component: SidebarRecommendationsSection,
// },
];
renderPreview = (_: PreviewType, data: Container) => {
const genericProperties = this.getGenericEntityProperties(data);
return (
@ -195,7 +199,7 @@ export class ContainerEntity implements Entity<Container> {
<EmbeddedProfile
urn={urn}
entityType={EntityType.Container}
useEntityQuery={useGetContainerQuery}
useEntityQuery={this.useEntityQuery}
getOverrideProperties={this.getOverridePropertiesFromEntity}
/>
);

View File

@ -77,11 +77,38 @@ export class DashboardEntity implements Entity<Dashboard> {
getCollectionName = () => 'Dashboards';
useEntityQuery = useGetDashboardQuery;
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.Dashboard}
useEntityQuery={useGetDashboardQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={useUpdateDashboardMutation}
getOverrideProperties={this.getOverridePropertiesFromEntity}
headerDropdownItems={new Set([EntityMenuItems.UPDATE_DEPRECATION])}
@ -135,30 +162,7 @@ export class DashboardEntity implements Entity<Dashboard> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
@ -279,7 +283,7 @@ export class DashboardEntity implements Entity<Dashboard> {
<EmbeddedProfile
urn={urn}
entityType={EntityType.Dashboard}
useEntityQuery={useGetDashboardQuery}
useEntityQuery={this.useEntityQuery}
getOverrideProperties={this.getOverridePropertiesFromEntity}
/>
);

View File

@ -58,11 +58,13 @@ export class DataFlowEntity implements Entity<DataFlow> {
getCollectionName = () => 'Pipelines';
useEntityQuery = useGetDataFlowQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.DataFlow}
useEntityQuery={useGetDataFlowQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={useUpdateDataFlowMutation}
getOverrideProperties={this.getOverridePropertiesFromEntity}
headerDropdownItems={new Set([EntityMenuItems.UPDATE_DEPRECATION])}
@ -80,33 +82,35 @@ export class DataFlowEntity implements Entity<DataFlow> {
component: DataFlowJobsTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
getOverridePropertiesFromEntity = (dataFlow?: DataFlow | null): GenericEntityProperties => {
// TODO: Get rid of this once we have correctly formed platform coming back.
const name = dataFlow?.properties?.name;

View File

@ -69,11 +69,13 @@ export class DataJobEntity implements Entity<DataJob> {
getCollectionName = () => 'Tasks';
useEntityQuery = useGetDataJobQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.DataJob}
useEntityQuery={useGetDataJobQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={useUpdateDataJobMutation}
getOverrideProperties={this.getOverridePropertiesFromEntity}
headerDropdownItems={new Set([EntityMenuItems.UPDATE_DEPRECATION])}
@ -103,33 +105,35 @@ export class DataJobEntity implements Entity<DataJob> {
},
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
getOverridePropertiesFromEntity = (dataJob?: DataJob | null): GenericEntityProperties => {
// TODO: Get rid of this once we have correctly formed platform coming back.
const name = dataJob?.properties?.name;

View File

@ -3,6 +3,7 @@ import { DatabaseOutlined } from '@ant-design/icons';
import { DataPlatform, EntityType, SearchResult } from '../../../types.generated';
import { Entity, IconStyleType, PreviewType } from '../Entity';
import { GenericEntityProperties } from '../shared/types';
import { useGetDataPlatformQuery } from '../../../graphql/dataPlatform.generated';
const getDisplayName = (data?: DataPlatform): string => {
return data?.properties?.displayName || data?.name || '';
@ -43,6 +44,8 @@ export class DataPlatformEntity implements Entity<DataPlatform> {
// Currently unused.
getCollectionName = () => 'Data Platforms';
useEntityQuery = useGetDataPlatformQuery;
// Currently unused.
renderProfile = (_: string) => <></>;

View File

@ -63,6 +63,8 @@ export class DataProductEntity implements Entity<DataProduct> {
getCollectionName = () => 'Data Products';
useEntityQuery = useGetDataProductQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -87,41 +89,42 @@ export class DataProductEntity implements Entity<DataProduct> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarViewDefinitionSection,
display: {
// to do - change when we have a GetDataProductQuery
visible: (_, dataset: GetDatasetQuery) =>
(dataset?.dataset?.viewProperties?.logic && true) || false,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
properties: {
updateOnly: true,
},
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarViewDefinitionSection,
display: {
// to do - change when we have a GetDataProductQuery
visible: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.viewProperties?.logic && true) || false,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
properties: {
updateOnly: true,
},
},
];
renderPreview = (_: PreviewType, data: DataProduct) => {
return (
<Preview

View File

@ -86,11 +86,13 @@ export class DatasetEntity implements Entity<Dataset> {
getCollectionName = () => 'Datasets';
useEntityQuery = useGetDatasetQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
entityType={EntityType.Dataset}
useEntityQuery={useGetDatasetQuery}
useEntityQuery={this.useEntityQuery}
useUpdateQuery={useUpdateDatasetMutation}
getOverrideProperties={this.getOverridePropertiesFromEntity}
headerDropdownItems={new Set([EntityMenuItems.UPDATE_DEPRECATION])}
@ -364,7 +366,7 @@ export class DatasetEntity implements Entity<Dataset> {
<EmbeddedProfile
urn={urn}
entityType={EntityType.Dataset}
useEntityQuery={useGetDatasetQuery}
useEntityQuery={this.useEntityQuery}
getOverrideProperties={this.getOverridePropertiesFromEntity}
/>
);

View File

@ -66,6 +66,8 @@ export class DomainEntity implements Entity<Domain> {
getCollectionName = () => 'Domains';
useEntityQuery = useGetDomainQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -97,17 +99,19 @@ export class DomainEntity implements Entity<Domain> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
];
renderPreview = (_: PreviewType, data: Domain) => {
return (
<Preview

View File

@ -49,6 +49,8 @@ class GlossaryNodeEntity implements Entity<GlossaryNode> {
getEntityName = () => 'Term Group';
useEntityQuery = useGetGlossaryNodeQuery;
renderProfile = (urn: string) => {
return (
<EntityProfile
@ -75,17 +77,7 @@ class GlossaryNodeEntity implements Entity<GlossaryNode> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
properties: {
hideLinksButton: true,
},
},
{
component: SidebarOwnerSection,
},
]}
sidebarSections={this.getSidebarSections()}
headerDropdownItems={
new Set([
EntityMenuItems.ADD_TERM_GROUP,
@ -98,6 +90,18 @@ class GlossaryNodeEntity implements Entity<GlossaryNode> {
);
};
getSidebarSections = () => [
{
component: SidebarAboutSection,
properties: {
hideLinksButton: true,
},
},
{
component: SidebarOwnerSection,
},
];
displayName = (data: GlossaryNode) => {
return data.properties?.name || data.urn;
};

View File

@ -57,6 +57,8 @@ export class GlossaryTermEntity implements Entity<GlossaryTerm> {
getEntityName = () => 'Glossary Term';
useEntityQuery = useGetGlossaryTermQuery;
renderProfile = (urn) => {
return (
<EntityProfile
@ -105,25 +107,27 @@ export class GlossaryTermEntity implements Entity<GlossaryTerm> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarDomainSection,
properties: {
hideOwnerType: true,
},
},
]}
sidebarSections={this.getSidebarSections()}
getOverrideProperties={this.getOverridePropertiesFromEntity}
/>
);
};
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
},
{
component: SidebarDomainSection,
properties: {
hideOwnerType: true,
},
},
];
getOverridePropertiesFromEntity = (glossaryTerm?: GlossaryTerm | null): GenericEntityProperties => {
// if dataset has subTypes filled out, pick the most specific subtype and return it
return {

View File

@ -58,6 +58,8 @@ export class MLFeatureEntity implements Entity<MlFeature> {
getCollectionName = () => 'Features';
useEntityQuery = useGetMlFeatureQuery;
getOverridePropertiesFromEntity = (feature?: MlFeature | null): GenericEntityProperties => {
return {
// eslint-disable-next-line
@ -91,33 +93,35 @@ export class MLFeatureEntity implements Entity<MlFeature> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderPreview = (_: PreviewType, data: MlFeature) => {
const genericProperties = this.getGenericEntityProperties(data);
// eslint-disable-next-line

View File

@ -63,6 +63,33 @@ export class MLFeatureTableEntity implements Entity<MlFeatureTable> {
return {};
};
useEntityQuery = useGetMlFeatureTableQuery;
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -89,30 +116,7 @@ export class MLFeatureTableEntity implements Entity<MlFeatureTable> {
component: DocumentationTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);

View File

@ -64,6 +64,33 @@ export class MLModelEntity implements Entity<MlModel> {
};
};
useEntityQuery = useGetMlModelQuery;
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -94,30 +121,7 @@ export class MLModelEntity implements Entity<MlModel> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);

View File

@ -60,6 +60,33 @@ export class MLModelGroupEntity implements Entity<MlModelGroup> {
return {};
};
useEntityQuery = useGetMlModelGroupQuery;
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -82,30 +109,7 @@ export class MLModelGroupEntity implements Entity<MlModelGroup> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);

View File

@ -64,6 +64,8 @@ export class MLPrimaryKeyEntity implements Entity<MlPrimaryKey> {
};
};
useEntityQuery = useGetMlPrimaryKeyQuery;
renderProfile = (urn: string) => (
<EntityProfile
urn={urn}
@ -89,33 +91,35 @@ export class MLPrimaryKeyEntity implements Entity<MlPrimaryKey> {
component: PropertiesTab,
},
]}
sidebarSections={[
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
]}
sidebarSections={this.getSidebarSections()}
/>
);
getSidebarSections = () => [
{
component: SidebarAboutSection,
},
{
component: SidebarOwnerSection,
properties: {
defaultOwnerType: OwnershipType.TechnicalOwner,
},
},
{
component: SidebarTagsSection,
properties: {
hasTags: true,
hasTerms: true,
},
},
{
component: SidebarDomainSection,
},
{
component: DataProductSection,
},
];
renderPreview = (_: PreviewType, data: MlPrimaryKey) => {
const genericProperties = this.getGenericEntityProperties(data);
// eslint-disable-next-line

View File

@ -7,6 +7,7 @@ import { EntityAndType, GenericEntityProperties } from '../types';
import { getFormAssociation, isFormVerificationType } from '../containers/profile/sidebar/FormInfo/utils';
import usePrevious from '../../../shared/usePrevious';
import { SCHEMA_FIELD_PROMPT_TYPES } from './constants';
import { useEntityRegistry } from '../../../useEntityRegistry';
interface Props {
children: React.ReactNode;
@ -14,6 +15,7 @@ interface Props {
}
export default function EntityFormContextProvider({ children, formUrn }: Props) {
const entityRegistry = useEntityRegistry();
const { entityData, refetch: refetchEntityProfile, loading: profileLoading } = useEntityContext();
const formAssociation = getFormAssociation(formUrn, entityData);
const initialPromptId =
@ -40,11 +42,13 @@ export default function EntityFormContextProvider({ children, formUrn }: Props)
}
}, [formUrn, previousFormUrn, initialPromptId]);
const query = entityRegistry.getEntityQuery(selectedEntity.type);
const entityQuery = query || useGetDatasetQuery;
const {
data: fetchedData,
refetch,
loading,
} = useGetDatasetQuery({
} = entityQuery({
variables: { urn: selectedEntity.urn },
});

View File

@ -15,8 +15,6 @@ import FormRequestedBy from './FormSelectionModal/FormRequestedBy';
import useHasComponentRendered from '../../../shared/useHasComponentRendered';
import Loading from '../../../shared/Loading';
import { DeferredRenderComponent } from '../../../shared/DeferredRenderComponent';
import { OnboardingTour } from '../../../onboarding/OnboardingTour';
import { FORM_ASSET_COMPLETION } from '../../../onboarding/config/FormOnboardingConfig';
const TabWrapper = styled.div`
background-color: ${ANTD_GRAY_V2[1]};
@ -62,7 +60,6 @@ function Form({ formUrn }: Props) {
return (
<TabWrapper>
<OnboardingTour stepIds={[FORM_ASSET_COMPLETION]} />
<HeaderWrapper>
<IntroTitle>
{title ? <>{title}</> : <>{entityRegistry.getEntityName(entityType)} Requirements</>}

View File

@ -8,11 +8,6 @@ import EntityContext, { useEntityContext } from '../EntityContext';
import EntityInfo from '../containers/profile/sidebar/EntityInfo/EntityInfo';
import { useEntityFormContext } from './EntityFormContext';
import ProgressBar from './ProgressBar';
import { OnboardingTour } from '../../../onboarding/OnboardingTour';
import {
FORM_QUESTION_VIEW_BUTTON,
WELCOME_TO_BULK_BY_ENTITY_ID,
} from '../../../onboarding/config/FormOnboardingConfig';
const ContentWrapper = styled.div`
background-color: ${ANTD_GRAY_V2[1]};
@ -53,7 +48,6 @@ export default function FormByEntity({ formUrn }: Props) {
refetch,
}}
>
<OnboardingTour stepIds={[WELCOME_TO_BULK_BY_ENTITY_ID, FORM_QUESTION_VIEW_BUTTON]} />
<ContentWrapper>
<ProgressBar formUrn={formUrn} />
<FlexWrapper>

View File

@ -4,8 +4,6 @@ import { Button, Divider, message } from 'antd';
import { useVerifyFormMutation } from '../../../../../graphql/form.generated';
import { useEntityContext, useMutationUrn } from '../../EntityContext';
import { PromptWrapper } from './Prompt';
import { useUpdateEducationStepsAllowList } from '../../../../onboarding/useUpdateEducationStepsAllowList';
import { FORM_ASSET_COMPLETION } from '../../../../onboarding/config/FormOnboardingConfig';
const ContentWrapper = styled.div`
display: flex;
@ -34,13 +32,11 @@ export default function VerificationPrompt({ formUrn, associatedUrn }: Props) {
const urn = useMutationUrn();
const { refetch } = useEntityContext();
const [verifyFormMutation] = useVerifyFormMutation();
const { addIdToAllowList } = useUpdateEducationStepsAllowList();
function verifyForm() {
verifyFormMutation({ variables: { input: { entityUrn: associatedUrn || urn || '', formUrn } } })
.then(() => {
refetch();
addIdToAllowList(FORM_ASSET_COMPLETION);
})
.catch(() => {
message.error('Error when verifying responses on form');

View File

@ -7,6 +7,7 @@ import { Entity, EntityCapabilityType, IconStyleType, PreviewType } from '../Ent
import { getDataForEntityType } from '../shared/containers/profile/utils';
import { urlEncodeUrn } from '../shared/utils';
import TagProfile from './TagProfile';
import { useGetTagQuery } from '../../../graphql/tag.generated';
const PreviewTagIcon = styled(TagOutlined)`
font-size: 20px;
@ -51,6 +52,8 @@ export class TagEntity implements Entity<Tag> {
getEntityName: () => string = () => 'Tag';
useEntityQuery = useGetTagQuery;
renderProfile: (urn: string) => JSX.Element = (_) => <TagProfile />;
renderPreview = (_: PreviewType, data: Tag) => (

View File

@ -1,7 +1,6 @@
import { BusinessGlossaryOnboardingConfig } from './config/BusinessGlossaryOnboardingConfig';
import { DomainsOnboardingConfig } from './config/DomainsOnboardingConfig';
import { EntityProfileOnboardingConfig } from './config/EntityProfileOnboardingConfig';
import { FormOnboardingConfig } from './config/FormOnboardingConfig';
import { GroupsOnboardingConfig } from './config/GroupsOnboardingConfig';
import { HomePageOnboardingConfig } from './config/HomePageOnboardingConfig';
import { IngestionOnboardingConfig } from './config/IngestionOnboardingConfig';
@ -24,7 +23,6 @@ const ALL_ONBOARDING_CONFIGS: OnboardingStep[][] = [
RolesOnboardingConfig,
PoliciesOnboardingConfig,
LineageGraphOnboardingConfig,
FormOnboardingConfig,
];
export const OnboardingConfig: OnboardingStep[] = ALL_ONBOARDING_CONFIGS.reduce(
(acc, config) => [...acc, ...config],

View File

@ -1,178 +0,0 @@
import { SmileOutlined } from '@ant-design/icons';
import React from 'react';
import { Typography } from 'antd';
import styled from 'styled-components';
import { OnboardingStep } from '../OnboardingStep';
import BulkTypeComparions from '../../../images/bulk-form-type-comparison.svg';
const DiagramHeader = styled.div`
display: flex;
justify-content: center;
margin: 16px 0 4px 0;
`;
const AssetCompletionHeader = styled.div`
font-size: 20px;
font-weight: normal;
`;
const ByAssetWrapper = styled.span`
margin-left: 10px;
font-size: 14px;
`;
const ByQuestionWrapper = styled.span`
margin-left: 80px;
font-size: 14px;
`;
const StyledSmile = styled(SmileOutlined)`
color: ${(props) => props.theme.styles['primary-color']};
margin-right: 4px;
`;
export const WELCOME_TO_BULK_BY_ENTITY_ID = 'welcome-to-bulk-by-entity';
export const FORM_QUESTION_VIEW_BUTTON = 'form-question-view-button';
export const FORM_ASSET_COMPLETION = 'form-asset-completion';
export const WELCOME_TO_BULK_BY_QUESTION_ID = 'welcome-to-bulk-by-question';
export const FORM_ASSETS_ASSIGNED_ID = 'form-assets-assigned';
export const FORM_FILTER_AND_BROWSE_ID = 'form-filter-and-browse';
export const FORM_ANSWER_IN_BULK_ID = 'form-answer-in-bulk';
export const FORM_BULK_VERIFY_INTRO_ID = 'form-bulk-verify-intro';
export const FORM_CHECK_RESPONSES_ID = 'form-check-responses';
export const FORM_BULK_VERIFY_ID = 'form-bulk-verify';
export const FormOnboardingConfig: OnboardingStep[] = [
{
id: WELCOME_TO_BULK_BY_ENTITY_ID,
selector: `#${WELCOME_TO_BULK_BY_ENTITY_ID}`,
title: 'Lets complete your documentation requests!',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Here you can easily respond to all documentation requests efficiently. Well track your progress and
move you seamlessly through all your requests.
<br />
Lets get started completing the needs for this form.
</Typography.Paragraph>
),
},
{
id: FORM_QUESTION_VIEW_BUTTON,
selector: `#${FORM_QUESTION_VIEW_BUTTON}`,
title: "Switch to the 'Complete by Question' view.",
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
If an answer fits multiple assets, this view lets you tackle questions across different assets at once,
making documentation even faster and more efficient.
</Typography.Paragraph>
),
},
{
id: FORM_ASSET_COMPLETION,
selector: `#${FORM_ASSET_COMPLETION}`,
isActionStep: true,
title: (
<AssetCompletionHeader>
<StyledSmile /> Congratulations, Youve Completed 1 Asset!
</AssetCompletionHeader>
),
style: { width: '640px', maxWidth: '640px' },
content: (
<Typography.Paragraph>
Now that youve completed one asset, try switching to the Complete by Question view. If an answer fits
multiple assets, this view lets you tackle questions across different assets at once, making
documentation even faster and more efficient.
<DiagramHeader>
<ByAssetWrapper>By Asset</ByAssetWrapper>
<ByQuestionWrapper>By Question</ByQuestionWrapper>
</DiagramHeader>
<img src={BulkTypeComparions} alt="bulk form type comparions" style={{ width: '100%' }} />
</Typography.Paragraph>
),
},
{
id: WELCOME_TO_BULK_BY_QUESTION_ID,
selector: `#${WELCOME_TO_BULK_BY_QUESTION_ID}`,
title: "Welcome to the 'Complete by Question' view!",
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Here, you can easily provide the same response for multiple assets at once for a faster documenting
experience.
</Typography.Paragraph>
),
},
{
id: FORM_ASSETS_ASSIGNED_ID,
selector: `#${FORM_ASSETS_ASSIGNED_ID}`,
title: 'Focus on only the assets that require your attention',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
In this view, weve simplified your workflow by only showing assets that require documentation from you.
</Typography.Paragraph>
),
},
{
id: FORM_FILTER_AND_BROWSE_ID,
selector: `#${FORM_FILTER_AND_BROWSE_ID}`,
title: 'Filter and Browse to Select the Specific Assets',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Filter by type, terms, or browse by platform, database and schemas to select only the assets that youd
like to set the response for.
</Typography.Paragraph>
),
},
{
id: FORM_ANSWER_IN_BULK_ID,
selector: `#${FORM_ANSWER_IN_BULK_ID}`,
title: 'Answer in Bulk',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
After selecting your assets, set a collective response and start answering for groups of 1,000 assets at
a time.
</Typography.Paragraph>
),
},
{
id: FORM_BULK_VERIFY_INTRO_ID,
selector: `#${FORM_BULK_VERIFY_INTRO_ID}`,
title: 'Streamline Verification in Bulk!',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Here you can quickly review responses for a few datasets, ensuring accuracy. When you&apos;re ready,
proceed to verify all assets at once, simplifying the entire verification process.
</Typography.Paragraph>
),
},
{
id: FORM_CHECK_RESPONSES_ID,
selector: `#${FORM_CHECK_RESPONSES_ID}`,
title: 'Check Responses',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Click on &quot;View Responses&quot; to easily spot-check your responses before the final Verification
step.
</Typography.Paragraph>
),
},
{
id: FORM_BULK_VERIFY_ID,
selector: `#${FORM_BULK_VERIFY_ID}`,
title: 'Bulk Verify Assets',
style: { width: '520px', maxWidth: '520px' },
content: (
<Typography.Paragraph>
Once you&apos;re confident in your responses, verify up to 1,000 assets at a time for this form with a
click of a button.
</Typography.Paragraph>
),
},
];

View File

@ -111,6 +111,9 @@ query getChart($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -62,5 +62,8 @@ query getContainer($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -15,6 +15,9 @@ query getDashboard($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -110,6 +110,9 @@ query getDataFlow($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -14,6 +14,9 @@ query getDataJob($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -9,6 +9,9 @@ query getDataProduct($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -169,25 +169,7 @@ fragment nonSiblingDatasetFields on Dataset {
canEditQueries
}
forms {
completedForms {
...formAssociationFields
}
incompleteForms {
...formAssociationFields
}
verifications {
form {
urn
}
lastModified {
time
actor {
urn
type
...entityDisplayNameFields
}
}
}
...formsFields
}
}

View File

@ -35,6 +35,9 @@ query getDomain($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
...domainEntitiesFields
}
}

View File

@ -1313,3 +1313,25 @@ fragment formPromptAssociationFields on FormPromptAssociation {
}
}
}
fragment formsFields on Forms {
completedForms {
...formAssociationFields
}
incompleteForms {
...formAssociationFields
}
verifications {
form {
urn
}
lastModified {
time
actor {
urn
type
...entityDisplayNameFields
}
}
}
}

View File

@ -35,6 +35,9 @@ query getGlossaryNode($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
children: relationships(
input: {
types: ["IsPartOf"]

View File

@ -95,6 +95,9 @@ query getGlossaryTerm($urn: String!, $start: Int, $count: Int) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -32,6 +32,9 @@ query getGroup($urn: String!, $membersCount: Int!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
ownership {
...ownershipFields
}

View File

@ -12,5 +12,8 @@ query getMLFeature($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -9,5 +9,8 @@ query getMLFeatureTable($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -26,5 +26,8 @@ query getMLModel($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -29,5 +29,8 @@ query getMLModelGroup($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -12,5 +12,8 @@ query getMLPrimaryKey($urn: String!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
}
}

View File

@ -35,6 +35,9 @@ query getUser($urn: String!, $groupsCount: Int!) {
...structuredPropertiesFields
}
}
forms {
...formsFields
}
groups: relationships(
input: {
types: ["IsMemberOfGroup", "IsMemberOfNativeGroup"]

View File

@ -70,6 +70,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- subTypes
- name: dataFlow
category: core
@ -89,6 +90,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: dataProcess
keyAspect: dataProcessKey
aspects:
@ -127,6 +129,7 @@ entities:
- browsePathsV2
- subTypes
- structuredProperties
- forms
- name: dashboard
keyAspect: dashboardKey
aspects:
@ -148,6 +151,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: notebook
doc: Notebook represents a combination of query, text, chart and etc. This is in BETA version
keyAspect: notebookKey
@ -181,6 +185,7 @@ entities:
- origin
- roleMembership
- structuredProperties
- forms
- name: corpGroup
doc: CorpGroup represents an identity of a group of users in the enterprise.
keyAspect: corpGroupKey
@ -193,6 +198,7 @@ entities:
- origin
- roleMembership
- structuredProperties
- forms
- name: domain
doc: A data domain within an organization.
category: core
@ -202,6 +208,7 @@ entities:
- institutionalMemory
- ownership
- structuredProperties
- forms
- name: container
doc: A container of related data assets.
category: core
@ -221,6 +228,7 @@ entities:
- domains
- browsePathsV2
- structuredProperties
- forms
- name: tag
category: core
keyAspect: tagKey
@ -243,6 +251,7 @@ entities:
- status
- browsePaths
- structuredProperties
- forms
- name: glossaryNode
category: core
keyAspect: glossaryNodeKey
@ -252,6 +261,7 @@ entities:
- ownership
- status
- structuredProperties
- forms
- name: dataHubIngestionSource
category: internal
keyAspect: dataHubIngestionSourceKey
@ -321,6 +331,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: mlModelGroup
category: core
keyAspect: mlModelGroupKey
@ -337,6 +348,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: mlModelDeployment
category: core
keyAspect: mlModelDeploymentKey
@ -364,6 +376,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: mlFeature
category: core
keyAspect: mlFeatureKey
@ -381,6 +394,7 @@ entities:
- dataPlatformInstance
- browsePathsV2
- structuredProperties
- forms
- name: mlPrimaryKey
category: core
keyAspect: mlPrimaryKeyKey
@ -396,6 +410,7 @@ entities:
- globalTags
- dataPlatformInstance
- structuredProperties
- forms
- name: telemetry
category: internal
keyAspect: telemetryKey
@ -428,6 +443,7 @@ entities:
keyAspect: schemaFieldKey
aspects:
- structuredProperties
- forms
- name: globalSettings
doc: Global settings for an the platform
category: internal
@ -473,6 +489,7 @@ entities:
- institutionalMemory
- status
- structuredProperties
- forms
- name: ownershipType
doc: Ownership Type represents a user-created ownership category for a person or group who is responsible for an asset.
category: core