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