From f8b6e01d2e255edb14d8805c8e7c0c57de09c2e8 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 20 Oct 2022 15:21:02 +0200
Subject: [PATCH] WIP: SELECT for GRPC API

---
 .../grpc/EntityTransactionServiceImpl.java    |  7 ++--
 .../caosdb/server/jobs/core/ExecuteQuery.java |  4 +--
 .../java/org/caosdb/server/query/TestCQL.java | 34 ++++++++++++++++---
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 30c493a8..09ba156e 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -136,10 +136,13 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
       builder
           .addResponsesBuilder()
           .setRetrieveResponse(RetrieveResponse.newBuilder().setCountResult(count));
-    } else if (container.getFlags().containsKey("query_select") && "true".equals(container.getFlags().get("query_select"))) {
+    } else if (container.getFlags().containsKey("query_select")
+        && "true".equals(container.getFlags().get("query_select"))) {
       // this was a select query
       SelectQueryResult.Builder selectResult = caosdbToGrpc.convertSelectResult(container);
-      builder.addResponsesBuilder().setRetrieveResponse(RetrieveResponse.newBuilder().setSelectResult(selectResult));
+      builder
+          .addResponsesBuilder()
+          .setRetrieveResponse(RetrieveResponse.newBuilder().setSelectResult(selectResult));
     } else {
       final boolean download_files_container = container.getFlags().containsKey("download_files");
       for (final EntityInterface entity : container) {
diff --git a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
index 0126c83e..f584d365 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
@@ -61,9 +61,7 @@ public class ExecuteQuery extends FlagJob {
             .put("query_count_result", Integer.toString(queryInstance.getCount()));
         break;
       case SELECT:
-        getContainer()
-            .getFlags()
-            .put("query_select", "true");
+        getContainer().getFlags().put("query_select", "true");
 
       default:
         break;
diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java
index cfd53f94..fe73e2b2 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -278,6 +278,10 @@ public class TestCQL {
       "SELECT 'name with spaces.and dot', 'name with spaces'.name, name with spaces.name, name with\\,comma and\\.dot and \\'single_quote.sub FROM ENTITY";
   String issue130b = "SELECT 'Wrapper' FROM RECORD TestRT";
 
+  // quotation marks gone rogue
+  String quotation1 =
+      "FIND ENTITY WHICH HAS A PROPERTY LIKE '*with double*' AND A PROPERTY LIKE '*and single*' AND A PROPERTY LIKE '*what\\'s wrong?*' AND A PROPERTY LIKE '*\\'*' AND A PROPERTY LIKE '*nothin\\'*' AND A PROPERTY LIKE '*\"\\'bla*'";
+
   @Test
   public void testQuery1()
       throws InterruptedException, SQLException, ConnectionException, QueryException {
@@ -6082,7 +6086,7 @@ public class TestCQL {
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals("ename", sfq.e.toString());
     assertEquals(Query.Role.RECORD, sfq.r);
-    assertEquals(Query.Type.FIND, sfq.t);
+    assertEquals(Query.Type.SELECT, sfq.t);
     assertNotNull(sfq.s);
     assertFalse(sfq.s.isEmpty());
     assertEquals(1, sfq.s.size());
@@ -6105,7 +6109,7 @@ public class TestCQL {
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals("ename", sfq.e.toString());
     assertEquals(Query.Role.RECORD, sfq.r);
-    assertEquals(Query.Type.FIND, sfq.t);
+    assertEquals(Query.Type.SELECT, sfq.t);
     assertNotNull(sfq.s);
     assertFalse(sfq.s.isEmpty());
     assertEquals(1, sfq.s.size());
@@ -6128,7 +6132,7 @@ public class TestCQL {
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals("ename", sfq.e.toString());
     assertEquals(Query.Role.RECORD, sfq.r);
-    assertEquals(Query.Type.FIND, sfq.t);
+    assertEquals(Query.Type.SELECT, sfq.t);
     assertNotNull(sfq.s);
     assertFalse(sfq.s.isEmpty());
     assertEquals(3, sfq.s.size());
@@ -6156,7 +6160,7 @@ public class TestCQL {
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals("ename", sfq.e.toString());
     assertEquals(Query.Role.RECORD, sfq.r);
-    assertEquals(Query.Type.FIND, sfq.t);
+    assertEquals(Query.Type.SELECT, sfq.t);
     assertNotNull(sfq.s);
     assertFalse(sfq.s.isEmpty());
     assertEquals(4, sfq.s.size());
@@ -6619,7 +6623,7 @@ public class TestCQL {
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
-    assertEquals(Query.Type.FIND, sfq.t);
+    assertEquals(Query.Type.SELECT, sfq.t);
     assertNotNull(sfq.s);
     assertFalse(sfq.s.isEmpty());
     assertEquals(1, sfq.s.size());
@@ -6989,4 +6993,24 @@ public class TestCQL {
     assertEquals("Wrapper", sfq.s.get(0).getSelector());
     assertNull(sfq.s.get(0).getSubselection());
   }
+
+  @Test
+  public void testQuotation1() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.quotation1));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    assertTrue(sfq.filter instanceof Conjunction);
+    Conjunction conj = (Conjunction) sfq.filter;
+    assertEquals(6, conj.getFilters().size());
+    assertEquals("POV(null,LIKE ,%with double%)", conj.getFilters().get(0).toString());
+    assertEquals("POV(null,LIKE ,%and single%)", conj.getFilters().get(1).toString());
+    assertEquals("POV(null,LIKE ,%what's wrong?%)", conj.getFilters().get(2).toString());
+    assertEquals("POV(null,LIKE ,%'%)", conj.getFilters().get(3).toString());
+    assertEquals("POV(null,LIKE ,%nothin'%)", conj.getFilters().get(4).toString());
+    assertEquals("POV(null,LIKE ,%\"'bla%)", conj.getFilters().get(5).toString());
+  }
 }
-- 
GitLab