diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index 7c87c8bb94cb919ae02db4e5c067e1a33abc7731..9888775156304e611b0419a3b7eebc37eda2770b 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -212,36 +212,49 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa public MultiTransactionResponse retrieve(final MultiTransactionRequest request) throws Exception { final MultiTransactionResponse.Builder builder = MultiTransactionResponse.newBuilder(); final RetrieveContainer container = - new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); + new RetrieveContainer( + SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<>()); 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); - } catch (final NumberFormatException e) { - // We handle this after the retrieval + if (sub_request.getRetrieveRequest().hasQuery() + && !sub_request.getRetrieveRequest().getQuery().getQuery().isBlank()) { + container.getFlags().put("query", sub_request.getRetrieveRequest().getQuery().getQuery()); + } else { + final String id = sub_request.getRetrieveRequest().getId(); + if (!id.isBlank()) { + try { + final RetrieveEntity entity = new RetrieveEntity(getId(id)); + container.add(entity); + } catch (final NumberFormatException e) { + // We handle this after the retrieval + } + } } } final Retrieve transaction = new Retrieve(container); transaction.execute(); + for (final EntityInterface entity : container) { + builder + .addResponsesBuilder() + .setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity))); + } + // Add those entities which have not been retrieved because the have a string id for (final TransactionRequest sub_request : request.getRequestsList()) { final String id = sub_request.getRetrieveRequest().getId(); - try { - final EntityInterface entity = container.getEntityById(getId(id)); - - 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)))); + if (!id.isBlank()) { + try { + getId(id); + } 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)))); + } } } return builder.build();