package com.linkedin.metadata.models; import com.linkedin.data.DataMap; import com.linkedin.data.schema.RecordDataSchema; import com.linkedin.data.template.RecordTemplate; import com.linkedin.metadata.models.annotation.AspectAnnotation; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Nonnull; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.maven.artifact.versioning.ComparableVersion; @EqualsAndHashCode public class AspectSpec { private final AspectAnnotation _aspectAnnotation; private final Map _searchableFieldSpecs; private final Map _searchScoreFieldSpecs; private final Map _relationshipFieldSpecs; private final Map _timeseriesFieldSpecs; private final Map _timeseriesFieldCollectionSpecs; // Classpath & Pegasus-specific: Temporary. private final RecordDataSchema _schema; private final Class _aspectClass; @Setter @Getter private String registryName = "unknownRegistry"; @Setter @Getter private ComparableVersion registryVersion = new ComparableVersion("0.0.0.0-dev"); public AspectSpec(@Nonnull final AspectAnnotation aspectAnnotation, @Nonnull final List searchableFieldSpecs, @Nonnull final List searchScoreFieldSpecs, @Nonnull final List relationshipFieldSpecs, @Nonnull final List timeseriesFieldSpecs, @Nonnull final List timeseriesFieldCollectionSpecs, final RecordDataSchema schema, final Class aspectClass) { _aspectAnnotation = aspectAnnotation; _searchableFieldSpecs = searchableFieldSpecs.stream() .collect(Collectors.toMap(spec -> spec.getPath().toString(), spec -> spec, (val1, val2) -> val1)); _searchScoreFieldSpecs = searchScoreFieldSpecs.stream() .collect(Collectors.toMap(spec -> spec.getPath().toString(), spec -> spec, (val1, val2) -> val1)); _relationshipFieldSpecs = relationshipFieldSpecs.stream() .collect(Collectors.toMap(spec -> spec.getPath().toString(), spec -> spec, (val1, val2) -> val1)); _timeseriesFieldSpecs = timeseriesFieldSpecs.stream() .collect(Collectors.toMap(spec -> spec.getTimeseriesFieldAnnotation().getStatName(), spec -> spec, (val1, val2) -> val1)); _timeseriesFieldCollectionSpecs = timeseriesFieldCollectionSpecs.stream() .collect(Collectors.toMap(spec -> spec.getTimeseriesFieldCollectionAnnotation().getCollectionName(), spec -> spec, (val1, val2) -> val1)); _schema = schema; _aspectClass = aspectClass; } public String getName() { return _aspectAnnotation.getName(); } public boolean isTimeseries() { return _aspectAnnotation.isTimeseries(); } public Boolean isAutoRender() { return _aspectAnnotation.isAutoRender(); } public DataMap getRenderSpec() { return _aspectAnnotation.getRenderSpec(); } public Map getSearchableFieldSpecMap() { return _searchableFieldSpecs; } public Map getSearchScoreFieldSpecMap() { return _searchScoreFieldSpecs; } public Map getRelationshipFieldSpecMap() { return _relationshipFieldSpecs; } public Map getTimeseriesFieldSpecMap() { return _timeseriesFieldSpecs; } public Map getTimeseriesFieldCollectionSpecMap() { return _timeseriesFieldCollectionSpecs; } public List getSearchableFieldSpecs() { return new ArrayList<>(_searchableFieldSpecs.values()); } public List getSearchScoreFieldSpecs() { return new ArrayList<>(_searchScoreFieldSpecs.values()); } public List getRelationshipFieldSpecs() { return new ArrayList<>(_relationshipFieldSpecs.values()); } public List getTimeseriesFieldSpecs() { return new ArrayList<>(_timeseriesFieldSpecs.values()); } public List getTimeseriesFieldCollectionSpecs() { return new ArrayList<>(_timeseriesFieldCollectionSpecs.values()); } public RecordDataSchema getPegasusSchema() { return _schema; } public Class getDataTemplateClass() { return _aspectClass; } }