Skip to content

Commit cd676f7

Browse files
author
Achim Brandt
committed
updates for traversal and shortest path
1 parent 845fd1f commit cd676f7

16 files changed

+908
-496
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,4 +417,9 @@ see 2.4.4
417417
(see src/test/java/com/arangodb/example)
418418

419419
## since 2.5.5
420-
* renamed VisitedEntity to TraversalResultEntity
420+
* updated driver.getTraversal(...);
421+
* removed VisitedEntity (Traversal)
422+
* added TraversalQueryOptions to avoid too many parameters
423+
* added an examples for Transaction API
424+
(see src/test/java/com/arangodb/example/TransactionExample.java)
425+

src/main/java/com/arangodb/ArangoDriver.java

Lines changed: 9 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323
import java.util.List;
2424
import java.util.Map;
2525

26-
import com.arangodb.InternalTraversalDriver.ItemOrder;
27-
import com.arangodb.InternalTraversalDriver.Order;
28-
import com.arangodb.InternalTraversalDriver.Strategy;
29-
import com.arangodb.InternalTraversalDriver.Uniqueness;
3026
import com.arangodb.entity.AdminLogEntity;
3127
import com.arangodb.entity.AqlFunctionsEntity;
3228
import com.arangodb.entity.ArangoUnixTime;
@@ -35,6 +31,7 @@
3531
import com.arangodb.entity.BatchResponseEntity;
3632
import com.arangodb.entity.BooleanResultEntity;
3733
import com.arangodb.entity.CollectionEntity;
34+
import com.arangodb.entity.CollectionKeyOption;
3835
import com.arangodb.entity.CollectionOptions;
3936
import com.arangodb.entity.CollectionsEntity;
4037
import com.arangodb.entity.CursorEntity;
@@ -86,6 +83,7 @@
8683
import com.arangodb.util.JsonUtils;
8784
import com.arangodb.util.MapBuilder;
8885
import com.arangodb.util.ShortestPathOptions;
86+
import com.arangodb.util.TraversalQueryOptions;
8987

9088
/**
9189
* ArangoDB driver. All of the functionality to use ArangoDB is provided via
@@ -5320,16 +5318,11 @@ public <V, E> ShortestPathEntity<V, E> graphGetShortesPath(
53205318
Object startVertexExample,
53215319
Object endVertexExample,
53225320
ShortestPathOptions shortestPathOptions,
5323-
AqlQueryOptions aqlQueryOptions,
53245321
Class<V> vertexClass,
53255322
Class<E> edgeClass) throws ArangoException {
53265323

5327-
if (aqlQueryOptions == null) {
5328-
aqlQueryOptions = getDefaultAqlQueryOptions();
5329-
}
5330-
53315324
return cursorDriver.getShortesPath(getDefaultDatabase(), graphName, startVertexExample, endVertexExample,
5332-
shortestPathOptions, aqlQueryOptions, vertexClass, edgeClass);
5325+
shortestPathOptions, getDefaultAqlQueryOptions(), vertexClass, edgeClass);
53335326
}
53345327

53355328
// public <T, S> CursorEntity<EdgeEntity<T>> graphGetEdgesByExampleObject1(
@@ -5472,77 +5465,20 @@ public <T> EdgeEntity<T> createEdge(
54725465
*
54735466
* See API documatation of Traversals
54745467
*
5475-
* @param graphName
5476-
* (optional) name of the graph that contains the edges. Either
5477-
* edgeCollection or graphName has to be given. In case both
5478-
* values are set the graphName is prefered.
5479-
* @param edgeCollection
5480-
* (optional) name of the collection that contains the edges.
5481-
* @param startVertex
5482-
* id of the startVertex, e.g. "users/foo".
5468+
* @param traversalQueryOptions
5469+
* the traversal options
54835470
* @param vertexClazz
54845471
* Class of returned vertex documents.
54855472
* @param edgeClass
54865473
* Class of returned edge documents.
5487-
* @param filter
5488-
* (optional, default is to include all nodes): body (JavaScript
5489-
* code) of custom filter function function
5490-
* @param minDepth
5491-
* (optional, ANDed with any existing filters): visits only nodes
5492-
* in at least the given depth
5493-
* @param maxDepth
5494-
* (optional, ANDed with any existing filters): visits only nodes
5495-
* in at most the given depth
5496-
* @param visitor
5497-
* (optional): body (JavaScript) code of custom visitor function
5498-
* @param direction
5499-
* (optional): direction for traversal
5500-
* @param init
5501-
* (optional): body (JavaScript) code of custom result
5502-
* initialisation function
5503-
* @param expander
5504-
* (optional): body (JavaScript) code of custom expander function
5505-
* @param sort
5506-
* (optional): body (JavaScript) code of a custom comparison
5507-
* function
5508-
* @param strategy
5509-
* (optional): traversal strategy
5510-
* @param order
5511-
* (optional): traversal order
5512-
* @param itemOrder
5513-
* (optional): item iteration order
5514-
* @param verticesUniqueness
5515-
* (optional): specifies uniqueness for vertices visited if set
5516-
* @param edgesUniqueness
5517-
* (optional): specifies uniqueness for edges visited if set
5518-
* @param maxIterations
5519-
* (optional): Maximum number of iterations in each traversal
55205474
* @return
55215475
* @throws ArangoException
55225476
*/
55235477
public <V, E> TraversalEntity<V, E> getTraversal(
5524-
String graphName,
5525-
String edgeCollection,
5526-
String startVertex,
5478+
TraversalQueryOptions traversalQueryOptions,
55275479
Class<V> vertexClazz,
5528-
Class<E> edgeClazz,
5529-
String filter,
5530-
Long minDepth,
5531-
Long maxDepth,
5532-
String visitor,
5533-
Direction direction,
5534-
String init,
5535-
String expander,
5536-
String sort,
5537-
Strategy strategy,
5538-
Order order,
5539-
ItemOrder itemOrder,
5540-
Uniqueness verticesUniqueness,
5541-
Uniqueness edgesUniqueness,
5542-
Long maxIterations) throws ArangoException {
5543-
5544-
return this.traversalDriver.getTraversal(getDefaultDatabase(), graphName, edgeCollection, startVertex,
5545-
vertexClazz, edgeClazz, filter, minDepth, maxDepth, visitor, direction, init, expander, sort, strategy,
5546-
order, itemOrder, verticesUniqueness, edgesUniqueness, maxIterations);
5480+
Class<E> edgeClazz) throws ArangoException {
5481+
5482+
return this.traversalDriver.getTraversal(getDefaultDatabase(), traversalQueryOptions, vertexClazz, edgeClazz);
55475483
}
55485484
}

src/main/java/com/arangodb/InternalTraversalDriver.java

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,44 +22,34 @@
2222

2323
import com.arangodb.entity.TraversalEntity;
2424
import com.arangodb.impl.BaseDriverInterface;
25+
import com.arangodb.util.TraversalQueryOptions;
2526

2627
public interface InternalTraversalDriver extends BaseDriverInterface {
2728

2829
public enum Strategy {
29-
DEPTHFIRST, BREADTHFIRST
30+
DEPTHFIRST,
31+
BREADTHFIRST
3032
}
3133

3234
public enum Order {
33-
PREORDER, POSTORDER
35+
PREORDER,
36+
POSTORDER
3437
}
3538

3639
public enum ItemOrder {
37-
FORWARD, BACKWARD
40+
FORWARD,
41+
BACKWARD
3842
}
3943

4044
public enum Uniqueness {
41-
NONE, GLOBAL, PATH
45+
NONE,
46+
GLOBAL,
47+
PATH
4248
}
4349

4450
<V, E> TraversalEntity<V, E> getTraversal(
4551
String databaseName,
46-
String graphName,
47-
String edgeCollection,
48-
String startVertex,
52+
TraversalQueryOptions traversalQueryOptions,
4953
Class<V> vertexClazz,
50-
Class<E> edgeClazz,
51-
String filter,
52-
Long minDepth,
53-
Long maxDepth,
54-
String visitor,
55-
Direction direction,
56-
String init,
57-
String expander,
58-
String sort,
59-
Strategy strategy,
60-
Order order,
61-
ItemOrder itemOrder,
62-
Uniqueness verticesUniqueness,
63-
Uniqueness edgesUniqueness,
64-
Long maxIterations) throws ArangoException;
54+
Class<E> edgeClazz) throws ArangoException;
6555
}

src/main/java/com/arangodb/entity/EntityDeserializers.java

Lines changed: 57 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,59 +1920,34 @@ public static class TraversalEntityDeserializer implements JsonDeserializer<Trav
19201920
JsonObject obj = json.getAsJsonObject();
19211921
TraversalEntity<Object, Object> entity = deserializeBaseParameter(obj,
19221922
new TraversalEntity<Object, Object>());
1923-
deserializeDocumentParameter(obj, entity);
1924-
1925-
if (obj.has("result")) {
1926-
JsonObject result = obj.getAsJsonObject("result");
1927-
TraversalResultEntity<Object, Object> v = null;
1923+
deserializeBaseParameter(obj, entity);
19281924

1929-
if (result.has("visited")) {
1930-
JsonObject visited = result.getAsJsonObject("visited");
1931-
v = (TraversalResultEntity<Object, Object>) context.deserialize(visited,
1932-
TraversalResultEntity.class);
1933-
} else {
1934-
v = new TraversalResultEntity<Object, Object>();
1935-
}
1936-
entity.setEntity(v);
1937-
}
1925+
JsonObject result = getFirstResultAsJsonObject(obj);
1926+
if (result != null) {
1927+
if (result.getAsJsonObject().has("visited")) {
1928+
JsonObject visited = result.getAsJsonObject().getAsJsonObject("visited");
19381929

1939-
return entity;
1940-
}
1941-
}
1942-
1943-
public static class TraversalResultEntityDeserializer implements JsonDeserializer<TraversalResultEntity<?, ?>> {
1944-
@Override
1945-
public TraversalResultEntity<?, ?> deserialize(
1946-
JsonElement json,
1947-
Type typeOfT,
1948-
JsonDeserializationContext context) throws JsonParseException {
1930+
Class<?> vertexClazz = getParameterized();
1931+
Class<?> edgeClazz = null;
19491932

1950-
if (json.isJsonNull()) {
1951-
return null;
1952-
}
1953-
1954-
JsonObject visited = json.getAsJsonObject();
1955-
TraversalResultEntity<Object, Object> entity = new TraversalResultEntity<Object, Object>();
1956-
1957-
Class<?> vertexClazz = getParameterized();
1958-
Class<?> edgeClazz = null;
1959-
if (hasNextParameterized()) {
1960-
edgeClazz = nextParameterized();
1961-
}
1933+
if (hasNextParameterized()) {
1934+
edgeClazz = nextParameterized();
1935+
}
19621936

1963-
if (visited.has("vertices")) {
1964-
entity.setVertices(getVertices(vertexClazz, context, visited.getAsJsonArray("vertices")));
1965-
}
1966-
if (visited.has("paths")) {
1967-
entity.setPaths(getPaths(context, visited, vertexClazz, edgeClazz));
1937+
if (visited.has("vertices")) {
1938+
entity.setVertices(getVertices(vertexClazz, context, visited.getAsJsonArray("vertices")));
1939+
}
1940+
if (visited.has("paths")) {
1941+
entity.setPaths(getPaths(context, visited, vertexClazz, edgeClazz));
1942+
}
1943+
}
19681944
}
19691945

19701946
return entity;
19711947
}
19721948
}
19731949

19741950
public static class ShortestPathEntityDeserializer implements JsonDeserializer<ShortestPathEntity<?, ?>> {
1975-
@SuppressWarnings("unchecked")
19761951
@Override
19771952
public ShortestPathEntity<?, ?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
19781953
throws JsonParseException {
@@ -1984,62 +1959,60 @@ public static class ShortestPathEntityDeserializer implements JsonDeserializer<S
19841959
JsonObject obj = json.getAsJsonObject();
19851960
ShortestPathEntity<Object, Object> entity = deserializeBaseParameter(obj,
19861961
new ShortestPathEntity<Object, Object>());
1987-
deserializeDocumentParameter(obj, entity);
1962+
deserializeBaseParameter(obj, entity);
19881963

1989-
if (obj.has("result")) {
1990-
JsonArray result = obj.getAsJsonArray("result");
1991-
ShortestPathResultEntity<Object, Object> v = null;
1964+
JsonObject result = getFirstResultAsJsonObject(obj);
1965+
if (result != null) {
1966+
Class<?> vertexClazz = getParameterized();
1967+
Class<?> edgeClazz = null;
19921968

1993-
if (result.size() > 0) {
1994-
v = (ShortestPathResultEntity<Object, Object>) context.deserialize(result.get(0),
1995-
ShortestPathResultEntity.class);
1969+
if (hasNextParameterized()) {
1970+
edgeClazz = nextParameterized();
1971+
}
1972+
1973+
if (result.has("vertex")) {
1974+
if (result.get("vertex").isJsonObject()) {
1975+
entity.setVertex(result.getAsJsonObject("vertex").getAsJsonPrimitive("_id").getAsString());
1976+
} else if (result.get("vertex").isJsonPrimitive()) {
1977+
entity.setVertex(result.getAsJsonPrimitive("vertex").getAsString());
1978+
}
1979+
}
1980+
if (result.has("distance")) {
1981+
entity.setDistance(result.get("distance").getAsLong());
19961982
} else {
1997-
v = new ShortestPathResultEntity<Object, Object>();
1983+
entity.setDistance(-1L);
1984+
}
1985+
if (result.has("startVertex")) {
1986+
entity.setStartVertex(result.get("startVertex").getAsString());
1987+
}
1988+
if (result.has("paths")) {
1989+
entity.setPaths(getPaths(context, result, vertexClazz, edgeClazz));
19981990
}
1999-
entity.setEntity(v);
1991+
} else {
1992+
entity.setDistance(-1L);
20001993
}
20011994

20021995
return entity;
20031996
}
20041997
}
20051998

2006-
public static class ShortestPathResultEntityDeserializer implements
2007-
JsonDeserializer<ShortestPathResultEntity<?, ?>> {
2008-
@Override
2009-
public ShortestPathResultEntity<?, ?> deserialize(
2010-
JsonElement json,
2011-
Type typeOfT,
2012-
JsonDeserializationContext context) throws JsonParseException {
2013-
2014-
if (json.isJsonNull()) {
2015-
return null;
2016-
}
2017-
2018-
JsonObject visited = json.getAsJsonObject();
2019-
ShortestPathResultEntity<Object, Object> entity = new ShortestPathResultEntity<Object, Object>();
2020-
2021-
Class<?> vertexClazz = getParameterized();
2022-
Class<?> edgeClazz = null;
2023-
if (hasNextParameterized()) {
2024-
edgeClazz = nextParameterized();
2025-
}
1999+
private static JsonObject getFirstResultAsJsonObject(JsonObject obj) {
2000+
if (obj.has("result")) {
2001+
if (obj.get("result").isJsonArray()) {
2002+
JsonArray result = obj.getAsJsonArray("result");
20262003

2027-
if (visited.has("vertex")) {
2028-
entity.setVertex(getVertex(context, visited.getAsJsonObject("vertex"), vertexClazz));
2029-
}
2030-
if (visited.has("distance")) {
2031-
entity.setDistance(visited.get("distance").getAsLong());
2032-
}
2033-
if (visited.has("startVertex")) {
2034-
entity.setStartVertex(visited.get("startVertex").getAsString());
2035-
}
2036-
if (visited.has("paths")) {
2037-
entity.setPaths(getPaths(context, visited, vertexClazz, edgeClazz));
2004+
if (result.size() > 0) {
2005+
JsonElement jsonElement = result.get(0);
2006+
if (jsonElement.isJsonObject()) {
2007+
return jsonElement.getAsJsonObject();
2008+
}
2009+
}
2010+
} else if (obj.get("result").isJsonObject()) {
2011+
return obj.getAsJsonObject("result");
20382012
}
20392013

2040-
return entity;
20412014
}
2042-
2015+
return null;
20432016
}
20442017

20452018
private static List<PathEntity<Object, Object>> getPaths(

src/main/java/com/arangodb/entity/EntityFactory.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ public static GsonBuilder getGsonBuilder() {
114114
.registerTypeAdapter(VertexEntity.class, new EntityDeserializers.VertexEntityDeserializer())
115115
.registerTypeAdapter(EdgeEntity.class, new EntityDeserializers.EdgeEntityDeserializer())
116116
.registerTypeAdapter(TraversalEntity.class, new EntityDeserializers.TraversalEntityDeserializer())
117-
.registerTypeAdapter(TraversalResultEntity.class,
118-
new EntityDeserializers.TraversalResultEntityDeserializer())
119-
.registerTypeAdapter(ShortestPathEntity.class, new EntityDeserializers.ShortestPathEntityDeserializer())
120-
.registerTypeAdapter(ShortestPathResultEntity.class,
121-
new EntityDeserializers.ShortestPathResultEntityDeserializer());
117+
.registerTypeAdapter(ShortestPathEntity.class, new EntityDeserializers.ShortestPathEntityDeserializer());
122118
}
123119

124120
static {

0 commit comments

Comments
 (0)