Skip to content

Commit df9f9b5

Browse files
committed
filter required parameters for query execution
1 parent e728938 commit df9f9b5

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/ExecuteQueryAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void actionPerformed(AnActionEvent e) {
8787
Map<String, Object> parameters;
8888
try {
8989
ParametersService service = ServiceManager.getService(project, ParametersService.class);
90-
parameters = service.getParameters();
90+
parameters = service.getParameters(content);
9191
} catch (Exception exception) {
9292
sendParametersRetrievalErrorEvent(messageBus, exception, editor);
9393
return;
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params;
22

3-
import com.fasterxml.jackson.core.JsonFactory;
43
import com.fasterxml.jackson.core.JsonParser;
54
import com.fasterxml.jackson.core.type.TypeReference;
65
import com.fasterxml.jackson.databind.ObjectMapper;
76
import org.apache.commons.lang.StringUtils;
87

98
import java.util.Collections;
9+
import java.util.List;
1010
import java.util.Map;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
1113

1214
public class ParametersService {
1315

@@ -18,8 +20,6 @@ public class ParametersService {
1820
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)
1921
.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
2022

21-
private static final JsonFactory FACTORY = MAPPER.getFactory();
22-
2323
private ParametersProvider parametersProvider;
2424

2525
public void registerParametersProvider(final ParametersProvider parametersProvider) {
@@ -29,11 +29,37 @@ public void registerParametersProvider(final ParametersProvider parametersProvid
2929
this.parametersProvider = parametersProvider;
3030
}
3131

32-
public Map<String, Object> getParameters() throws Exception {
32+
public Map<String, Object> getParameters(String queryContent) throws Exception {
3333
if (parametersProvider == null || StringUtils.isBlank(parametersProvider.getParametersJson())) {
3434
return Collections.emptyMap();
3535
}
36-
return MAPPER.readValue(parametersProvider.getParametersJson(), new TypeReference<Map<String, Object>>() { });
36+
37+
Map<String, Object> allParameters = MAPPER
38+
.readValue(parametersProvider.getParametersJson(), new TypeReference<Map<String, Object>>() { });
39+
40+
return extractQueryParameters(queryContent, allParameters);
41+
}
42+
43+
private Map<String, Object> extractQueryParameters(String query, Map<String, Object> allParameters) {
44+
if (StringUtils.isBlank(query)) {
45+
return Collections.emptyMap();
46+
}
47+
48+
List<String> parameterNames = extractParameterNames(query);
49+
if (parameterNames.isEmpty()) {
50+
return Collections.emptyMap();
51+
}
52+
53+
return allParameters.entrySet().stream()
54+
.filter(entry -> parameterNames.contains(entry.getKey()))
55+
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
56+
}
57+
58+
private List<String> extractParameterNames(String query) {
59+
return Stream.of(query.split("\\s")) // split by whitespace character
60+
.filter(w -> w.startsWith("$"))
61+
.map(w -> w.substring(1))
62+
.collect(Collectors.toList());
3763
}
3864

3965
}

ui/jetbrains/src/test/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersServiceTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ public void setup() {
3434
@Test
3535
public void testParsingEmptyJsonObject() throws Exception {
3636
parametersProvider.setParametersJson("{}");
37-
Map<String, Object> result = parametersService.getParameters();
37+
Map<String, Object> result = parametersService
38+
.getParameters("match (p:Person) return p;");
3839

3940
assertThat(result.isEmpty()).isTrue();
4041
}
4142

4243
@Test
4344
public void testParsingStringParameter() throws Exception {
4445
parametersProvider.setParametersJson("{\"name\": \"Anna\"}");
45-
Map<String, Object> result = parametersService.getParameters();
46+
Map<String, Object> result = parametersService
47+
.getParameters("match (p:Person) where p.name = $name return *");
4648

4749
assertThat(result.keySet().contains("name")).isTrue();
4850
assertThat(result.values().contains("Anna")).isTrue();
@@ -51,23 +53,26 @@ public void testParsingStringParameter() throws Exception {
5153
@Test
5254
public void testParsingIntegerParameter() throws Exception {
5355
parametersProvider.setParametersJson("{\"p1\": 17}");
54-
Map<String, Object> result = parametersService.getParameters();
56+
Map<String, Object> result = parametersService
57+
.getParameters("match (p:Person) where p.age = $p1 return *");
5558

5659
assertThat(result.get("p1").toString()).isEqualTo("17");
5760
}
5861

5962
@Test
6063
public void testParsingBooleanParameter() throws Exception {
6164
parametersProvider.setParametersJson("{\"p2\": false}");
62-
Map<String, Object> result = parametersService.getParameters();
65+
Map<String, Object> result = parametersService.
66+
getParameters("match (p:Person) where p.is_citizen = $p2 return *");
6367

6468
assertThat(result.get("p2").toString()).isEqualTo("false");
6569
}
6670

6771
@Test
6872
public void testParsingJsonObjectParameter() throws Exception {
6973
parametersProvider.setParametersJson("{\"p3\": {\"name\":\"Alex\"}}");
70-
Map<String, Object> result = parametersService.getParameters();
74+
Map<String, Object> result = parametersService.
75+
getParameters("match (p:Person) where p.father = $p3 return *");
7176

7277
Map<String, Object> jsonVal = (Map<String, Object>) result.get("p3");
7378
assertThat(jsonVal).containsKey("name");
@@ -77,7 +82,10 @@ public void testParsingJsonObjectParameter() throws Exception {
7782
@Test
7883
public void testParsingMultipleParameters() throws Exception {
7984
parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}");
80-
Map<String, Object> result = parametersService.getParameters();
85+
Map<String, Object> result = parametersService
86+
.getParameters("match (p:Person)\n" +
87+
"where p.first_name = $firstName " +
88+
" and p.last_name = $lastName return *");
8189

8290
assertThat(result.get("firstName").toString()).isEqualTo("Kaleb");
8391
assertThat(result.get("lastName").toString()).isEqualTo("Johnson");

0 commit comments

Comments
 (0)