Skip to content

Commit fda97e7

Browse files
authored
Datasource-specific query parameter editor
* left-margin badge now executes queries with params * Editor for file-specific query params. Some refactoring * Short scratch name in local Parameters editor * Global/local param toggle * File-specific param editor is disabled when not needed. Some refactoring and bugfixing * Tests fixed * Correct icons and labels in all cases * Support params for equal filenames in different directories * Code fixes * Removed toggle button. FileSpecific parameters now merge with global instead of replacing them * Storing parameters in datasource attributes instead of files * JSON syntax highlighting fixed in fileSpecificParam editor * Text fixes * JsonFileType optimization * Code refactoring * Compact text. Tooltip. Help icon (parameters)
1 parent 97e5ec0 commit fda97e7

File tree

16 files changed

+389
-95
lines changed

16 files changed

+389
-95
lines changed

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/file/CypherFileTypeFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.intellij.openapi.fileTypes.FileTypeConsumer;
44
import com.intellij.openapi.fileTypes.FileTypeFactory;
5+
import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.FileTypeExtensionUtil;
56
import org.jetbrains.annotations.NotNull;
67

78
/**
@@ -13,6 +14,6 @@ public class CypherFileTypeFactory extends FileTypeFactory {
1314

1415
@Override
1516
public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) {
16-
fileTypeConsumer.consume(CypherFileType.INSTANCE, "cyp;cypher;cql");
17+
fileTypeConsumer.consume(CypherFileType.INSTANCE, String.join(";", FileTypeExtensionUtil.EXTENSIONS));
1718
}
1819
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.neueda.jetbrains.plugin.graphdb.language.cypher.util;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class FileTypeExtensionUtil {
7+
8+
public static final List<String> EXTENSIONS = Arrays.asList("cyp", "cql", "cypher");
9+
10+
public static boolean isCypherFileTypeExtension(String extension) {
11+
return extension != null && EXTENSIONS.contains(extension);
12+
}
13+
14+
}

testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java

Lines changed: 77 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,31 @@
88

99
import java.util.Map;
1010

11-
import static org.assertj.core.api.Assertions.*;
11+
import static org.assertj.core.api.Assertions.assertThat;
1212

1313
public class CypherParametersProviderTest extends BaseIntegrationTest {
1414

1515
private class TestParametersProvider implements ParametersProvider {
1616

17-
private String parametersJson;
17+
private String globalParametersJson;
18+
private String fileSpecificParametersJson;
1819

1920
@Override
20-
public String getParametersJson() {
21-
return parametersJson;
21+
public String getGlobalParametersJson() {
22+
return globalParametersJson;
2223
}
2324

24-
public void setParametersJson(String parametersJson) {
25-
this.parametersJson = parametersJson;
25+
@Override
26+
public String getFileSpecificParametersJson() {
27+
return fileSpecificParametersJson;
28+
}
29+
30+
public void setGlobalParametersJson(String parametersJson) {
31+
this.globalParametersJson = parametersJson;
32+
}
33+
34+
public void setFileSpecificParametersJson(String fileSpecificParametersJson) {
35+
this.fileSpecificParametersJson = fileSpecificParametersJson;
2636
}
2737
}
2838

@@ -38,44 +48,74 @@ public void setUp() throws Exception {
3848
}
3949

4050
public void testParsingEmptyJsonObject() throws Exception {
41-
parametersProvider.setParametersJson("{}");
51+
parametersProvider.setGlobalParametersJson("{}");
52+
parametersProvider.setFileSpecificParametersJson("{}");
4253
Map<String, Object> parameters = parametersService.getParameters(getPsiFile("RETURN $param"));
4354
assertThat(parameters).isEmpty();
4455
}
4556

4657
public void testParsingEmptyParameters() throws Exception {
47-
parametersProvider.setParametersJson("");
58+
parametersProvider.setGlobalParametersJson("");
59+
parametersProvider.setFileSpecificParametersJson("");
4860
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
49-
5061
assertThat(result).isEmpty();
5162
}
5263

64+
public void testParsingEmptyGlobalParameters() throws Exception {
65+
parametersProvider.setGlobalParametersJson("");
66+
parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}");
67+
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
68+
assertThat(result).containsEntry("param", "non-empty");
69+
}
70+
71+
public void testParsingEmptyFileSpecificParameters() throws Exception {
72+
parametersProvider.setGlobalParametersJson("{\"param\": \"non-empty\"}");
73+
parametersProvider.setFileSpecificParametersJson("");
74+
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
75+
assertThat(result).containsEntry("param", "non-empty");
76+
}
77+
78+
79+
public void testParsingEmptyJsonInGlobalParameters() throws Exception {
80+
parametersProvider.setGlobalParametersJson("{}");
81+
parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}");
82+
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
83+
assertThat(result).containsEntry("param", "non-empty");
84+
}
85+
86+
public void testParsingEmptyJsonInFileSpecificParameters() throws Exception {
87+
parametersProvider.setGlobalParametersJson("{\"param\": \"non-empty\"}");
88+
parametersProvider.setFileSpecificParametersJson("{}");
89+
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
90+
assertThat(result).containsEntry("param", "non-empty");
91+
}
92+
5393
public void testParsingStringParameter() throws Exception {
54-
parametersProvider.setParametersJson("{\"name\": \"Anna\"}");
94+
parametersProvider.setGlobalParametersJson("{\"name\": \"Anna\"}");
5595
Map<String, Object> result = parametersService
5696
.getParameters(getPsiFile("match (p:Person) where p.name = $name return *"));
5797

5898
assertThat(result).containsEntry("name", "Anna");
5999
}
60100

61101
public void testParsingIntegerParameter() throws Exception {
62-
parametersProvider.setParametersJson("{\"p1\": 17}");
102+
parametersProvider.setGlobalParametersJson("{\"p1\": 17}");
63103
Map<String, Object> result = parametersService
64104
.getParameters(getPsiFile("match (p:Person) where p.age = $p1 return *"));
65105

66106
assertThat(result).containsEntry("p1", 17);
67107
}
68108

69109
public void testParsingBooleanParameter() throws Exception {
70-
parametersProvider.setParametersJson("{\"p2\": false}");
110+
parametersProvider.setGlobalParametersJson("{\"p2\": false}");
71111
Map<String, Object> result = parametersService.
72112
getParameters(getPsiFile("match (p:Person) where p.is_citizen = $p2 return *"));
73113

74114
assertThat(result).containsEntry("p2", false);
75115
}
76116

77117
public void testParsingJsonObjectParameter() throws Exception {
78-
parametersProvider.setParametersJson("{\"p3\": {\"name\":\"Alex\"}}");
118+
parametersProvider.setGlobalParametersJson("{\"p3\": {\"name\":\"Alex\"}}");
79119
Map<String, Object> result = parametersService.
80120
getParameters(getPsiFile("match (p:Person) where p.father = $p3 return *"));
81121

@@ -84,55 +124,64 @@ public void testParsingJsonObjectParameter() throws Exception {
84124
}
85125

86126
public void testParsingMultipleParameters() throws Exception {
87-
parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}");
127+
parametersProvider.setGlobalParametersJson(
128+
"{\"firstName\": \"Kaleb\", \'age\': 35, \"city\": \"Paris\", \"country\": \"France\"}"
129+
);
130+
parametersProvider.setFileSpecificParametersJson(
131+
"{\"lastName\": \"Green\", \"age\": 90}"
132+
);
133+
88134
Map<String, Object> result = parametersService
89135
.getParameters(getPsiFile("match (p:Person)\n" +
90136
"where p.first_name = $firstName " +
91-
" and p.last_name = $lastName return *"));
92-
137+
" and p.last_name = $lastName " +
138+
" and p.age = $age " +
139+
" and p.city = $city return *"));
93140
assertThat(result)
94-
.hasSize(2)
141+
.hasSize(4)
95142
.containsEntry("firstName", "Kaleb")
96-
.containsEntry("lastName", "Johnson");
143+
.containsEntry("lastName", "Green")
144+
.containsEntry("age", 90)
145+
.containsEntry("city", "Paris");
97146
}
98147

99148
public void testParsingCommentOnly() throws Exception {
100-
parametersProvider.setParametersJson("// Provide query parameters in JSON format here:");
149+
parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:");
101150
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $param"));
102151

103152
assertThat(result).isEmpty();
104153
}
105154

106155
public void testParsingCommentWithParameter() throws Exception {
107-
parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n{\"name\": \"Eva\"}");
156+
parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:\n{\"name\": \"Eva\"}");
108157
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $name"));
109158

110159
assertThat(result).hasSize(1);
111160
}
112161

113162
public void testParsingNumericParameter() throws Exception {
114-
parametersProvider.setParametersJson("{\"0\": \"Tom\"}");
163+
parametersProvider.setGlobalParametersJson("{\"0\": \"Tom\"}");
115164
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $0"));
116165

117166
assertThat(result).containsEntry("0", "Tom");
118167
}
119168

120169
public void testParsingOldStyleStringParameter() throws Exception {
121-
parametersProvider.setParametersJson("{\"name\": \"Ethan\"}");
170+
parametersProvider.setGlobalParametersJson("{\"name\": \"Ethan\"}");
122171
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN {name}"));
123172

124173
assertThat(result).containsEntry("name", "Ethan");
125174
}
126175

127176
public void testParsingOldStyleNumericParameter() throws Exception {
128-
parametersProvider.setParametersJson("{\"0\": \"Simon\"}");
177+
parametersProvider.setGlobalParametersJson("{\"0\": \"Simon\"}");
129178
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN {0}"));
130179

131180
assertThat(result).containsEntry("0", "Simon");
132181
}
133182

134183
public void testFilteringUsedParameters() throws Exception {
135-
parametersProvider.setParametersJson("{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}");
184+
parametersProvider.setGlobalParametersJson("{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}");
136185
Map<String, Object> result = parametersService.getParameters(getPsiFile("RETURN $lastName"));
137186

138187
assertThat(result)
@@ -142,7 +191,7 @@ public void testFilteringUsedParameters() throws Exception {
142191

143192
public void testParsingJsonArray() throws Exception {
144193
try {
145-
parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n[\"item1\",\"item2\"]");
194+
parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:\n[\"item1\",\"item2\"]");
146195
parametersService.getParameters(getPsiFile("return 1"));
147196
fail("JsonMappingException expected because of array in parameters json expected");
148197
} catch (JsonMappingException e) {
@@ -152,7 +201,7 @@ public void testParsingJsonArray() throws Exception {
152201

153202
public void testParsingNumber() throws Exception {
154203
try {
155-
parametersProvider.setParametersJson("1");
204+
parametersProvider.setGlobalParametersJson("1");
156205
parametersService.getParameters(getPsiFile("return 1"));
157206
fail("JsonMappingException expected because of number provided instead of parameters map");
158207
} catch (JsonMappingException e) {
@@ -162,7 +211,7 @@ public void testParsingNumber() throws Exception {
162211

163212
public void testParsingString() throws Exception {
164213
try {
165-
parametersProvider.setParametersJson("\"abc\"");
214+
parametersProvider.setGlobalParametersJson("\"abc\"");
166215
parametersService.getParameters(getPsiFile("return 1"));
167216
fail("JsonMappingException expected because of string provided instead of parameters map");
168217
} catch (JsonMappingException e) {
@@ -172,7 +221,7 @@ public void testParsingString() throws Exception {
172221

173222
public void testParsingUnwrappedParameter() throws Exception {
174223
try {
175-
parametersProvider.setParametersJson("\"param1\":\"val1\"");
224+
parametersProvider.setGlobalParametersJson("\"param1\":\"val1\"");
176225
parametersService.getParameters(getPsiFile("return 1"));
177226
fail("JsonMappingException expected because of parameter not wrapped in curly braces");
178227
} catch (JsonMappingException e) {

testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.intellij.util.messages.MessageBus;
55
import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.execute.StatementCollector;
66
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent;
7+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersProvider;
78
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersService;
89
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util.BaseGenericTest;
910
import org.mockito.Mockito;
@@ -14,10 +15,11 @@
1415
public class StatementCollectorTest extends BaseGenericTest {
1516

1617
private static final String EMPTY_PARAMETERS = "{}";
17-
private static final String PARAMETERS = "{\"name\": \"Andrew\"}";
18+
private static final String VALID_PARAMETERS = "{\"name\": \"Andrew\"}";
1819
private static final String WRONG_PARAMETERS = "{wrong json}";
1920
private StatementCollector statementCollector;
2021
private ParametersService parametersService;
22+
private ParametersProvider emptyParametersProvider, validParametersProvider, wrongParametersProvider;
2123
private MessageBus messageBusMock;
2224
private QueryParametersRetrievalErrorEvent eventMock;
2325

@@ -29,11 +31,44 @@ public void setUp() throws Exception {
2931
when(messageBusMock.syncPublisher(any())).thenReturn(eventMock);
3032

3133
parametersService = new ParametersService();
34+
emptyParametersProvider = new ParametersProvider() {
35+
@Override
36+
public String getGlobalParametersJson() {
37+
return EMPTY_PARAMETERS;
38+
}
39+
40+
@Override
41+
public String getFileSpecificParametersJson() {
42+
return EMPTY_PARAMETERS;
43+
}
44+
};
45+
validParametersProvider = new ParametersProvider() {
46+
@Override
47+
public String getGlobalParametersJson() {
48+
return VALID_PARAMETERS;
49+
}
50+
51+
@Override
52+
public String getFileSpecificParametersJson() {
53+
return VALID_PARAMETERS;
54+
}
55+
};
56+
wrongParametersProvider = new ParametersProvider() {
57+
@Override
58+
public String getGlobalParametersJson() {
59+
return WRONG_PARAMETERS;
60+
}
61+
62+
@Override
63+
public String getFileSpecificParametersJson() {
64+
return WRONG_PARAMETERS;
65+
}
66+
};
3267
statementCollector = new StatementCollector(messageBusMock, parametersService);
3368
}
3469

3570
public void testSingleQuery() {
36-
parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS);
71+
parametersService.registerParametersProvider(emptyParametersProvider);
3772
PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;");
3873
psiFile.accept(statementCollector);
3974

@@ -48,7 +83,7 @@ public void testSingleQuery() {
4883
}
4984

5085
public void testMultipleQueriesInOneLine() {
51-
parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS);
86+
parametersService.registerParametersProvider(emptyParametersProvider);
5287
PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;MATCH (m) RETURN m;");
5388
psiFile.acceptChildren(statementCollector);
5489

@@ -63,7 +98,7 @@ public void testMultipleQueriesInOneLine() {
6398
}
6499

65100
public void testOneQueryWithError() {
66-
parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS);
101+
parametersService.registerParametersProvider(emptyParametersProvider);
67102
PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH () ETURN n;");
68103
psiFile.accept(statementCollector);
69104

@@ -78,7 +113,7 @@ public void testOneQueryWithError() {
78113
}
79114

80115
public void testMultipleQueriesInDifferentLinesWithError() {
81-
parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS);
116+
parametersService.registerParametersProvider(emptyParametersProvider);
82117
PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH () ETURN n;");
83118
psiFile.accept(statementCollector);
84119

@@ -93,7 +128,7 @@ public void testMultipleQueriesInDifferentLinesWithError() {
93128
}
94129

95130
public void testMultipleCorrectQueriesInDifferentLines() {
96-
parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS);
131+
parametersService.registerParametersProvider(emptyParametersProvider);
97132
PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH (m) RETURN m;");
98133
psiFile.accept(statementCollector);
99134

@@ -108,7 +143,7 @@ public void testMultipleCorrectQueriesInDifferentLines() {
108143
}
109144

110145
public void testMultipleCorrectQueriesInDifferentLinesWithParameters() {
111-
parametersService.registerParametersProvider(() -> PARAMETERS);
146+
parametersService.registerParametersProvider(validParametersProvider);
112147
PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;");
113148
psiFile.accept(statementCollector);
114149

@@ -123,7 +158,7 @@ public void testMultipleCorrectQueriesInDifferentLinesWithParameters() {
123158
}
124159

125160
public void testParameterExtractionErrorOccurs() {
126-
parametersService.registerParametersProvider(() -> WRONG_PARAMETERS);
161+
parametersService.registerParametersProvider(wrongParametersProvider);
127162
PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;");
128163
psiFile.accept(statementCollector);
129164

0 commit comments

Comments
 (0)