Skip to content

Commit 644bd7f

Browse files
author
Sergey Kovtun
committed
Added procedure and function grouping in metadata view.
1 parent ba643fa commit 644bd7f

File tree

9 files changed

+239
-30
lines changed

9 files changed

+239
-30
lines changed

language/cypher/src/main/gen/com/neueda/jetbrains/plugin/graphdb/language/cypher/CypherParser.java

Lines changed: 9 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/lexer/Cypher.bnf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ RelationshipDetail ::= "[" Variable? "?"? RelationshipTypes? MaybeVariableLength
340340
RelationshipTypes ::= ":" RelTypeName ("|" ":"? RelTypeName)* {pin=1}
341341
MaybeVariableLength ::= ("*" RangeLiteral?)
342342

343-
NodePattern ::= "(" Variable? NodeLabels? Properties? ")"
343+
NodePattern ::= "(" Variable? NodeLabels? Properties? ")" {pin=1}
344344

345345
RelationshipsPattern ::= NodePattern PatternElementChain+ {
346346
implements="com.neueda.jetbrains.plugin.graphdb.language.cypher.references.types.CypherPathYielding"

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/datasource/metadata/DataSourceMetadataUi.java

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.metadata.DataSourcesComponentMetadata;
66
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.metadata.Neo4jBoltCypherDataSourceMetadata;
77
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
8-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.LabelTreeNodeModel;
9-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.MetadataTreeNodeModel;
10-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.RelationshipTypeTreeNodeModel;
11-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeNodeModelApi;
8+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree.MutableTreeNodeProducers;
9+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree.Root;
10+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree.TreeNodeDirectory;
11+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.*;
1212
import com.neueda.jetbrains.plugin.graphdb.platform.GraphIcons;
1313

1414
import javax.swing.tree.MutableTreeNode;
15+
import java.util.Arrays;
1516
import java.util.List;
1617
import java.util.Map;
1718

@@ -87,37 +88,61 @@ boolean updateNeo4jBoltCypherMetadataUi(PatchedDefaultMutableTreeNode dataSource
8788

8889
// Stored procedures
8990
PatchedDefaultMutableTreeNode storedProceduresTreeNode = new PatchedDefaultMutableTreeNode(
90-
new MetadataTreeNodeModel(STORED_PROCEDURES, dataSourceApi, STORED_PROCEDURES_TITLE, GraphIcons.Nodes.STORED_PROCEDURE));
91-
dataSourceMetadata
92-
.getMetadata(Neo4jBoltCypherDataSourceMetadata.STORED_PROCEDURES)
93-
.forEach((row) -> {
94-
PatchedDefaultMutableTreeNode nameNode = of(new MetadataTreeNodeModel(STORED_PROCEDURE, dataSourceApi, row.get("name")));
95-
PatchedDefaultMutableTreeNode descriptionNode = of(new MetadataTreeNodeModel(STORED_PROCEDURE, dataSourceApi, row.get("signature")));
96-
nameNode.add(descriptionNode);
97-
storedProceduresTreeNode.add(nameNode);
98-
});
91+
new MetadataTreeNodeModel(STORED_PROCEDURES, dataSourceApi, STORED_PROCEDURES_TITLE, GraphIcons.Nodes.STORED_PROCEDURE));
92+
93+
List<Map<String, String>> storedProcedures = dataSourceMetadata
94+
.getMetadata(Neo4jBoltCypherDataSourceMetadata.STORED_PROCEDURES);
95+
96+
createTreeFromMetadata(storedProcedures, storedProceduresTreeNode, STORED_PROCEDURE, dataSourceApi);
97+
9998
dataSourceRootTreeNode.add(storedProceduresTreeNode);
10099

101100
// User Functions
102101
if (dataSourceMetadata.isMetadataExists(Neo4jBoltCypherDataSourceMetadata.USER_FUNCTIONS)) {
103102
PatchedDefaultMutableTreeNode userFunctionTreeNode = new PatchedDefaultMutableTreeNode(
104103
new MetadataTreeNodeModel(USER_FUNCTIONS, dataSourceApi, USER_FUNCTIONS_TITLE, GraphIcons.Nodes.USER_FUNCTION));
105104

106-
dataSourceMetadata
107-
.getMetadata(Neo4jBoltCypherDataSourceMetadata.USER_FUNCTIONS)
108-
.forEach((row) -> {
109-
PatchedDefaultMutableTreeNode nameNode = of(new MetadataTreeNodeModel(USER_FUNCTION, dataSourceApi, row.get("name")));
110-
PatchedDefaultMutableTreeNode descriptionNode = of(new MetadataTreeNodeModel(USER_FUNCTION, dataSourceApi, row.get("signature")));
111-
nameNode.add(descriptionNode);
112-
userFunctionTreeNode.add(nameNode);
113-
});
105+
List<Map<String, String>> storedFunctions = dataSourceMetadata
106+
.getMetadata(Neo4jBoltCypherDataSourceMetadata.USER_FUNCTIONS);
107+
108+
createTreeFromMetadata(storedFunctions, userFunctionTreeNode, USER_FUNCTION, dataSourceApi);
114109

115110
dataSourceRootTreeNode.add(userFunctionTreeNode);
116111
}
117112

118113
return true;
119114
}
120115

116+
private void createTreeFromMetadata(List<Map<String, String>> metadata,
117+
PatchedDefaultMutableTreeNode treeRoot,
118+
Neo4jTreeNodeType type,
119+
DataSourceApi dataSourceApi) {
120+
TreeNodeDirectory treeNodeRoot = new Root(
121+
treeRoot,
122+
MutableTreeNodeProducers.directory(type, dataSourceApi),
123+
MutableTreeNodeProducers.function(type, dataSourceApi)
124+
);
125+
126+
metadata.forEach(data -> {
127+
String[] nameParts = data.getOrDefault("name", "").split("\\.");
128+
nameParts[nameParts.length - 1] = data.get("signature");
129+
createBranch(treeNodeRoot, Arrays.asList(nameParts));
130+
});
131+
132+
treeNodeRoot.getMutableTreeNode();
133+
}
134+
135+
private void createBranch(TreeNodeDirectory directory, List<String> names) {
136+
TreeNodeDirectory currentDirectory = directory;
137+
for (int i = 0; i < names.size(); i++) {
138+
if (i < names.size() - 1) {
139+
currentDirectory = currentDirectory.getDirectory(names.get(i));
140+
} else {
141+
currentDirectory.addLeaf(names.get(i));
142+
}
143+
}
144+
}
145+
121146
private MutableTreeNode createIndexesNode(DataSourceMetadata dataSourceMetadata, DataSourceApi dataSourceApi) {
122147
List<Map<String, String>> indexesMetadata =
123148
dataSourceMetadata.getMetadata(Neo4jBoltCypherDataSourceMetadata.INDEXES);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
import javax.swing.tree.DefaultMutableTreeNode;
4+
import java.util.ArrayList;
5+
import java.util.LinkedHashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.function.Function;
9+
10+
class Directory implements TreeNode, TreeNodeDirectory {
11+
private final Map<String, Directory> directories;
12+
private final List<Leaf> functions;
13+
private final String name;
14+
private final Function<TreeNode, DefaultMutableTreeNode> directoryProducer;
15+
private final Function<TreeNode, DefaultMutableTreeNode> functionProducer;
16+
17+
public Directory(
18+
String name,
19+
Function<TreeNode, DefaultMutableTreeNode> directoryProducer,
20+
Function<TreeNode, DefaultMutableTreeNode> functionProducer
21+
) {
22+
this.name = name;
23+
this.directoryProducer = directoryProducer;
24+
this.functionProducer = functionProducer;
25+
this.directories = new LinkedHashMap<>();
26+
this.functions = new ArrayList<>();
27+
}
28+
29+
@Override
30+
public Directory getDirectory(String name) {
31+
return directories.computeIfAbsent(
32+
name,
33+
(k) -> new Directory(k, directoryProducer, functionProducer)
34+
);
35+
}
36+
37+
@Override
38+
public void addLeaf(String name) {
39+
functions.add(new Leaf(name, functionProducer));
40+
}
41+
42+
@Override
43+
public String getName() {
44+
return name;
45+
}
46+
47+
@Override
48+
public DefaultMutableTreeNode getMutableTreeNode() {
49+
DefaultMutableTreeNode root = directoryProducer.apply(this);
50+
51+
directories.values().forEach((directory) -> root.add(directory.getMutableTreeNode()));
52+
functions.forEach((function) -> root.add(function.getMutableTreeNode()));
53+
54+
return root;
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
import javax.swing.tree.DefaultMutableTreeNode;
4+
import java.util.function.Function;
5+
6+
class Leaf implements TreeNode {
7+
private final String name;
8+
private Function<TreeNode, DefaultMutableTreeNode> mutableTreeNodeProducer;
9+
10+
public Leaf(String name, Function<TreeNode, DefaultMutableTreeNode> mutableTreeNodeProducer) {
11+
this.name = name;
12+
this.mutableTreeNodeProducer = mutableTreeNodeProducer;
13+
}
14+
15+
@Override
16+
public String getName() {
17+
return name;
18+
}
19+
20+
@Override
21+
public DefaultMutableTreeNode getMutableTreeNode() {
22+
return mutableTreeNodeProducer.apply(this);
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
import com.intellij.icons.AllIcons;
4+
import com.intellij.ui.treeStructure.PatchedDefaultMutableTreeNode;
5+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
6+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.MetadataTreeNodeModel;
7+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.Neo4jTreeNodeType;
8+
9+
import javax.swing.tree.DefaultMutableTreeNode;
10+
import java.util.function.Function;
11+
12+
public final class MutableTreeNodeProducers {
13+
14+
public static Function<TreeNode, DefaultMutableTreeNode> function(Neo4jTreeNodeType type, DataSourceApi dataSourceApi) {
15+
return treeNode -> new PatchedDefaultMutableTreeNode(
16+
new MetadataTreeNodeModel(type, dataSourceApi, treeNode.getName(), AllIcons.Nodes.Function)
17+
);
18+
}
19+
20+
public static Function<TreeNode, DefaultMutableTreeNode> directory(Neo4jTreeNodeType type, DataSourceApi dataSourceApi) {
21+
return treeNode -> new PatchedDefaultMutableTreeNode(
22+
new MetadataTreeNodeModel(type, dataSourceApi, treeNode.getName(), AllIcons.Nodes.Package)
23+
);
24+
}
25+
26+
private MutableTreeNodeProducers() {
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
import javax.swing.tree.DefaultMutableTreeNode;
4+
import java.util.ArrayList;
5+
import java.util.LinkedHashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.function.Function;
9+
10+
public class Root implements TreeNode, TreeNodeDirectory {
11+
12+
private final DefaultMutableTreeNode root;
13+
private final Map<String, Directory> directories;
14+
private final List<Leaf> functions;
15+
private final Function<TreeNode, DefaultMutableTreeNode> directoryProducer;
16+
private final Function<TreeNode, DefaultMutableTreeNode> functionProducer;
17+
18+
public Root(
19+
DefaultMutableTreeNode root,
20+
Function<TreeNode, DefaultMutableTreeNode> directoryProducer,
21+
Function<TreeNode, DefaultMutableTreeNode> functionProducer
22+
) {
23+
this.root = root;
24+
this.directoryProducer = directoryProducer;
25+
this.functionProducer = functionProducer;
26+
this.directories = new LinkedHashMap<>();
27+
this.functions = new ArrayList<>();
28+
}
29+
30+
@Override
31+
public Directory getDirectory(String name) {
32+
return directories.computeIfAbsent(
33+
name,
34+
(k) -> new Directory(k, directoryProducer, functionProducer)
35+
);
36+
}
37+
38+
@Override
39+
public void addLeaf(String name) {
40+
functions.add(new Leaf(name, functionProducer));
41+
}
42+
43+
@Override
44+
public String getName() {
45+
return "root";
46+
}
47+
48+
@Override
49+
public DefaultMutableTreeNode getMutableTreeNode() {
50+
directories.values().forEach((directory) -> root.add(directory.getMutableTreeNode()));
51+
functions.forEach((function) -> root.add(function.getMutableTreeNode()));
52+
53+
return root;
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
import javax.swing.tree.DefaultMutableTreeNode;
4+
5+
public interface TreeNode {
6+
7+
public String getName();
8+
9+
public DefaultMutableTreeNode getMutableTreeNode();
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.metadata.tree;
2+
3+
public interface TreeNodeDirectory extends TreeNode {
4+
5+
public void addLeaf(String name);
6+
7+
public TreeNodeDirectory getDirectory(String name);
8+
9+
}

0 commit comments

Comments
 (0)