Skip to content

Commit ff8c872

Browse files
author
Sergejs Muromcevs
authored
Interactions (#114)
* Basic implementation of Ctrl-c, entity context menu and table actions to copy output data #74 Has to be double-verified as implementation done 30 days ago and might be non compliant with current branch state * minor version upgrades * fixed tests which were failing due AssertJ version update * minor code improvements
1 parent 0931a1d commit ff8c872

File tree

40 files changed

+461
-128
lines changed

40 files changed

+461
-128
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
plugins {
22
id 'idea'
33
id 'java'
4-
id "org.jetbrains.intellij" version "0.3.12"
5-
id 'net.researchgate.release' version '2.6.0'
4+
id "org.jetbrains.intellij" version "0.4.8"
5+
id 'net.researchgate.release' version '2.8.0'
66
}
77

88
apply plugin: 'idea'

database/api/src/main/java/com/neueda/jetbrains/plugin/graphdb/database/api/data/GraphEntity.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.List;
44

5-
public interface GraphEntity {
5+
public interface GraphEntity extends NoIdGraphEntity {
66

77
String getId();
88

@@ -12,7 +12,4 @@ public interface GraphEntity {
1212

1313
String getTypesName();
1414

15-
boolean isTypesSingle();
16-
17-
String getRepresentation();
1815
}

database/api/src/main/java/com/neueda/jetbrains/plugin/graphdb/database/api/data/GraphPath.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22

33
import java.util.List;
44

5-
public interface GraphPath {
5+
public interface GraphPath extends NoIdGraphEntity {
66

77
/**
88
* Return nodes and relationships.
99
*/
1010
List<Object> getComponents();
11+
12+
default boolean isTypesSingle() {
13+
return true;
14+
}
15+
16+
default String getRepresentation() {
17+
return "Path";
18+
}
1119
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.neueda.jetbrains.plugin.graphdb.database.api.data;
2+
3+
public interface NoIdGraphEntity {
4+
5+
boolean isTypesSingle();
6+
7+
String getRepresentation();
8+
9+
}

database/neo4j/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
dependencies {
22
compile project(':database:api')
33
compile "org.neo4j.driver:neo4j-java-driver:$versionNeo4jJavaBoltDriver"
4+
compile("com.fasterxml.jackson.core:jackson-annotations:$versionJacksonMapper")
45
}

gradle.properties

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
version=2.5.6
22

33
# Intellij SDK
4-
intellijSdkVersion=2018.3
4+
intellijSdkVersion=2019.1.1
55

66
# Versions
77
versionJunit=4.12
8-
versionAssertj=3.8.0
9-
versionMockito=2.10.0
10-
versionNeo4jJavaBoltDriver=1.6.3
8+
versionAssertj=3.12.2
9+
versionMockito=2.27.0
10+
versionNeo4jJavaBoltDriver=1.6.4
1111
versionPrefuse=1.0.0
1212
versionGoogleAnalytics=1.1.2
13-
versionJacksonMapper=2.8.6
13+
versionJacksonMapper=2.9.8
1414

1515
# Performance
1616
org.gradle.jvmargs=-Xmx512m

graph-database-support-plugin/src/main/resources/META-INF/plugin.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,12 @@
219219
icon="/actions/refresh.png"
220220
description="Clean canvas">
221221
</action>
222+
<action id="GraphDatabaseConsoleToolWindowActions.CopyQueryOutput"
223+
class="com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console.CopyQueryOutputAction"
224+
text="Copy query result to clipboard"
225+
icon="/actions/copy.png"
226+
description="Copy query result to clipboard">
227+
</action>
222228
</group>
223229

224230
<group id="GraphDatabaseFileActions"

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/metadata/atoms/CypherType.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,7 @@ default boolean isAssignableTo(CypherType t) {
3232
return true;
3333
}
3434

35-
if (this instanceof CypherList && t instanceof CypherList) {
36-
return true;
37-
}
38-
39-
return false;
35+
return this instanceof CypherList && t instanceof CypherList;
4036
}
4137

4238
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/providers/ProceduresCompletionProvider.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ public final class ProceduresCompletionProvider extends BaseCompletionProvider {
2020
protected void addCompletions(@NotNull CompletionParameters parameters,
2121
ProcessingContext context,
2222
@NotNull CompletionResultSet result) {
23-
withCypherMetadataProvider(parameters, (metadataProvider -> {
24-
metadataProvider.getProcedures().stream()
25-
.map(CypherElement::getLookupElement)
26-
.forEach(result::addElement);
27-
}));
23+
withCypherMetadataProvider(parameters, (metadataProvider -> metadataProvider.getProcedures().stream()
24+
.map(CypherElement::getLookupElement)
25+
.forEach(result::addElement)));
2826
}
2927
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/providers/PropertyKeyCompletionProvider.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ public final class PropertyKeyCompletionProvider extends BaseCompletionProvider
1919
protected void addCompletions(@NotNull CompletionParameters parameters,
2020
ProcessingContext context,
2121
@NotNull CompletionResultSet result) {
22-
withCypherMetadataProvider(parameters, (metadataProvider -> {
23-
metadataProvider.getPropertyKeys().stream()
24-
.map(CypherElement::getLookupElement)
25-
.forEach(result::addElement);
26-
}));
22+
withCypherMetadataProvider(parameters, (metadataProvider -> metadataProvider.getPropertyKeys().stream()
23+
.map(CypherElement::getLookupElement)
24+
.forEach(result::addElement)));
2725
}
2826
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/providers/RelationshipTypeCompletionProvider.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ public final class RelationshipTypeCompletionProvider extends BaseCompletionProv
1919
protected void addCompletions(@NotNull CompletionParameters parameters,
2020
ProcessingContext context,
2121
@NotNull CompletionResultSet result) {
22-
withCypherMetadataProvider(parameters, (metadataProvider -> {
23-
metadataProvider.getRelationshipTypes().stream()
24-
.map(CypherElement::getLookupElement)
25-
.forEach(result::addElement);
26-
}));
22+
withCypherMetadataProvider(parameters, (metadataProvider -> metadataProvider.getRelationshipTypes().stream()
23+
.map(CypherElement::getLookupElement)
24+
.forEach(result::addElement)));
2725
}
2826
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/providers/UserFunctionsCompletionProvider.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ public class UserFunctionsCompletionProvider extends BaseCompletionProvider {
2020

2121
@Override
2222
protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) {
23-
withCypherMetadataProvider(parameters, (metadataProvider -> {
24-
metadataProvider.getUserFunctions().stream()
25-
.map(CypherElement::getLookupElement)
26-
.forEach(result::addElement);
27-
}));
23+
withCypherMetadataProvider(parameters, (metadataProvider -> metadataProvider.getUserFunctions().stream()
24+
.map(CypherElement::getLookupElement)
25+
.forEach(result::addElement)));
2826
}
2927
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/documentation/CypherDocumentationProvider.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,8 @@ public String generateDoc(PsiElement element, @Nullable PsiElement originalEleme
6969
}
7070

7171
Optional<String> userFunctionDocumentation = userFunctionDocumentation(element);
72-
if (userFunctionDocumentation.isPresent()) {
73-
return userFunctionDocumentation.get();
74-
}
72+
return userFunctionDocumentation.orElse(null);
7573

76-
return null;
7774
}
7875

7976
private Optional<String> builtInFunctionDocumentation(PsiElement element) {

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/editor/CypherParameterInfoHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class CypherParameterInfoHandler
3131
@Override
3232
@SuppressWarnings("unchecked")
3333
public PsiElement[] getActualParameters(@NotNull CypherInvocation o) {
34-
return ArrayUtil.toObjectArray((List) o.arguments(), PsiElement.class);
34+
return ArrayUtil.toObjectArray(o.arguments(), PsiElement.class);
3535
}
3636

3737
@NotNull

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/references/CypherInvocation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ default List<InvokableInformation> resolve() {
6262
if (this instanceof CypherProcedureInvocation) {
6363
svc.findProcedure(getFullName())
6464
.map(CypherProcedureElement::getInvokableInformation)
65-
.ifPresent(info -> matchedInvocations.add(info));
65+
.ifPresent(matchedInvocations::add);
6666
return matchedInvocations;
6767
}
6868

@@ -74,7 +74,7 @@ default List<InvokableInformation> resolve() {
7474
if (matchedInvocations.isEmpty()) {
7575
svc.findUserFunction(getFullName())
7676
.map(CypherUserFunctionElement::getInvokableInformation)
77-
.ifPresent(info -> matchedInvocations.add(info));
77+
.ifPresent(matchedInvocations::add);
7878
}
7979
return matchedInvocations;
8080
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/references/CypherReferenceBase.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
import org.jetbrains.annotations.NotNull;
1212
import org.jetbrains.annotations.Nullable;
1313

14-
import java.util.Collection;
15-
import java.util.HashMap;
16-
import java.util.List;
17-
import java.util.Map;
14+
import java.util.*;
1815

1916
/**
2017
* TODO: Description
@@ -56,7 +53,7 @@ protected <T extends CypherNamedElement> Collection<T> uniqueVariants(List<T> da
5653
Map<String, T> variants = new HashMap<>();
5754

5855
data.stream()
59-
.filter(element -> element != null)
56+
.filter(Objects::nonNull)
6057
.forEach(element -> {
6158
String name = element.getName();
6259
if (name != null && name.length() > 0) {

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/references/CypherReferenceContributor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar)
5454
}
5555

5656
private void register(PsiReferenceRegistrar registrar,
57-
@NotNull ElementPattern pattern,
57+
@NotNull ElementPattern<PsiElement> pattern,
5858
CypherReferenceContributionPriority contributionPriority,
5959
ReferenceFactory referenceFactory) {
6060
registrar.registerReferenceProvider(

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.neueda.jetbrains.plugin.graphdb.language.cypher.inspections.CypherFunctionCallInspection;
66
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util.BaseInspectionTest;
77

8+
import java.util.Collections;
89
import java.util.List;
910
import java.util.Objects;
1011
import java.util.Set;
@@ -125,7 +126,7 @@ private void generateTypeCompatibilityTests(String query, String expected, List<
125126

126127
public void testStringTypeCheck() {
127128
String query = "MATCH p=(n)-[r]-() RETURN ltrim(%s)";
128-
generateTypeCompatibilityTests(query, "STRING", asList("STRING"));
129+
generateTypeCompatibilityTests(query, "STRING", Collections.singletonList("STRING"));
129130
}
130131

131132
public void testNullableStringTypeCheck() {
@@ -145,7 +146,7 @@ public void testNullableNumberTypeCheck() {
145146

146147
public void testIntegerTypeCheck() {
147148
String query = "MATCH p=(n)-[r]-() RETURN substring(\"a\", %s)";
148-
generateTypeCompatibilityTests(query, "INTEGER", asList("INTEGER"));
149+
generateTypeCompatibilityTests(query, "INTEGER", Collections.singletonList("INTEGER"));
149150
}
150151

151152
public void testNullableIntegerTypeCheck() {
@@ -155,7 +156,7 @@ public void testNullableIntegerTypeCheck() {
155156

156157
public void testBooleanTypeCheck() {
157158
String query = "MATCH p=(n)-[r]-() CALL test.bool(%s) RETURN p";
158-
generateTypeCompatibilityTests(query, "BOOLEAN", asList("BOOLEAN"));
159+
generateTypeCompatibilityTests(query, "BOOLEAN", Collections.singletonList("BOOLEAN"));
159160
}
160161

161162
public void testNullableBooleanTypeCheck() {
@@ -175,17 +176,17 @@ public void testNullableFloatTypeCheck() {
175176

176177
public void testPathTypeCheck() {
177178
String query = "MATCH p=(n)-[r]-() RETURN ufrpath(%s)";
178-
generateTypeCompatibilityTests(query, "PATH", asList("PATH"));
179+
generateTypeCompatibilityTests(query, "PATH", Collections.singletonList("PATH"));
179180
}
180181

181182
public void testNodeTypeCheck() {
182183
String query = "MATCH p=(n)-[r]-() RETURN ufrnode(%s)";
183-
generateTypeCompatibilityTests(query, "NODE", asList("NODE"));
184+
generateTypeCompatibilityTests(query, "NODE", Collections.singletonList("NODE"));
184185
}
185186

186187
public void testRelationshipTypeCheck() {
187188
String query = "MATCH p=(n)-[r]-() RETURN ufrrel(%s)";
188-
generateTypeCompatibilityTests(query, "RELATIONSHIP", asList("RELATIONSHIP"));
189+
generateTypeCompatibilityTests(query, "RELATIONSHIP", Collections.singletonList("RELATIONSHIP"));
189190
}
190191

191192
public void testSizeArray() {

testing/manual/src/test/java/com/neueda/jetbrains/plugin/graphdb/TestSimpleGraph.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class TestSimpleGraph {
1818
public static void main(String[] argv) {
1919
PrefuseVisualization v = new PrefuseVisualization(new IdeaLookAndFeelService());
2020

21-
Map<String, String> config = new HashMap<String, String>();
21+
Map<String, String> config = new HashMap<>();
2222
config.put(Neo4jBoltConfiguration.HOST, "localhost");
2323
// config.put(Neo4jBoltConfiguration.PASSWORD)
2424
// config.put(Neo4jBoltConfiguration.PORT)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console;
2+
3+
import com.intellij.openapi.actionSystem.AnAction;
4+
import com.intellij.openapi.actionSystem.AnActionEvent;
5+
import com.intellij.openapi.project.Project;
6+
import com.intellij.util.messages.MessageBus;
7+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.CopyQueryOutputEvent;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
public class CopyQueryOutputAction extends AnAction {
11+
12+
@Override
13+
public void actionPerformed(@NotNull AnActionEvent e) {
14+
Project project = getEventProject(e);
15+
16+
if (project == null) {
17+
return;
18+
}
19+
20+
MessageBus messageBus = project.getMessageBus();
21+
messageBus.syncPublisher(CopyQueryOutputEvent.COPY_QUERY_OUTPUT_TOPIC).copyQueryOutputToClipboard();
22+
}
23+
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/database/DiffService.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public DiffService(Project project) {
2020
}
2121

2222
public void updateNode(DataSourceApi api, GraphEntity oldNode, GraphEntity newNode) {
23-
StringBuilder sb = new StringBuilder("MATCH (n) WHERE ID(n) = $id ")
24-
.append(diffLabels(oldNode.getTypes(), newNode.getTypes()))
25-
.append(" SET n = $props")
26-
.append(" RETURN n");
2723

28-
service.executeQuery(api, new ExecuteQueryPayload(sb.toString(),
24+
String query = "MATCH (n) WHERE ID(n) = $id " +
25+
diffLabels(oldNode.getTypes(), newNode.getTypes()) +
26+
" SET n = $props" +
27+
" RETURN n";
28+
service.executeQuery(api, new ExecuteQueryPayload(query,
2929
ImmutableMap.of(
3030
"id", Long.parseLong(oldNode.getId()),
3131
"props", newNode.getPropertyContainer().getProperties()),
@@ -35,11 +35,11 @@ public void updateNode(DataSourceApi api, GraphEntity oldNode, GraphEntity newNo
3535

3636
public void updateRelationShip(DataSourceApi api, GraphEntity relationship,
3737
GraphEntity updatedRel) {
38-
StringBuilder sb = new StringBuilder("MATCH ()-[n]->() WHERE ID(n) = $id ")
39-
.append(" SET n = $props")
40-
.append(" RETURN n");
4138

42-
service.executeQuery(api, new ExecuteQueryPayload(sb.toString(),
39+
String query = "MATCH ()-[n]->() WHERE ID(n) = $id " +
40+
" SET n = $props" +
41+
" RETURN n";
42+
service.executeQuery(api, new ExecuteQueryPayload(query,
4343
ImmutableMap.of(
4444
"id", Long.parseLong(relationship.getId()),
4545
"props", updatedRel.getPropertyContainer().getProperties()),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event;
2+
3+
import com.intellij.util.messages.Topic;
4+
5+
public interface CopyQueryOutputEvent {
6+
7+
Topic<CopyQueryOutputEvent> COPY_QUERY_OUTPUT_TOPIC = Topic.create("GraphDatabaseConsole.CopyQueryOutputTopic", CopyQueryOutputEvent.class);
8+
9+
void copyQueryOutputToClipboard();
10+
}

0 commit comments

Comments
 (0)