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