Light Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a72c982

Browse files
committed
Implemented addEdge inclusive handling out/in vertices
+ Moved to junit.jupiter 5 + Cleanups
1 parent 7f2118d commit a72c982

File tree

15 files changed

+374
-227
lines changed
  • java-graph-persistence-query-builder
    • pom.xml
    • src
      • main/java/de/x1285/jgp/query/builder
        • AliasGenerator.java
        • GremlinScriptQueryBuilderContext.java
        • gremlinscript
          • GremlinScriptQuery.java
          • GremlinScriptQueryBuilder.java
          • GremlinScriptQueryBuilderContext.java
      • test/java/de/x1285/jgp/query/builder
        • GremlinScriptQueryBuilderTest.java
        • gremlinscript
          • GremlinScriptQueryBuilderTest.java
  • java-graph-persistence-test-data
    • pom.xml
    • src/main/java/de/x1285/jpg/test/data
      • TestDataGenerator.java
  • java-graph-persistence-utils
    • pom.xml
    • src/test/java/de/x1285/jgp
      • element/explore
        • ElementExplorerTest.java
      • metamodel
        • SupportedTypesTest.java
      • tests
        • MetaModelFactoryTest.java
  • pom.xml

15 files changed

+374
-227
lines changed

java-graph-persistence-query-builder/pom.xml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@
2020
<dependency>
2121
<groupId>de.x1285groupId>
2222
<artifactId>java-graph-persistence-apiartifactId>
23-
<version>${project.version}version>
2423
dependency>
2524
<dependency>
2625
<groupId>de.x1285groupId>
2726
<artifactId>java-graph-persistence-utilsartifactId>
28-
<version>${project.version}version>
2927
dependency>
3028
<dependency>
3129
<groupId>org.projectlombokgroupId>
@@ -37,14 +35,8 @@
3735
<scope>testscope>
3836
dependency>
3937
<dependency>
40-
<groupId>junitgroupId>
41-
<artifactId>junitartifactId>
42-
<scope>testscope>
43-
dependency>
44-
<dependency>
45-
<groupId>org.apache.httpcomponents.client5groupId>
46-
<artifactId>httpclient5-fluentartifactId>
47-
<version>5.1.3version>
38+
<groupId>org.junit.jupitergroupId>
39+
<artifactId>junit-jupiter-engineartifactId>
4840
<scope>testscope>
4941
dependency>
5042
dependencies>

java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/AliasGenerator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package de.x1285.jgp.query.builder;
2+
3+
import java.util.UUID;
4+
5+
public class AliasGenerator {
6+
7+
public String generateAlias() {
8+
return UUID.randomUUID().toString();
9+
}
10+
11+
}

java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/GremlinScriptQueryBuilderContext.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/gremlinscript/GremlinScriptQuery.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package de.x1285.jgp.query.builder.gremlinscript;
2+
3+
import de.x1285.jgp.element.GraphEdge;
4+
import de.x1285.jgp.element.GraphElement;
5+
import de.x1285.jgp.element.GraphVertex;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NonNull;
9+
import lombok.Setter;
10+
11+
@Builder
12+
public class GremlinScriptQuery {
13+
14+
@Getter
15+
@NonNull
16+
private final GraphElement element;
17+
18+
@Getter
19+
private final String alias;
20+
21+
@Getter
22+
@Setter
23+
private String query;
24+
25+
public static GremlinScriptQuery of(GraphElement element, String query, String alias) {
26+
return GremlinScriptQuery.builder()
27+
.query(query)
28+
.element(element)
29+
.alias(alias)
30+
.build();
31+
}
32+
33+
public static GremlinScriptQuery of(GraphElement element, String alias) {
34+
return GremlinScriptQuery.builder()
35+
.element(element)
36+
.alias(alias)
37+
.build();
38+
}
39+
40+
public static GremlinScriptQuery ofEdge(GraphEdge edge, String query) {
41+
return GremlinScriptQuery.builder()
42+
.query(query)
43+
.element(edge)
44+
.build();
45+
}
46+
47+
public boolean isVertex() {
48+
return element instanceof GraphVertex;
49+
}
50+
51+
@Override
52+
public String toString() {
53+
return "GremlinScriptQuery{element.label='" + element.getLabel() + '\'' + ", query=" + query + '}';
54+
}
55+
}

java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/GremlinScriptQueryBuilder.java renamed to java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/gremlinscript/GremlinScriptQueryBuilder.java

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.x1285.jgp.query.builder;
1+
package de.x1285.jgp.query.builder.gremlinscript;
22

33
import de.x1285.jgp.element.GraphEdge;
44
import de.x1285.jgp.element.GraphElement;
@@ -8,16 +8,18 @@
88
import de.x1285.jgp.metamodel.field.EdgeField;
99
import de.x1285.jgp.metamodel.field.PropertyField;
1010
import de.x1285.jgp.metamodel.field.RelevantField;
11+
import de.x1285.jgp.query.builder.QueryBuilder;
12+
import de.x1285.jgp.query.builder.QueryBuilderException;
1113

1214
import java.util.Collection;
1315
import java.util.List;
1416

1517
import static de.x1285.jgp.metamodel.SupportedTypes.isSupportedType;
1618

17-
public class GremlinScriptQueryBuilder extends QueryBuilder<List<String>> {
19+
public class GremlinScriptQueryBuilder extends QueryBuilder<List<GremlinScriptQuery>> {
1820

1921
@Override
20-
public List<String> add(Collectionextends GraphElement> elements) {
22+
public List<GremlinScriptQuery> add(Collectionextends GraphElement> elements) {
2123
GremlinScriptQueryBuilderContext context = new GremlinScriptQueryBuilderContext();
2224
for (GraphElement element : elements) {
2325
add(element, context);
@@ -26,7 +28,7 @@ public List add(Collection elements) {
2628
}
2729

2830
@Override
29-
public List<String> add(GraphElement element) {
31+
public List<GremlinScriptQuery> add(GraphElement element) {
3032
GremlinScriptQueryBuilderContext context = new GremlinScriptQueryBuilderContext();
3133
add(element, context);
3234
return context.getResult();
@@ -39,15 +41,22 @@ private void add(GraphElement element, GremlinScriptQueryBuilderContext context)
3941
if (element instanceof GraphVertex) {
4042
addVertex((GraphVertex) element, context, metaModel);
4143
} else if (element instanceof GraphEdge) {
42-
addEdge((GraphEdge) element, context, metaModel);
44+
addEdge((GraphEdge) element, context, metaModel);
4345
}
4446
}
4547
}
4648

4749
private void addVertex(GraphVertex vertex, GremlinScriptQueryBuilderContext context, MetaModel metaModel) {
50+
final String alias = context.generateAlias();
51+
final GremlinScriptQuery gremlinScriptQuery = GremlinScriptQuery.of(vertex, alias);
52+
context.addToResult(gremlinScriptQuery);
53+
4854
final StringBuilder addQuery = new StringBuilder("addV(\"").append(vertex.getLabel()).append("\")");
55+
addQuery.append(".as(\"")
56+
.append(gremlinScriptQuery.getAlias())
57+
.append("\")");
4958

50-
String idStep = createIdStep(vertex);
59+
final String idStep = createIdStep(vertex);
5160
if (idStep != null) {
5261
addQuery.append(idStep);
5362
}
@@ -64,16 +73,27 @@ private void addVertex(GraphVertex vertex, GremlinScriptQueryBuilderContext cont
6473
}
6574

6675
if (vertex.getId() == null) {
67-
context.addToResult("g." + addQuery);
76+
gremlinScriptQuery.setQuery("g." + addQuery);
6877
} else {
69-
final String query = String.format("g.V(%s).fold().coalesce(unfold(), %s)", vertex.getId(), addQuery);
70-
context.addToResult(query);
78+
final String query = String.format("g.V(%s).fold().coalesce(unfold(), %s).as(\"%s\")",
79+
vertex.getId(), addQuery, alias);
80+
gremlinScriptQuery.setQuery(query);
7181
}
7282
}
7383

74-
private void addEdge(GraphEdge edge, GremlinScriptQueryBuilderContext context, MetaModel metaModel) {
84+
private void addEdge(GraphEdge edge, GremlinScriptQueryBuilderContext context, MetaModel metaModel) {
7585
final StringBuilder addQuery = new StringBuilder("addE(\"").append(edge.getLabel()).append("\")");
7686

87+
// handle .from and .to
88+
prepareAddOutAndInVerticesForEdges(edge, context);
89+
final String outVertexAlias = getQueryOrThrow(edge.getOutVertex(), context).getAlias();
90+
final String inVertexAlias = getQueryOrThrow(edge.getInVertex(), context).getAlias();
91+
addQuery.append(".from(\"")
92+
.append(outVertexAlias)
93+
.append("\").to(\"")
94+
.append(inVertexAlias)
95+
.append("\")");
96+
7797
String idStep = createIdStep(edge);
7898
if (idStep != null) {
7999
addQuery.append(idStep);
@@ -92,16 +112,26 @@ private void addEdge(GraphEdge edge, GremlinScriptQueryBuilderContext context, M
92112
}
93113
}
94114

95-
// TODO: 08.08.2022 handle IN and OUT vertex
96-
97115
if (edge.getId() == null) {
98-
context.addToResult("g." + addQuery);
116+
final GremlinScriptQuery gremlinScriptQuery = GremlinScriptQuery.ofEdge(edge, "g." + addQuery);
117+
context.addToResult(gremlinScriptQuery);
99118
} else {
100119
final String query = String.format("g.E(%s).fold().coalesce(unfold(), %s)", edge.getId(), addQuery);
101-
context.addToResult(query);
120+
final GremlinScriptQuery gremlinScriptQuery = GremlinScriptQuery.ofEdge(edge, query);
121+
context.addToResult(gremlinScriptQuery);
102122
}
103123
}
104124

125+
private void prepareAddOutAndInVerticesForEdges(GraphEdge edge, GremlinScriptQueryBuilderContext context) {
126+
add(edge.getOutVertex(), context);
127+
add(edge.getInVertex(), context);
128+
}
129+
130+
private GremlinScriptQuery getQueryOrThrow(GraphElement element, GremlinScriptQueryBuilderContext context)
131+
throws QueryBuilderException {
132+
return context.getResultFor(element).orElseThrow(() -> new QueryBuilderException(""));
133+
}
134+
105135
private void addEdgeCollectionSteps(GraphElement element,
106136
EdgeCollectionField edgeCollectionField,
107137
GremlinScriptQueryBuilderContext context) {
@@ -150,25 +180,25 @@ private String createIdStep(GraphElement element) {
150180
}
151181

152182
@Override
153-
public List<String> update(Collectionextends GraphElement> elements) {
183+
public List<GremlinScriptQuery> update(Collectionextends GraphElement> elements) {
154184
// TODO: 04.05.2022
155185
return null;
156186
}
157187

158188
@Override
159-
public List<String> update(GraphElement element) {
189+
public List<GremlinScriptQuery> update(GraphElement element) {
160190
// TODO: 04.05.2022
161191
return null;
162192
}
163193

164194
@Override
165-
public List<String> drop(Collectionextends GraphElement> elements) {
195+
public List<GremlinScriptQuery> drop(Collectionextends GraphElement> elements) {
166196
// TODO: 04.05.2022
167197
return null;
168198
}
169199

170200
@Override
171-
public List<String> drop(GraphElement element) {
201+
public List<GremlinScriptQuery> drop(GraphElement element) {
172202
// TODO: 04.05.2022
173203
return null;
174204
}

java-graph-persistence-query-builder/src/main/java/de/x1285/jgp/query/builder/gremlinscript/GremlinScriptQueryBuilderContext.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package de.x1285.jgp.query.builder.gremlinscript;
2+
3+
import de.x1285.jgp.element.GraphElement;
4+
import de.x1285.jgp.element.GraphVertex;
5+
import de.x1285.jgp.query.builder.AliasGenerator;
6+
import de.x1285.jgp.query.builder.QueryBuilderContext;
7+
8+
import java.util.ArrayList;
9+
import java.util.Collection;
10+
import java.util.List;
11+
import java.util.Optional;
12+
import java.util.UUID;
13+
14+
public class GremlinScriptQueryBuilderContext extends QueryBuilderContext {
15+
16+
private final AliasGenerator aliasGenerator = new AliasGenerator();
17+
18+
private final List<GremlinScriptQuery> result = new ArrayList<>();
19+
20+
public List<GremlinScriptQuery> getResult() {
21+
return result;
22+
}
23+
24+
public void addToResult(GremlinScriptQuery gremlinScriptQuery) {
25+
if (gremlinScriptQuery.isVertex()) {
26+
result.add(0, gremlinScriptQuery);
27+
} else {
28+
result.add(gremlinScriptQuery);
29+
}
30+
}
31+
32+
public void addToResult(Collection<GremlinScriptQuery> gremlinScriptQuery) {
33+
result.addAll(gremlinScriptQuery);
34+
}
35+
36+
public Optional<GremlinScriptQuery> getResultFor(GraphElement element) {
37+
return this.result.stream().filter(q -> q.getElement() == element).findFirst();
38+
}
39+
40+
public String generateAlias() {
41+
return aliasGenerator.generateAlias();
42+
}
43+
44+
}

0 commit comments

Comments
(0)