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 aed1852

Browse files
committed
Added handling of all referenced vertices for GraphTraversalQueryBuilder
1 parent f3f2587 commit aed1852

File tree

8 files changed

+63
-36
lines changed
  • README.md
  • java-graph-persistence-query-builder/src
    • main/java/de/x1285/jgp/query/builder
      • Query.java
      • QueryBuilderContext.java
      • gremlinscript
        • GremlinScriptQuery.java
        • GremlinScriptQueryBuilderContext.java
      • tinkerpop
        • GraphTraversalQuery.java
        • GraphTraversalQueryBuilder.java
    • test/java/de/x1285/jgp/query/builder/tinkerpop
      • GraphTraversalQueryTest.java

8 files changed

+63
-36
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public class Person extends GraphVertex {
125125
- [ ] Support inserting a collection of vertices
126126
- [x] Implement first simple QueryBuilder which auto-generates Gremlin insert queries for GraphTraversals:
127127
- [x] Insert a vertex including all supported properties
128-
- [ ] ... and all other referenced vertices
128+
- [x] ... and all other referenced vertices
129129
- [ ] ... and all referenced edges including their properties
130130
- [ ] Support inserting a collection of vertices
131131

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public abstract class Query {
1616
@NonNull
1717
protected final GraphElement element;
1818

19+
@Getter
20+
private String alias;
21+
1922
@Getter
2023
@Setter
2124
protected R query;

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212

1313
public abstract class QueryBuilderContext<Q extends Query> {
1414

15+
private final AliasGenerator aliasGenerator = new AliasGenerator();
1516
private final List<Q> result = new ArrayList<>();
1617

18+
protected final HashSet<GraphElement> stack = new HashSet<>();
19+
protected final HashMap<Classextends GraphElement>, MetaModel> metaModelCache = new HashMap<>();
20+
1721
public List<Q> getResult() {
1822
return result;
1923
}
@@ -30,9 +34,6 @@ public Optional getResultFor(GraphElement element) {
3034
return this.result.stream().filter(q -> q.getElement() == element).findFirst();
3135
}
3236

33-
protected final HashSet<GraphElement> stack = new HashSet<>();
34-
protected final HashMap<Classextends GraphElement>, MetaModel> metaModelCache = new HashMap<>();
35-
3637
public void addHandled(GraphElement graphElement) {
3738
stack.add(graphElement);
3839
}
@@ -51,4 +52,8 @@ public MetaModel getMetaModel(GraphElement element) {
5152
return metaModel;
5253
}
5354
}
55+
56+
public String generateAlias() {
57+
return aliasGenerator.generateAlias();
58+
}
5459
}

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,11 @@
33
import de.x1285.jgp.element.GraphEdge;
44
import de.x1285.jgp.element.GraphElement;
55
import de.x1285.jgp.query.builder.Query;
6-
import lombok.Getter;
76
import lombok.experimental.SuperBuilder;
87

98
@SuperBuilder
109
public class GremlinScriptQuery extends Query<String> {
1110

12-
@Getter
13-
private final String alias;
14-
15-
public static GremlinScriptQuery of(GraphElement element, String query, String alias) {
16-
return GremlinScriptQuery.builder()
17-
.query(query)
18-
.element(element)
19-
.alias(alias)
20-
.build();
21-
}
22-
2311
public static GremlinScriptQuery of(GraphElement element, String alias) {
2412
return GremlinScriptQuery.builder()
2513
.element(element)

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package de.x1285.jgp.query.builder.gremlinscript;
22

33
import de.x1285.jgp.element.GraphElement;
4-
import de.x1285.jgp.query.builder.AliasGenerator;
54
import de.x1285.jgp.query.builder.QueryBuilderContext;
65

76
import java.util.ArrayList;
@@ -10,8 +9,6 @@
109

1110
public class GremlinScriptQueryBuilderContext extends QueryBuilderContext {
1211

13-
private final AliasGenerator aliasGenerator = new AliasGenerator();
14-
1512
private final List<GremlinScriptQuery> result = new ArrayList<>();
1613

1714
public List<GremlinScriptQuery> getResult() {
@@ -30,8 +27,4 @@ public Optional getResultFor(GraphElement element) {
3027
return this.result.stream().filter(q -> q.getElement() == element).findFirst();
3128
}
3229

33-
public String generateAlias() {
34-
return aliasGenerator.generateAlias();
35-
}
36-
3730
}

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
package de.x1285.jgp.query.builder.tinkerpop;
22

3-
import de.x1285.jgp.element.GraphElement;
3+
import de.x1285.jgp.element.GraphEdge;
4+
import de.x1285.jgp.element.GraphVertex;
45
import de.x1285.jgp.query.builder.Query;
5-
import lombok.NonNull;
6+
import lombok.experimental.SuperBuilder;
67
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
78
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
89
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
910

1011
import java.util.function.Function;
1112

13+
@SuperBuilder
1214
public class GraphTraversalQuery extends Query<Function<GraphTraversalSource, GraphTraversal>> {
1315

14-
public GraphTraversalQuery(@NonNull GraphElement element) {
15-
super(element);
16-
}
17-
1816
public GraphTraversal execute(GraphTraversalSource g) {
1917
return query.apply(g);
2018
}
2119

22-
public static GraphTraversalQuery of(GraphElement element) {
23-
return new GraphTraversalQuery(element);
20+
public static GraphTraversalQuery of(GraphVertex vertex, String alias) {
21+
return GraphTraversalQuery.builder()
22+
.element(vertex)
23+
.alias(alias)
24+
.build();
25+
}
26+
27+
public static GraphTraversalQuery of(GraphEdge edge) {
28+
return GraphTraversalQuery.builder()
29+
.element(edge)
30+
.build();
2431
}
2532

2633
public String toGremlinScript() {

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ private void add(GraphElement element, GraphTraversalQueryBuilderContext context
5252
}
5353

5454
private void addVertex(GraphVertex vertex, GraphTraversalQueryBuilderContext context, MetaModel metaModel) {
55-
final GraphTraversalQuery graphTraversalQuery = GraphTraversalQuery.of(vertex);
55+
final String alias = context.generateAlias();
56+
final GraphTraversalQuery graphTraversalQuery = GraphTraversalQuery.of(vertex, alias);
5657
context.addToResult(graphTraversalQuery);
5758

5859
Function<GraphTraversalSource, GraphTraversal> query;
@@ -64,6 +65,7 @@ private void addVertex(GraphVertex vertex, GraphTraversalQueryBuilderContext con
6465
query = g -> g.V(vertex.getId()).fold().coalesce(__.unfold(), addVQuery.apply(__.start()::addV));
6566
query = query.andThen(g -> g.property(T.id, vertex.getId()));
6667
}
68+
query = query.andThen(g -> g.as(graphTraversalQuery.getAlias()));
6769
graphTraversalQuery.setQuery(query);
6870

6971
for (RelevantFieldextends GraphElement, ?, ?> relevantField : metaModel.getRelevantFields()) {
@@ -77,6 +79,7 @@ private void addVertex(GraphVertex vertex, GraphTraversalQueryBuilderContext con
7779

7880
private Function<Function<String, GraphTraversal>, GraphTraversal>
7981
addVertexAndProperties(GraphVertex vertex, MetaModel metaModel) {
82+
8083
Function<Function<String, GraphTraversal>, GraphTraversal> addVQuery = g -> g.apply(vertex.getLabel());
8184
for (RelevantFieldextends GraphElement, ?, ?> relevantField : metaModel.getRelevantFields()) {
8285
if (relevantField instanceof PropertyField) {
@@ -87,7 +90,20 @@ private void addVertex(GraphVertex vertex, GraphTraversalQueryBuilderContext con
8790
}
8891

8992
private void addEdge(GraphEdge edge, GraphTraversalQueryBuilderContext context, MetaModel metaModel) {
90-
new QueryBuilderException("Not implemented yet");
93+
prepareAddOutAndInVerticesForEdges(edge, context);
94+
final String outVertexAlias = getQueryOrThrow(edge.getOutVertex(), context).getAlias();
95+
final String inVertexAlias = getQueryOrThrow(edge.getInVertex(), context).getAlias();
96+
// TODO: 24.02.2023 create and addE query;
97+
}
98+
99+
private void prepareAddOutAndInVerticesForEdges(GraphEdge edge, GraphTraversalQueryBuilderContext context) {
100+
add(edge.getOutVertex(), context);
101+
add(edge.getInVertex(), context);
102+
}
103+
104+
private GraphTraversalQuery getQueryOrThrow(GraphElement element, GraphTraversalQueryBuilderContext context)
105+
throws QueryBuilderException {
106+
return context.getResultFor(element).orElseThrow(() -> new QueryBuilderException(""));
91107
}
92108

93109
private void addEdgeCollectionSteps(GraphElement element,

java-graph-persistence-query-builder/src/test/java/de/x1285/jgp/query/builder/tinkerpop/GraphTraversalQueryTest.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import de.x1285.jpg.test.data.TestData;
44
import de.x1285.jpg.test.data.TestDataGenerator;
5-
import org.apache.tinkerpop.gremlin.structure.Graph;
65
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
76
import org.junit.jupiter.api.Test;
87

@@ -13,13 +12,13 @@
1312
class GraphTraversalQueryTest {
1413

1514
@Test
16-
public void testExecuteAllVertices() throws Exception {
15+
public void testExecuteAllVertices() {
1716
final TestData testData = TestDataGenerator.generateTestData();
1817

1918
final GraphTraversalQueryBuilder queryBuilder = new GraphTraversalQueryBuilder();
2019
final List<GraphTraversalQuery> queries = queryBuilder.add(testData.getAllVertices());
2120

22-
try (final Graph graph = TinkerGraph.open()) {
21+
try (final TinkerGraph graph = TinkerGraph.open()) {
2322
for (GraphTraversalQuery query : queries) {
2423
query.execute(graph.traversal()).iterate();
2524
}
@@ -31,4 +30,20 @@ public void testExecuteAllVertices() throws Exception {
3130
}
3231
}
3332

33+
@Test
34+
public void testExecuteReferencedVertices() {
35+
final TestData testData = TestDataGenerator.generateTestData();
36+
37+
final GraphTraversalQueryBuilder queryBuilder = new GraphTraversalQueryBuilder();
38+
39+
try (final TinkerGraph graph = TinkerGraph.open()) {
40+
final List<GraphTraversalQuery> queries = queryBuilder.add(testData.getMarko());
41+
for (GraphTraversalQuery query : queries) {
42+
query.execute(graph.traversal()).iterate();
43+
}
44+
45+
assertEquals(7, graph.traversal().V().count().next());
46+
}
47+
}
48+
3449
}

0 commit comments

Comments
(0)