You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2023/03/29 13:22:27 UTC
[airavata-data-catalog] 12/36: Initial work at implementing metadata schema management APIs
This is an automated email from the ASF dual-hosted git repository.
machristie pushed a commit to branch custos-integration
in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git
commit 131ca0eabdfebb7573812614af75c6d4d12ff835
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Feb 13 17:01:28 2023 -0500
Initial work at implementing metadata schema management APIs
---
.../api/client/DataCatalogAPIClient.java | 62 ++++++++++-
.../api/mapper/MetadataSchemaFieldMapper.java | 36 +++++++
.../api/mapper/MetadataSchemaMapper.java | 19 ++++
.../api/model/MetadataSchemaEntity.java | 73 +++++++++++++
.../api/model/MetadataSchemaFieldEntity.java | 108 +++++++++++++++++++
.../repository/MetadataSchemaFieldRepository.java | 11 ++
.../api/repository/MetadataSchemaRepository.java | 9 ++
.../api/service/DataCatalogAPIService.java | 119 ++++++++++++++++++++-
.../stubs/src/main/proto/DataCatalogAPI.proto | 83 ++++++++++++++
9 files changed, 515 insertions(+), 5 deletions(-)
diff --git a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
index 8ae7d07..954f994 100644
--- a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
+++ b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
@@ -1,6 +1,7 @@
package org.apache.airavata.datacatalog.api.client;
import java.text.MessageFormat;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
@@ -13,8 +14,15 @@ import org.apache.airavata.datacatalog.api.DataProductGetRequest;
import org.apache.airavata.datacatalog.api.DataProductGetResponse;
import org.apache.airavata.datacatalog.api.DataProductUpdateRequest;
import org.apache.airavata.datacatalog.api.DataProductUpdateResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.airavata.datacatalog.api.FieldValueType;
+import org.apache.airavata.datacatalog.api.MetadataSchema;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse;
import io.grpc.Channel;
import io.grpc.ManagedChannel;
@@ -22,8 +30,6 @@ import io.grpc.ManagedChannelBuilder;;
public class DataCatalogAPIClient {
- private static final Logger logger = LoggerFactory.getLogger(DataCatalogAPIClient.class);
-
private final DataCatalogAPIServiceBlockingStub blockingStub;
public DataCatalogAPIClient(Channel channel) {
@@ -54,6 +60,27 @@ public class DataCatalogAPIClient {
blockingStub.deleteDataProduct(request);
}
+ public MetadataSchema createMetadataSchema(MetadataSchema metadataSchema) {
+ MetadataSchemaCreateRequest request = MetadataSchemaCreateRequest.newBuilder().setMetadataSchema(metadataSchema)
+ .build();
+ MetadataSchemaCreateResponse response = blockingStub.createMetadataSchema(request);
+ return response.getMetadataSchema();
+ }
+
+ public MetadataSchemaField createMetadataSchemaField(MetadataSchemaField metadataSchemaField) {
+ MetadataSchemaFieldCreateRequest request = MetadataSchemaFieldCreateRequest.newBuilder()
+ .setMetadataSchemaField(metadataSchemaField).build();
+ MetadataSchemaFieldCreateResponse response = blockingStub.createMetadataSchemaField(request);
+ return response.getMetadataSchemaField();
+ }
+
+ public List<MetadataSchemaField> getMetadataSchemaFields(String schemaName) {
+ MetadataSchemaFieldListRequest request = MetadataSchemaFieldListRequest.newBuilder().setSchemaName(schemaName)
+ .build();
+ MetadataSchemaFieldListResponse response = blockingStub.getMetadataSchemaFields(request);
+ return response.getMetadataSchemaFieldsList();
+ }
+
public static void main(String[] args) throws InterruptedException {
String target = "localhost:6565";
@@ -88,6 +115,33 @@ public class DataCatalogAPIClient {
System.out.println(
MessageFormat.format("Deleted data product with id [{0}]", result2.getDataProductId()));
+ MetadataSchema metadataSchema = MetadataSchema.newBuilder().setSchemaName("my_schema").build();
+ metadataSchema = client.createMetadataSchema(metadataSchema);
+
+ System.out.println(
+ MessageFormat.format("Created metadata schema with name [{0}]", metadataSchema.getSchemaName()));
+
+ MetadataSchemaField field1 = MetadataSchemaField.newBuilder().setFieldName("field1")
+ .setJsonPath("$.field1").setValueType(FieldValueType.FLOAT)
+ .setSchemaName(metadataSchema.getSchemaName()).build();
+ field1 = client.createMetadataSchemaField(field1);
+ System.out.println(MessageFormat.format("Created metadata schema field [{0}] in schema [{1}]",
+ field1.getFieldName(), field1.getSchemaName()));
+
+ MetadataSchemaField field2 = MetadataSchemaField.newBuilder().setFieldName("field2")
+ .setJsonPath("$.field2").setValueType(FieldValueType.FLOAT)
+ .setSchemaName(metadataSchema.getSchemaName()).build();
+ field2 = client.createMetadataSchemaField(field2);
+ System.out.println(MessageFormat.format("Created metadata schema field [{0}] in schema [{1}]",
+ field2.getFieldName(), field2.getSchemaName()));
+
+ List<MetadataSchemaField> fields = client.getMetadataSchemaFields(metadataSchema.getSchemaName());
+ System.out.println(MessageFormat.format("Found {0} fields for schema {1}", fields.size(),
+ metadataSchema.getSchemaName()));
+ for (MetadataSchemaField field : fields) {
+ System.out.println(MessageFormat.format("-> field {0}", field.getFieldName()));
+ }
+
} finally {
channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java
new file mode 100644
index 0000000..2a96ec4
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java
@@ -0,0 +1,36 @@
+package org.apache.airavata.datacatalog.api.mapper;
+
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
+import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MetadataSchemaFieldMapper {
+
+ @Autowired
+ MetadataSchemaRepository metadataSchemaRepository;
+
+ public void mapModelToEntity(MetadataSchemaField metadataSchemaField,
+ MetadataSchemaFieldEntity metadataSchemaFieldEntity) {
+
+ metadataSchemaFieldEntity.setFieldName(metadataSchemaField.getFieldName());
+ metadataSchemaFieldEntity.setFieldValueType(metadataSchemaField.getValueType());
+ metadataSchemaFieldEntity.setJsonPath(metadataSchemaField.getJsonPath());
+
+ MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository
+ .findBySchemaName(metadataSchemaField.getSchemaName());
+ metadataSchemaFieldEntity.setMetadataSchema(metadataSchemaEntity);
+ }
+
+ public void mapEntityToModel(MetadataSchemaFieldEntity metadataSchemaFieldEntity,
+ MetadataSchemaField.Builder metadataSchemaFieldBuilder) {
+
+ metadataSchemaFieldBuilder.setFieldName(metadataSchemaFieldEntity.getFieldName());
+ metadataSchemaFieldBuilder.setJsonPath(metadataSchemaFieldEntity.getJsonPath());
+ metadataSchemaFieldBuilder.setValueType(metadataSchemaFieldEntity.getFieldValueType());
+ metadataSchemaFieldBuilder.setSchemaName(metadataSchemaFieldEntity.getMetadataSchema().getSchemaName());
+ }
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java
new file mode 100644
index 0000000..e7c6fcd
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datacatalog.api.mapper;
+
+import org.apache.airavata.datacatalog.api.MetadataSchema;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MetadataSchemaMapper {
+
+ public void mapModelToEntity(MetadataSchema metadataSchema, MetadataSchemaEntity metadataSchemaEntity) {
+
+ metadataSchemaEntity.setSchemaName(metadataSchema.getSchemaName());
+ }
+
+ public void mapEntityToModel(MetadataSchemaEntity metadataSchemaEntity,
+ MetadataSchema.Builder metadataSchemaBuilder) {
+ metadataSchemaBuilder.setSchemaName(metadataSchemaEntity.getSchemaName());
+ }
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java
new file mode 100644
index 0000000..8c1f6cd
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java
@@ -0,0 +1,73 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import java.util.Set;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+// TODO: unique constraint on schema_name, tenant
+@Table(name = "metadata_schema")
+public class MetadataSchemaEntity {
+
+ @Id
+ @SequenceGenerator(name = "metadata_schema_metadata_schema_id_seq", sequenceName = "metadata_schema_metadata_schema_id_seq", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "metadata_schema_metadata_schema_id_seq")
+ @Column(name = "metadata_schema_id")
+ private Long metadataSchemaId;
+
+ @Basic
+ @Column(name = "schema_name", nullable = false)
+ private String schemaName;
+
+ @OneToMany(mappedBy = "metadataSchema")
+ private Set<MetadataSchemaFieldEntity> metadataSchemaFields;
+
+ public Long getMetadataSchemaId() {
+ return metadataSchemaId;
+ }
+
+ public void setMetadataSchemaId(Long metadataSchemaId) {
+ this.metadataSchemaId = metadataSchemaId;
+ }
+
+ public String getSchemaName() {
+ return schemaName;
+ }
+
+ public void setSchemaName(String schemaName) {
+ this.schemaName = schemaName;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((metadataSchemaId == null) ? 0 : metadataSchemaId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MetadataSchemaEntity other = (MetadataSchemaEntity) obj;
+ if (metadataSchemaId == null) {
+ if (other.metadataSchemaId != null)
+ return false;
+ } else if (!metadataSchemaId.equals(other.metadataSchemaId))
+ return false;
+ return true;
+ }
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java
new file mode 100644
index 0000000..8f6a83a
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import org.apache.airavata.datacatalog.api.FieldValueType;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "metadata_schema_field")
+public class MetadataSchemaFieldEntity {
+
+ @Id
+ @SequenceGenerator(name = "metadata_schema_field_metadata_schema_field_id", sequenceName = "metadata_schema_field_metadata_schema_field_id", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "metadata_schema_field_metadata_schema_field_id")
+ @Column(name = "metadata_schema_field_id")
+ private Long metadataSchemaFieldId;
+
+ @Basic
+ @Column(name = "field_name", nullable = false)
+ private String fieldName;
+
+ @Basic
+ @Column(name = "json_path", nullable = false)
+ private String jsonPath;
+
+ @Enumerated(EnumType.STRING)
+ private FieldValueType fieldValueType;
+
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "metadata_schema_id", nullable = false, updatable = false)
+ private MetadataSchemaEntity metadataSchema;
+
+ public Long getMetadataSchemaFieldId() {
+ return metadataSchemaFieldId;
+ }
+
+ public void setMetadataSchemaFieldId(Long metadataSchemaFieldId) {
+ this.metadataSchemaFieldId = metadataSchemaFieldId;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ public String getJsonPath() {
+ return jsonPath;
+ }
+
+ public void setJsonPath(String jsonPath) {
+ this.jsonPath = jsonPath;
+ }
+
+ public FieldValueType getFieldValueType() {
+ return fieldValueType;
+ }
+
+ public void setFieldValueType(FieldValueType fieldValueType) {
+ this.fieldValueType = fieldValueType;
+ }
+
+ public MetadataSchemaEntity getMetadataSchema() {
+ return metadataSchema;
+ }
+
+ public void setMetadataSchema(MetadataSchemaEntity metadataSchema) {
+ this.metadataSchema = metadataSchema;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((metadataSchemaFieldId == null) ? 0 : metadataSchemaFieldId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MetadataSchemaFieldEntity other = (MetadataSchemaFieldEntity) obj;
+ if (metadataSchemaFieldId == null) {
+ if (other.metadataSchemaFieldId != null)
+ return false;
+ } else if (!metadataSchemaFieldId.equals(other.metadataSchemaFieldId))
+ return false;
+ return true;
+ }
+
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java
new file mode 100644
index 0000000..e237dac
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java
@@ -0,0 +1,11 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import java.util.List;
+
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MetadataSchemaFieldRepository extends JpaRepository<MetadataSchemaFieldEntity, Long> {
+
+ List<MetadataSchemaFieldEntity> findByMetadataSchema_SchemaName(String schemaName);
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java
new file mode 100644
index 0000000..28d0518
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MetadataSchemaRepository extends JpaRepository<MetadataSchemaEntity, Long> {
+
+ MetadataSchemaEntity findBySchemaName(String schemaName);
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
index 65f92b7..3869ee5 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
@@ -1,20 +1,42 @@
package org.apache.airavata.datacatalog.api.service;
+import java.util.List;
import java.util.UUID;
import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
import org.apache.airavata.datacatalog.api.DataProduct;
+import org.apache.airavata.datacatalog.api.DataProductAddToMetadataSchemaRequest;
+import org.apache.airavata.datacatalog.api.DataProductAddToMetadataSchemaResponse;
import org.apache.airavata.datacatalog.api.DataProductCreateRequest;
import org.apache.airavata.datacatalog.api.DataProductCreateResponse;
import org.apache.airavata.datacatalog.api.DataProductDeleteRequest;
import org.apache.airavata.datacatalog.api.DataProductDeleteResponse;
import org.apache.airavata.datacatalog.api.DataProductGetRequest;
import org.apache.airavata.datacatalog.api.DataProductGetResponse;
+import org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaRequest;
+import org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaResponse;
import org.apache.airavata.datacatalog.api.DataProductUpdateRequest;
import org.apache.airavata.datacatalog.api.DataProductUpdateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldDeleteRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldDeleteResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateResponse;
import org.apache.airavata.datacatalog.api.mapper.DataProductMapper;
+import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaFieldMapper;
+import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaMapper;
import org.apache.airavata.datacatalog.api.model.DataProductEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
import org.apache.airavata.datacatalog.api.repository.DataProductRepository;
+import org.apache.airavata.datacatalog.api.repository.MetadataSchemaFieldRepository;
+import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository;
import org.lognet.springboot.grpc.GRpcService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +53,19 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
DataProductRepository dataProductRepository;
@Autowired
- DataProductMapper dataProductMapper = new DataProductMapper();
+ MetadataSchemaRepository metadataSchemaRepository;
+
+ @Autowired
+ MetadataSchemaFieldRepository metadataSchemaFieldRepository;
+
+ @Autowired
+ DataProductMapper dataProductMapper;
+
+ @Autowired
+ MetadataSchemaMapper metadataSchemaMapper;
+
+ @Autowired
+ MetadataSchemaFieldMapper metadataSchemaFieldMapper;
@Override
public void createDataProduct(DataProductCreateRequest request,
@@ -93,4 +127,87 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
responseObserver.onNext(responseBuilder.build());
responseObserver.onCompleted();
}
+
+ @Override
+ public void addDataProductToMetadataSchema(DataProductAddToMetadataSchemaRequest request,
+ StreamObserver<DataProductAddToMetadataSchemaResponse> responseObserver) {
+ // TODO Auto-generated method stub
+ super.addDataProductToMetadataSchema(request, responseObserver);
+ }
+
+ @Override
+ public void createMetadataSchema(MetadataSchemaCreateRequest request,
+ StreamObserver<MetadataSchemaCreateResponse> responseObserver) {
+
+ MetadataSchemaEntity metadataSchemaEntity = new MetadataSchemaEntity();
+ metadataSchemaMapper.mapModelToEntity(request.getMetadataSchema(), metadataSchemaEntity);
+ MetadataSchemaEntity savedMetadataSchemaEntity = metadataSchemaRepository.save(metadataSchemaEntity);
+
+ MetadataSchemaCreateResponse.Builder responseBuilder = MetadataSchemaCreateResponse.newBuilder();
+ metadataSchemaMapper.mapEntityToModel(savedMetadataSchemaEntity, responseBuilder.getMetadataSchemaBuilder());
+ responseObserver.onNext(responseBuilder.build());
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void createMetadataSchemaField(MetadataSchemaFieldCreateRequest request,
+ StreamObserver<MetadataSchemaFieldCreateResponse> responseObserver) {
+
+ MetadataSchemaFieldEntity metadataSchemaFieldEntity = new MetadataSchemaFieldEntity();
+ metadataSchemaFieldMapper.mapModelToEntity(request.getMetadataSchemaField(), metadataSchemaFieldEntity);
+ MetadataSchemaFieldEntity savedMetadataSchemaFieldEntity = metadataSchemaFieldRepository
+ .save(metadataSchemaFieldEntity);
+
+ MetadataSchemaFieldCreateResponse.Builder responseBuilder = MetadataSchemaFieldCreateResponse.newBuilder();
+ metadataSchemaFieldMapper.mapEntityToModel(savedMetadataSchemaFieldEntity,
+ responseBuilder.getMetadataSchemaFieldBuilder());
+ responseObserver.onNext(responseBuilder.build());
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void deleteMetadataSchema(MetadataSchemaCreateRequest request,
+ StreamObserver<MetadataSchemaCreateResponse> responseObserver) {
+ // TODO Auto-generated method stub
+ super.deleteMetadataSchema(request, responseObserver);
+ }
+
+ @Override
+ public void deleteMetadataSchemaField(MetadataSchemaFieldDeleteRequest request,
+ StreamObserver<MetadataSchemaFieldDeleteResponse> responseObserver) {
+ // TODO Auto-generated method stub
+ super.deleteMetadataSchemaField(request, responseObserver);
+ }
+
+ @Override
+ public void getMetadataSchemaFields(MetadataSchemaFieldListRequest request,
+ StreamObserver<MetadataSchemaFieldListResponse> responseObserver) {
+
+ // TODO: handle case where schema doesn't exist
+ List<MetadataSchemaFieldEntity> metadataSchemaFieldEntities = metadataSchemaFieldRepository
+ .findByMetadataSchema_SchemaName(request.getSchemaName());
+
+ MetadataSchemaFieldListResponse.Builder responseBuilder = MetadataSchemaFieldListResponse.newBuilder();
+ for (MetadataSchemaFieldEntity metadataSchemaFieldEntity : metadataSchemaFieldEntities) {
+ MetadataSchemaField.Builder builder = responseBuilder.addMetadataSchemaFieldsBuilder();
+ metadataSchemaFieldMapper.mapEntityToModel(metadataSchemaFieldEntity, builder);
+ }
+ responseObserver.onNext(responseBuilder.build());
+ responseObserver.onError(null);
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void removeDataProductFromMetadataSchema(DataProductRemoveFromMetadataSchemaRequest request,
+ StreamObserver<DataProductRemoveFromMetadataSchemaResponse> responseObserver) {
+ // TODO Auto-generated method stub
+ super.removeDataProductFromMetadataSchema(request, responseObserver);
+ }
+
+ @Override
+ public void updateMetadataSchemaField(MetadataSchemaFieldUpdateRequest request,
+ StreamObserver<MetadataSchemaFieldUpdateResponse> responseObserver) {
+ // TODO Auto-generated method stub
+ super.updateMetadataSchemaField(request, responseObserver);
+ }
}
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
index 779002c..b1d40dd 100644
--- a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -64,6 +64,23 @@ message DataProduct {
optional string metadata = 4;
}
+enum FieldValueType {
+ STRING = 0;
+ INTEGER = 1;
+ FLOAT = 2;
+ BOOLEAN = 3;
+ DATESTRING = 4;
+}
+message MetadataSchema {
+ string schema_name = 1;
+}
+message MetadataSchemaField {
+ string schema_name = 1;
+ string field_name = 2;
+ string json_path = 3;
+ FieldValueType value_type = 4;
+}
+
message DataProductCreateRequest {
DataProduct data_product = 1;
}
@@ -88,9 +105,75 @@ message DataProductDeleteRequest {
message DataProductDeleteResponse {
}
+message MetadataSchemaCreateRequest {
+ UserInfo user_info = 1;
+ MetadataSchema metadata_schema = 2;
+}
+message MetadataSchemaCreateResponse {
+ MetadataSchema metadata_schema = 1;
+}
+message MetadataSchemaDeleteRequest {
+ UserInfo user_info = 1;
+ MetadataSchema metadata_schema = 2;
+}
+message MetadataSchemaDeleteResponse {
+}
+message MetadataSchemaFieldCreateRequest {
+ UserInfo user_info = 1;
+ MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldCreateResponse {
+ MetadataSchemaField metadata_schema_field = 1;
+}
+message MetadataSchemaFieldUpdateRequest {
+ UserInfo user_info = 1;
+ MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldUpdateResponse {
+ MetadataSchemaField metadata_schema_field = 1;
+}
+message MetadataSchemaFieldDeleteRequest {
+ UserInfo user_info = 1;
+ MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldDeleteResponse {
+}
+message MetadataSchemaFieldListRequest {
+ UserInfo user_info = 1;
+ string schema_name = 2;
+}
+message MetadataSchemaFieldListResponse {
+ repeated MetadataSchemaField metadata_schema_fields = 1;
+}
+message DataProductAddToMetadataSchemaRequest {
+ UserInfo user_info = 1;
+ string data_product_id = 2;
+ string schema_name = 3;
+}
+message DataProductAddToMetadataSchemaResponse {
+ DataProduct data_product = 1;
+}
+message DataProductRemoveFromMetadataSchemaRequest {
+ UserInfo user_info = 1;
+ string data_product_id = 2;
+ string schema_name = 3;
+}
+message DataProductRemoveFromMetadataSchemaResponse {
+ DataProduct data_product = 1;
+}
+
+
service DataCatalogAPIService {
rpc createDataProduct(DataProductCreateRequest) returns (DataProductCreateResponse){}
rpc updateDataProduct(DataProductUpdateRequest) returns (DataProductUpdateResponse){}
rpc getDataProduct(DataProductGetRequest) returns (DataProductGetResponse){}
rpc deleteDataProduct(DataProductDeleteRequest) returns (DataProductDeleteResponse){}
+ rpc createMetadataSchema(MetadataSchemaCreateRequest) returns (MetadataSchemaCreateResponse){}
+ rpc deleteMetadataSchema(MetadataSchemaCreateRequest) returns (MetadataSchemaCreateResponse){}
+ rpc createMetadataSchemaField(MetadataSchemaFieldCreateRequest) returns (MetadataSchemaFieldCreateResponse){}
+ rpc updateMetadataSchemaField(MetadataSchemaFieldUpdateRequest) returns (MetadataSchemaFieldUpdateResponse){}
+ rpc deleteMetadataSchemaField(MetadataSchemaFieldDeleteRequest) returns (MetadataSchemaFieldDeleteResponse){}
+ rpc getMetadataSchemaFields(MetadataSchemaFieldListRequest) returns (MetadataSchemaFieldListResponse){}
+ rpc addDataProductToMetadataSchema(DataProductAddToMetadataSchemaRequest) returns (DataProductAddToMetadataSchemaResponse){}
+ rpc removeDataProductFromMetadataSchema(DataProductRemoveFromMetadataSchemaRequest) returns (DataProductRemoveFromMetadataSchemaResponse){}
}