From 992d94e0754bc639b3528be959e5eba7c00e9fb9 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Fri, 14 Apr 2023 14:32:01 +0200
Subject: [PATCH] EHN: allow + sign before number (CQL)

---
 src/main/java/org/caosdb/server/query/CQLLexer.g4  | 9 +++++++--
 src/main/java/org/caosdb/server/query/CQLParser.g4 | 4 ++--
 src/main/java/org/caosdb/server/query/POV.java     | 2 +-
 src/test/java/org/caosdb/server/query/POVTest.java | 5 +++--
 src/test/java/org/caosdb/server/query/TestCQL.java | 8 ++++++--
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/caosdb/server/query/CQLLexer.g4 b/src/main/java/org/caosdb/server/query/CQLLexer.g4
index 1dc3ad49..be6dcfa9 100644
--- a/src/main/java/org/caosdb/server/query/CQLLexer.g4
+++ b/src/main/java/org/caosdb/server/query/CQLLexer.g4
@@ -529,7 +529,7 @@ COLON:
 
 /** Matches signed and unsigned numbers with decimal points, also numbers in scientific notation. */
 DECIMAL_NUMBER:
-    (HYPHEN_f WHITE_SPACE_f?)? 
+    ((HYPHEN_f | PLUS ) WHITE_SPACE_f?)? 
     ( NUM_f? DOT NUM_f WHITE_SPACE_f? E_NOTATION_f?
     | NUM_f WHITE_SPACE_f? E_NOTATION_f
     )
@@ -540,6 +540,11 @@ HYPHEN:
     HYPHEN_f
 ;
 
+/** */
+PLUS:
+	'+'
+;
+
 /** */
 fragment
 HYPHEN_f:
@@ -565,7 +570,7 @@ E_NOTATION_f:
 
 /** */
 TXT:
-    ('a'..'z' | 'A'..'Z' | NUM_f | '_' | '-' {_input.LA(1) != '>'}? | '+' | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
+    ('a'..'z' | 'A'..'Z' | NUM_f | '_' | '-' {_input.LA(1) != '>'}? | PLUS | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
 ;
 
 /** */
diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4
index d62b0eaa..8615bae3 100644
--- a/src/main/java/org/caosdb/server/query/CQLParser.g4
+++ b/src/main/java/org/caosdb/server/query/CQLParser.g4
@@ -613,7 +613,7 @@ value returns [String str]
  */
 number_with_unit
 :
-    ( UNSIGNED_INT | DECIMAL_NUMBER | HYPHEN WHITE_SPACE? UNSIGNED_INT)
+    ( UNSIGNED_INT | DECIMAL_NUMBER | ( HYPHEN | PLUS ) WHITE_SPACE? UNSIGNED_INT)
     (WHITE_SPACE? unit)?
 ;
 
@@ -625,7 +625,7 @@ unit
     (~(WHITE_SPACE | WHICH | HAS_A | WITH_A | WHERE | DOT | AND | OR | RPAREN ))
     (~(WHITE_SPACE))*
     |
-    HYPHEN?? UNSIGNED_INT SLASH (~(WHITE_SPACE))+
+    UNSIGNED_INT SLASH (~(WHITE_SPACE))+
 ;
 
 /**
diff --git a/src/main/java/org/caosdb/server/query/POV.java b/src/main/java/org/caosdb/server/query/POV.java
index bdbda62e..0de160cd 100644
--- a/src/main/java/org/caosdb/server/query/POV.java
+++ b/src/main/java/org/caosdb/server/query/POV.java
@@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory;
 public class POV implements EntityFilterInterface {
   public static final Pattern NUMBER_PATTERN =
       Pattern.compile(
-          "^((?:-\\s*)?[0-9]+(?:\\.[0-9]+)?(?:\\s*[eE]\\s*[+-]?\\s*[0-9]+)?)\\s*([^-]*)$");
+          "^((?:[+-]\\s*)?[0-9]+(?:\\.[0-9]+)?(?:\\s*[eE]\\s*[+-]?\\s*[0-9]+)?)\\s*([^-]*)$");
   private SubProperty subp = null;
   public static int retry = 10;
   private int retry_count = 0;
diff --git a/src/test/java/org/caosdb/server/query/POVTest.java b/src/test/java/org/caosdb/server/query/POVTest.java
index ac7fcc9b..7212423b 100644
--- a/src/test/java/org/caosdb/server/query/POVTest.java
+++ b/src/test/java/org/caosdb/server/query/POVTest.java
@@ -15,7 +15,7 @@ class POVTest {
   public static final String MIN_DOUBLE = "4.9E-324";
 
   @ParameterizedTest
-  @ValueSource(strings = {"16", MAX_INT, MIN_INT, "0", "-0", "1", "- 1", "-1"})
+  @ValueSource(strings = {"16", MAX_INT, MIN_INT, "0", "-0", "1", "- 1", "-1", "+1"})
   void testNumberPatternMatchInteger(String intValue) {
 
     Matcher matcher = POV.NUMBER_PATTERN.matcher(intValue);
@@ -53,7 +53,8 @@ class POVTest {
         "2e-323",
         "2E-323",
         "2E- 323",
-        "2 e -323"
+        "2 e -323",
+        "+ 2.2132e+23"
       })
   void testNumberPatternMatchDouble(String doubleValue) {
 
diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java
index 533dcda2..8d7a7e8f 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -7034,7 +7034,11 @@ public class TestCQL {
         "3E15m^2",
         "-3e15m",
         "-3e15 1/s",
-        "3e15 m^2"
+        "3e15 m^2",
+        "+1",
+        "+2.234",
+        "+2.234e+23",
+        "+3.324E-23"
       })
   public void testIssue144(String scientific_notation) {
     CQLLexer lexer;
@@ -7057,7 +7061,7 @@ public class TestCQL {
   }
 
   @ParameterizedTest
-  @ValueSource(strings = {"- 123", "- 1e23", "2 e -23", "2E- 323"})
+  @ValueSource(strings = {"- 123", "- 1e23", "2 e -23", "2E- 323", "+ 1"})
   public void testIssue144WhiteSpaceInNumber(String number) {
     CQLLexer lexer;
     lexer = new CQLLexer(CharStreams.fromString(this.issue144 + number));
-- 
GitLab