Skip to content
This repository was archived by the owner on Jul 6, 2023. It is now read-only.

Commit eac99b6

Browse files
Merge pull request #251 from LinneaAndersson/4.2-javacc-parse-params
Use JavaCC for parameter parsing
2 parents ec55e59 + a20f991 commit eac99b6

File tree

16 files changed

+101
-48
lines changed

16 files changed

+101
-48
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ ext {
6969

7070
argparse4jVersion = '0.7.0'
7171
junitVersion = '4.12'
72-
evaluatorVersion = '3.5.14'
72+
evaluatorVersion = '4.1.1'
7373
neo4jJavaDriverVersion = '4.2.0-alpha01'
7474
findbugsVersion = '3.0.0'
7575
jansiVersion = '1.13'

cypher-shell/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ dependencies {
5454
exclude(group: 'org.neo4j', module: 'neo4j-native')
5555
exclude(group: 'org.neo4j', module: 'neo4j-logging')
5656
exclude(group: 'org.neo4j', module: 'neo4j-procedure-api')
57-
exclude(group: 'org.neo4j', module: 'neo4j-kernel-api')
5857
exclude(group: 'org.eclipse.collections')
5958
}
59+
compile("org.neo4j:neo4j-cypher-javacc-parser:$evaluatorVersion")
6060
compile "org.neo4j.driver:neo4j-java-driver:$neo4jJavaDriverVersion"
6161
compileOnly "com.google.code.findbugs:annotations:$findbugsVersion"
6262
compile "org.fusesource.jansi:jansi:$jansiVersion"

cypher-shell/src/main/java/org/neo4j/shell/Connector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import javax.annotation.Nonnull;
44

5-
import org.neo4j.function.ThrowingAction;
65
import org.neo4j.shell.exception.CommandException;
6+
import org.neo4j.shell.exception.ThrowingAction;
77

88
/**
99
* An object with the ability to connect and disconnect.

cypher-shell/src/main/java/org/neo4j/shell/CypherShell.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
import org.neo4j.driver.exceptions.DiscoveryException;
99
import org.neo4j.driver.exceptions.Neo4jException;
1010
import org.neo4j.driver.exceptions.ServiceUnavailableException;
11-
import org.neo4j.function.ThrowingAction;
1211
import org.neo4j.shell.commands.Command;
1312
import org.neo4j.shell.commands.CommandExecutable;
1413
import org.neo4j.shell.commands.CommandHelper;
1514
import org.neo4j.shell.exception.CommandException;
1615
import org.neo4j.shell.exception.ExitException;
16+
import org.neo4j.shell.exception.ThrowingAction;
1717
import org.neo4j.shell.prettyprint.LinePrinter;
1818
import org.neo4j.shell.prettyprint.PrettyConfig;
1919
import org.neo4j.shell.prettyprint.PrettyPrinter;

cypher-shell/src/main/java/org/neo4j/shell/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010

1111
import org.neo4j.driver.exceptions.AuthenticationException;
1212
import org.neo4j.driver.exceptions.Neo4jException;
13-
import org.neo4j.function.ThrowingAction;
1413
import org.neo4j.shell.build.Build;
1514
import org.neo4j.shell.cli.CliArgHelper;
1615
import org.neo4j.shell.cli.CliArgs;
1716
import org.neo4j.shell.commands.CommandHelper;
1817
import org.neo4j.shell.exception.CommandException;
18+
import org.neo4j.shell.exception.ThrowingAction;
1919
import org.neo4j.shell.log.AnsiLogger;
2020
import org.neo4j.shell.log.Logger;
2121
import org.neo4j.shell.prettyprint.PrettyConfig;

cypher-shell/src/main/java/org/neo4j/shell/ParameterMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.neo4j.shell;
22

3-
import org.neo4j.cypher.internal.evaluator.EvaluationException;
3+
import org.neo4j.shell.exception.ParameterException;
44
import org.neo4j.shell.state.ParamValue;
55

66
import javax.annotation.Nonnull;
@@ -15,7 +15,7 @@ public interface ParameterMap {
1515
* @param valueString to interpret the value from
1616
* @return the evaluated value
1717
*/
18-
Object setParameter(@Nonnull String name, @Nonnull String valueString) throws EvaluationException;
18+
Object setParameter(@Nonnull String name, @Nonnull String valueString) throws ParameterException;
1919

2020
/**
2121
* @return map of all currently set variables and their values

cypher-shell/src/main/java/org/neo4j/shell/ShellParameterMap.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package org.neo4j.shell;
22

3+
import java.io.StringReader;
34
import java.util.HashMap;
45
import java.util.Map;
56
import java.util.stream.Collectors;
67
import javax.annotation.Nonnull;
78

9+
import org.neo4j.cypher.internal.ast.factory.LiteralInterpreter;
810
import org.neo4j.cypher.internal.evaluator.EvaluationException;
911
import org.neo4j.cypher.internal.evaluator.Evaluator;
1012
import org.neo4j.cypher.internal.evaluator.ExpressionEvaluator;
13+
import org.neo4j.cypher.internal.parser.javacc.Cypher;
14+
import org.neo4j.cypher.internal.parser.javacc.ParseException;
15+
import org.neo4j.shell.exception.ParameterException;
1116
import org.neo4j.shell.prettyprint.CypherVariablesFormatter;
1217
import org.neo4j.shell.state.ParamValue;
1318

@@ -17,15 +22,29 @@
1722
public class ShellParameterMap implements ParameterMap
1823
{
1924
private final Map<String, ParamValue> queryParams = new HashMap<>();
25+
private LiteralInterpreter interpreter = new LiteralInterpreter();
2026
private ExpressionEvaluator evaluator = Evaluator.expressionEvaluator();
2127

28+
2229
@Override
23-
public Object setParameter( @Nonnull String name, @Nonnull String valueString ) throws EvaluationException
30+
public Object setParameter( @Nonnull String name, @Nonnull String valueString ) throws ParameterException
2431
{
2532
String parameterName = CypherVariablesFormatter.unescapedCypherVariable( name );
26-
Object value = evaluator.evaluate( valueString, Object.class );
27-
queryParams.put( parameterName, new ParamValue( valueString, value ) );
28-
return value;
33+
try {
34+
Object value = new Cypher<>( interpreter,
35+
ParameterException.FACTORY,
36+
new StringReader( valueString ) ).Expression();
37+
queryParams.put( parameterName, new ParamValue( valueString, value ) );
38+
return value;
39+
} catch (ParseException | UnsupportedOperationException e) {
40+
try {
41+
Object value = evaluator.evaluate( valueString, Object.class );
42+
queryParams.put( parameterName, new ParamValue( valueString, value ) );
43+
return value;
44+
} catch (EvaluationException e1) {
45+
throw new ParameterException( e1.getMessage() );
46+
}
47+
}
2948
}
3049

3150
@Nonnull

cypher-shell/src/main/java/org/neo4j/shell/cli/AddParamArgumentAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import java.util.Map;
99

10-
import org.neo4j.cypher.internal.evaluator.EvaluationException;
1110
import org.neo4j.shell.ParameterMap;
11+
import org.neo4j.shell.exception.ParameterException;
1212
import org.neo4j.shell.util.ParameterSetter;
1313

1414
/**
@@ -63,7 +63,7 @@ protected void onWrongNumberOfArguments()
6363
}
6464

6565
@Override
66-
protected void onEvaluationException( EvaluationException e )
66+
protected void onParameterException( ParameterException e )
6767
{
6868
throw new RuntimeException( e.getMessage(), e );
6969
}

cypher-shell/src/main/java/org/neo4j/shell/commands/Param.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package org.neo4j.shell.commands;
22

3-
import org.neo4j.cypher.internal.evaluator.EvaluationException;
43
import org.neo4j.shell.ParameterMap;
54
import org.neo4j.shell.exception.CommandException;
5+
import org.neo4j.shell.exception.ParameterException;
66
import org.neo4j.shell.log.AnsiFormattedText;
77
import org.neo4j.shell.util.ParameterSetter;
88

99
import javax.annotation.Nonnull;
1010
import java.util.Collections;
1111
import java.util.List;
12-
import java.util.function.BiPredicate;
13-
import java.util.regex.Matcher;
14-
import java.util.regex.Pattern;
15-
1612

1713
/**
1814
* This command sets a variable to a name, for use as query parameter.
@@ -72,7 +68,7 @@ protected void onWrongNumberOfArguments() throws CommandException
7268
}
7369

7470
@Override
75-
protected void onEvaluationException( EvaluationException e ) throws CommandException
71+
protected void onParameterException( ParameterException e ) throws CommandException
7672
{
7773
throw new CommandException( e.getMessage(), e );
7874
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.neo4j.shell.exception;
2+
3+
import org.neo4j.cypher.internal.ast.factory.ASTExceptionFactory;
4+
5+
public class ParameterException extends IllegalArgumentException {
6+
public ParameterException(String msg) {
7+
super(msg);
8+
}
9+
10+
public static final ASTExceptionFactory FACTORY = new ASTExceptionFactory() {
11+
@Override
12+
public Exception syntaxException(Exception e) {
13+
return new ParameterException(e.getMessage());
14+
}
15+
16+
@Override
17+
public Exception invalidUnicodeLiteral(String s) {
18+
return new ParameterException(s);
19+
}
20+
};
21+
}

0 commit comments

Comments
 (0)