Skip to content
Snippets Groups Projects
Verified Commit c7d76423 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: multi retrieve

parent 3b0e40ae
Branches
Tags
2 merge requests!44Release 0.6,!43Merge f-GRPC-main to dev
Pipeline #11125 passed
package org.caosdb.server.grpc; package org.caosdb.server.grpc;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
...@@ -20,6 +21,8 @@ import org.caosdb.api.entity.v1alpha1.TransactionRequest; ...@@ -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.TransactionRequest.WrappedRequestsCase;
import org.caosdb.api.entity.v1alpha1.TransactionResponse; import org.caosdb.api.entity.v1alpha1.TransactionResponse;
import org.caosdb.api.entity.v1alpha1.Version; 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.DeleteEntity;
import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.EntityInterface;
import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.InsertEntity;
...@@ -27,6 +30,7 @@ import org.caosdb.server.entity.MagicTypes; ...@@ -27,6 +30,7 @@ import org.caosdb.server.entity.MagicTypes;
import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message;
import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.RetrieveEntity;
import org.caosdb.server.entity.Role; 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.ParentContainer;
import org.caosdb.server.entity.container.PropertyContainer; import org.caosdb.server.entity.container.PropertyContainer;
import org.caosdb.server.entity.container.RetrieveContainer; import org.caosdb.server.entity.container.RetrieveContainer;
...@@ -203,27 +207,33 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -203,27 +207,33 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
return Integer.parseInt(id); return Integer.parseInt(id);
} }
public RetrieveResponse retrieve(final QueryOrIdRequest queryOrIdRequest) throws Exception { public MultiTransactionResponse retrieve(final MultiTransactionRequest request) throws Exception {
final MultiTransactionResponse.Builder builder = MultiTransactionResponse.newBuilder();
Entity responseEntity = null;
final org.caosdb.api.entity.v1alpha1.RetrieveResponse.Builder builder =
RetrieveResponse.newBuilder();
final RetrieveContainer container = final RetrieveContainer container =
new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); 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); for (final TransactionRequest sub_request : request.getRequestsList()) {
transaction.execute(); final String id = sub_request.getRetrieveRequest().getId();
responseEntity = convert(transaction.getContainer().get(0)); try {
} catch (final NumberFormatException e) { final RetrieveEntity entity = new RetrieveEntity(getId(id));
// ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot container.add(entity);
// exist.
responseEntity = entityDoesNotExist(queryOrIdRequest.getId()); 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(); return builder.build();
} }
...@@ -244,17 +254,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -244,17 +254,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
public MultiTransactionResponse transaction(final MultiTransactionRequest request) public MultiTransactionResponse transaction(final MultiTransactionRequest request)
throws Exception { throws Exception {
final TransactionResponse response = singleTransaction(request.getRequests(0)); // we currently can only process one request type per multi transaction request.
return MultiTransactionResponse.newBuilder().addResponses(response).build(); 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 { public TransactionResponse singleTransaction(final TransactionRequest request) throws Exception {
final WrappedRequestsCase requestCase = request.getWrappedRequestsCase(); final WrappedRequestsCase requestCase = request.getWrappedRequestsCase();
switch (requestCase) { switch (requestCase) {
case RETRIEVE_REQUEST:
return TransactionResponse.newBuilder()
.setRetrieveResponse(retrieve(request.getRetrieveRequest()))
.build();
case INSERT_REQUEST: case INSERT_REQUEST:
return TransactionResponse.newBuilder() return TransactionResponse.newBuilder()
.setInsertResponse(insert(request.getInsertRequest())) .setInsertResponse(insert(request.getInsertRequest()))
...@@ -334,15 +353,102 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -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) { private InsertEntity convert(final Entity insertEntity) {
final InsertEntity entity = final InsertEntity entity =
new InsertEntity( new InsertEntity(
insertEntity.getName().isEmpty() ? null : insertEntity.getName(), insertEntity.getName().isEmpty() ? null : insertEntity.getName(),
Role.parse(insertEntity.getRole())); 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; 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 @Override
public void multiTransaction( public void multiTransaction(
final MultiTransactionRequest request, final MultiTransactionRequest request,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment