Skip to content

Commit 04c320c

Browse files
committed
filter required parameters for query execution
1 parent ca7860d commit 04c320c

File tree

3 files changed

+46
-9
lines changed

3 files changed

+46
-9
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;

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import org.apache.commons.lang.StringUtils;
1010

1111
import java.util.Collections;
12+
import java.util.List;
1213
import java.util.Map;
14+
import java.util.stream.Collectors;
15+
import java.util.stream.Stream;
1316

1417
public class ParametersService {
1518

@@ -31,11 +34,37 @@ public void registerParametersProvider(final ParametersProvider parametersProvid
3134
this.parametersProvider = parametersProvider;
3235
}
3336

34-
public Map<String, Object> getParameters() throws Exception {
37+
public Map<String, Object> getParameters(String queryContent) throws Exception {
3538
if (!isValidParametersMap(parametersProvider.getParametersJson())) {
3639
return Collections.emptyMap();
3740
}
38-
return MAPPER.readValue(parametersProvider.getParametersJson(), new TypeReference<Map<String, Object>>() { });
41+
42+
Map<String, Object> allParameters = MAPPER
43+
.readValue(parametersProvider.getParametersJson(), new TypeReference<Map<String, Object>>() { });
44+
45+
return extractQueryParameters(queryContent, allParameters);
46+
}
47+
48+
private Map<String, Object> extractQueryParameters(String query, Map<String, Object> allParameters) {
49+
if (StringUtils.isBlank(query)) {
50+
return Collections.emptyMap();
51+
}
52+
53+
List<String> parameterNames = extractParameterNames(query);
54+
if (parameterNames.isEmpty()) {
55+
return Collections.emptyMap();
56+
}
57+
58+
return allParameters.entrySet().stream()
59+
.filter(entry -> parameterNames.contains(entry.getKey()))
60+
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
61+
}
62+
63+
private List<String> extractParameterNames(String query) {
64+
return Stream.of(query.split("\\s")) // split by whitespace character
65+
.filter(w -> w.startsWith("$"))
66+
.map(w -> w.substring(1))
67+
.collect(Collectors.toList());
3968
}
4069

4170
private static boolean isValidParametersMap(String parametersJson) {

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
@@ -35,7 +35,8 @@ public void setup() {
3535
@Test
3636
public void testParsingEmptyJsonObject() throws Exception {
3737
parametersProvider.setParametersJson("{}");
38-
Map<String, Object> result = parametersService.getParameters();
38+
Map<String, Object> result = parametersService
39+
.getParameters("match (p:Person) return p;");
3940

4041
assertThat(result.isEmpty()).isTrue();
4142
}
@@ -51,7 +52,8 @@ public void testParsingEmptyParameters() throws Exception {
5152
@Test
5253
public void testParsingStringParameter() throws Exception {
5354
parametersProvider.setParametersJson("{\"name\": \"Anna\"}");
54-
Map<String, Object> result = parametersService.getParameters();
55+
Map<String, Object> result = parametersService
56+
.getParameters("match (p:Person) where p.name = $name return *");
5557

5658
assertThat(result.keySet().contains("name")).isTrue();
5759
assertThat(result.values().contains("Anna")).isTrue();
@@ -60,23 +62,26 @@ public void testParsingStringParameter() throws Exception {
6062
@Test
6163
public void testParsingIntegerParameter() throws Exception {
6264
parametersProvider.setParametersJson("{\"p1\": 17}");
63-
Map<String, Object> result = parametersService.getParameters();
65+
Map<String, Object> result = parametersService
66+
.getParameters("match (p:Person) where p.age = $p1 return *");
6467

6568
assertThat(result.get("p1").toString()).isEqualTo("17");
6669
}
6770

6871
@Test
6972
public void testParsingBooleanParameter() throws Exception {
7073
parametersProvider.setParametersJson("{\"p2\": false}");
71-
Map<String, Object> result = parametersService.getParameters();
74+
Map<String, Object> result = parametersService.
75+
getParameters("match (p:Person) where p.is_citizen = $p2 return *");
7276

7377
assertThat(result.get("p2").toString()).isEqualTo("false");
7478
}
7579

7680
@Test
7781
public void testParsingJsonObjectParameter() throws Exception {
7882
parametersProvider.setParametersJson("{\"p3\": {\"name\":\"Alex\"}}");
79-
Map<String, Object> result = parametersService.getParameters();
83+
Map<String, Object> result = parametersService.
84+
getParameters("match (p:Person) where p.father = $p3 return *");
8085

8186
Map<String, Object> jsonVal = (Map<String, Object>) result.get("p3");
8287
assertThat(jsonVal).containsKey("name");
@@ -86,7 +91,10 @@ public void testParsingJsonObjectParameter() throws Exception {
8691
@Test
8792
public void testParsingMultipleParameters() throws Exception {
8893
parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}");
89-
Map<String, Object> result = parametersService.getParameters();
94+
Map<String, Object> result = parametersService
95+
.getParameters("match (p:Person)\n" +
96+
"where p.first_name = $firstName " +
97+
" and p.last_name = $lastName return *");
9098

9199
assertThat(result.get("firstName").toString()).isEqualTo("Kaleb");
92100
assertThat(result.get("lastName").toString()).isEqualTo("Johnson");

0 commit comments

Comments
 (0)