From c7d76423777677344cc09444a3e07ad9623c2062 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Sun, 1 Aug 2021 12:21:49 +0200
Subject: [PATCH] WIP: multi retrieve

---
 .../grpc/EntityTransactionServiceImpl.java    | 152 +++++++++++++++---
 1 file changed, 129 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 6d0995e8..43d52ba5 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -1,6 +1,7 @@
 package org.caosdb.server.grpc;
 
 import io.grpc.stub.StreamObserver;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -20,6 +21,8 @@ import org.caosdb.api.entity.v1alpha1.TransactionRequest;
 import org.caosdb.api.entity.v1alpha1.TransactionRequest.WrappedRequestsCase;
 import org.caosdb.api.entity.v1alpha1.TransactionResponse;
 import org.caosdb.api.entity.v1alpha1.Version;
+import org.caosdb.server.datatype.GenericValue;
+import org.caosdb.server.datatype.Value;
 import org.caosdb.server.entity.DeleteEntity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.InsertEntity;
@@ -27,6 +30,7 @@ import org.caosdb.server.entity.MagicTypes;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
+import org.caosdb.server.entity.StatementStatus;
 import org.caosdb.server.entity.container.ParentContainer;
 import org.caosdb.server.entity.container.PropertyContainer;
 import org.caosdb.server.entity.container.RetrieveContainer;
@@ -203,27 +207,33 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     return Integer.parseInt(id);
   }
 
-  public RetrieveResponse retrieve(final QueryOrIdRequest queryOrIdRequest) throws Exception {
-
-    Entity responseEntity = null;
-    final org.caosdb.api.entity.v1alpha1.RetrieveResponse.Builder builder =
-        RetrieveResponse.newBuilder();
+  public MultiTransactionResponse retrieve(final MultiTransactionRequest request) throws Exception {
+    final MultiTransactionResponse.Builder builder = MultiTransactionResponse.newBuilder();
     final RetrieveContainer container =
         new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
-    try {
-      final RetrieveEntity entity = new RetrieveEntity(getId(queryOrIdRequest.getId()));
-      container.add(entity);
 
-      final Retrieve transaction = new Retrieve(container);
-      transaction.execute();
-      responseEntity = convert(transaction.getContainer().get(0));
-    } catch (final NumberFormatException e) {
-      // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot
-      // exist.
-      responseEntity = entityDoesNotExist(queryOrIdRequest.getId());
+    for (final TransactionRequest sub_request : request.getRequestsList()) {
+      final String id = sub_request.getRetrieveRequest().getId();
+      try {
+        final RetrieveEntity entity = new RetrieveEntity(getId(id));
+        container.add(entity);
+
+        builder.addResponses(
+            TransactionResponse.newBuilder()
+                .setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity))));
+      } catch (final NumberFormatException e) {
+        // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot
+        // exist.
+        builder.addResponses(
+            TransactionResponse.newBuilder()
+                .setRetrieveResponse(
+                    RetrieveResponse.newBuilder().setEntity(entityDoesNotExist(id))));
+      }
     }
 
-    builder.setEntity(responseEntity);
+    final Retrieve transaction = new Retrieve(container);
+    transaction.execute();
+
     return builder.build();
   }
 
@@ -244,17 +254,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
 
   public MultiTransactionResponse transaction(final MultiTransactionRequest request)
       throws Exception {
-    final TransactionResponse response = singleTransaction(request.getRequests(0));
-    return MultiTransactionResponse.newBuilder().addResponses(response).build();
+    // we currently can only process one request type per multi transaction request.
+    WrappedRequestsCase requestCase = WrappedRequestsCase.WRAPPEDREQUESTS_NOT_SET;
+
+    if (request.getRequestsCount() > 0) {
+      requestCase = request.getRequests(0).getWrappedRequestsCase();
+    }
+
+    switch (requestCase) {
+      case RETRIEVE_REQUEST:
+        return retrieve(request);
+      default:
+        return MultiTransactionResponse.newBuilder()
+            .addResponses(singleTransaction(request.getRequests(0)))
+            .build();
+    }
   }
 
   public TransactionResponse singleTransaction(final TransactionRequest request) throws Exception {
     final WrappedRequestsCase requestCase = request.getWrappedRequestsCase();
     switch (requestCase) {
-      case RETRIEVE_REQUEST:
-        return TransactionResponse.newBuilder()
-            .setRetrieveResponse(retrieve(request.getRetrieveRequest()))
-            .build();
       case INSERT_REQUEST:
         return TransactionResponse.newBuilder()
             .setInsertResponse(insert(request.getInsertRequest()))
@@ -334,15 +353,102 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     }
   }
 
+  public Property getUnit(final String unitStr) {
+    final EntityInterface magicUnit = MagicTypes.UNIT.getEntity();
+    final Property unit = new Property();
+    unit.setDescription(magicUnit.getDescription());
+    unit.setName(magicUnit.getName());
+    unit.setId(magicUnit.getId());
+    unit.setDatatype(magicUnit.getDatatype());
+    unit.setStatementStatus(StatementStatus.FIX);
+    unit.setValue(new GenericValue(unitStr));
+    unit.setEntityStatus(EntityStatus.QUALIFIED);
+    return unit;
+  }
+
+  public Value getValue(final String valString) {
+    return new GenericValue(valString);
+  }
+
   private InsertEntity convert(final Entity insertEntity) {
     final InsertEntity entity =
         new InsertEntity(
             insertEntity.getName().isEmpty() ? null : insertEntity.getName(),
             Role.parse(insertEntity.getRole()));
-    // TODO (other basic attributes, properties, parents)
+    entity.setDescription(
+        insertEntity.getDescription().isBlank() ? null : insertEntity.getDescription());
+    if (!insertEntity.getUnit().isBlank()) {
+      entity.addProperty(getUnit(insertEntity.getUnit()));
+    }
+    entity.setDatatype(insertEntity.getDatatype().isBlank() ? null : insertEntity.getDatatype());
+    if (!insertEntity.getValue().isBlank()) {
+      entity.setValue(getValue(insertEntity.getValue()));
+    }
+
+    if (insertEntity.getPropertiesCount() > 0) {
+      entity.getProperties().addAll(convertProperties(insertEntity.getPropertiesList()));
+    }
+    if (insertEntity.getParentsCount() > 0) {
+      entity.getParents().addAll(convertParents(insertEntity.getParentsList()));
+    }
     return entity;
   }
 
+  private Collection<Property> convertProperties(
+      final List<org.caosdb.api.entity.v1alpha1.Property> propertiesList) {
+    final Collection<Property> result = new LinkedList<>();
+    propertiesList.forEach(
+        e -> {
+          result.add(convert(e));
+        });
+    return result;
+  }
+
+  private Property convert(final org.caosdb.api.entity.v1alpha1.Property e) {
+    final Property result = new Property();
+
+    try {
+      result.setId(e.getId().isBlank() ? null : getId(e.getId()));
+    } catch (final NumberFormatException exc) {
+      result.addError(ServerMessages.ENTITY_DOES_NOT_EXIST);
+    }
+    result.setName(e.getName().isBlank() ? null : e.getName());
+    result.setDescription(e.getDescription().isBlank() ? null : e.getDescription());
+    if (!e.getUnit().isBlank()) {
+      result.addProperty(getUnit(e.getUnit()));
+    }
+    result.setDatatype(e.getDatatype().isBlank() ? null : e.getDatatype());
+    if (!e.getValue().isBlank()) {
+      result.setValue(getValue(e.getValue()));
+    }
+    result.setStatementStatus(e.getImportance().isBlank() ? null : e.getImportance());
+
+    return result;
+  }
+
+  private Collection<org.caosdb.server.entity.wrapper.Parent> convertParents(
+      final List<Parent> parentsList) {
+    final Collection<org.caosdb.server.entity.wrapper.Parent> result = new LinkedList<>();
+    parentsList.forEach(
+        e -> {
+          result.add(convert(e));
+        });
+    return result;
+  }
+
+  private org.caosdb.server.entity.wrapper.Parent convert(final Parent e) {
+    final org.caosdb.server.entity.wrapper.Parent result =
+        new org.caosdb.server.entity.wrapper.Parent();
+
+    try {
+      result.setId(e.getId().isBlank() ? null : getId(e.getId()));
+    } catch (final NumberFormatException exc) {
+      result.addError(ServerMessages.ENTITY_DOES_NOT_EXIST);
+    }
+    result.setName(e.getName().isBlank() ? null : e.getName());
+    return result;
+  }
+
   @Override
   public void multiTransaction(
       final MultiTransactionRequest request,
-- 
GitLab