diff --git a/src/main/java/org/caosdb/server/query/CQLLexer.g4 b/src/main/java/org/caosdb/server/query/CQLLexer.g4 index 1dc3ad495652bc6b1d6f87b7d21e8224c6ac48d2..be6dcfa99d2f9c48cba8a0f7fccb7f97b277e01d 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 d62b0eaa1ed86dcae86e7a721d204d5883b41b53..8615bae31fae67eb0bd3315f664bfa708db61618 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 bdbda62edec341b75e085fb92046fccd685eb42e..0de160cdb6249ffaea10f4eeeafdf4884323a186 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 ac7fcc9bdb1023a8a2a62eed5ad7cc8d3093f52e..7212423bbaf2ac4d3c5e33543d3e6ffe4e70b5e4 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 533dcda20f46a8004e4b12d9a22d690515792fc4..8d7a7e8fb219f286d6cdaffc4b28240a7b2897d5 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));