Skip to content

Commit 799fd4c

Browse files
authored
Merge pull request #3 from colinfindlay/master
Fixes for issues #1 and #2
2 parents 0477ba6 + 80198e4 commit 799fd4c

File tree

9 files changed

+94
-25
lines changed

9 files changed

+94
-25
lines changed

src/main/java/com/arangodb/graphql/ArangoDataFetcher.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,13 @@ private ArangoTraversalQueryResult executeQuery(ArangoTraversalQuery query){
8989
return result;
9090
}
9191

92-
private List<Map> processResult(ArangoTraversalQueryResult result){
92+
private Object processResult(ArangoTraversalQueryResult result){
9393
logger.debug("Converting paths to GraphQL Query Response");
9494
Instant start = Instant.now();
95-
List<Map> convertedResult = result.getResult();
95+
Object convertedResult = result.getResult();
9696
Instant finish = Instant.now();
9797
long duration = Duration.between(start, finish).toMillis();
9898
logger.debug("Response conversion completed in {}ms", duration);
99-
logger.debug("GraphQL Query Response has {} elements", convertedResult.size());
10099
return convertedResult;
101100
}
102101

src/main/java/com/arangodb/graphql/context/ArangoFilter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class ArangoFilter {
3636

3737
private final List values;
3838

39+
private String edgeCollection;
40+
3941
public ArangoFilter(String key, Object value) {
4042
this.key = key;
4143
if (value instanceof Collection) {
@@ -45,6 +47,11 @@ public ArangoFilter(String key, Object value) {
4547
}
4648
}
4749

50+
public ArangoFilter(String key, Object value, String edgeCollection) {
51+
this(key, value);
52+
this.edgeCollection = edgeCollection;
53+
}
54+
4855
public String getKey() {
4956
return key;
5057
}
@@ -53,4 +60,7 @@ public List getValues() {
5360
return values;
5461
}
5562

63+
public String getEdgeCollection() {
64+
return edgeCollection;
65+
}
5666
}

src/main/java/com/arangodb/graphql/context/ArangoFilterGroup.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020

2121
package com.arangodb.graphql.context;
2222

23+
import com.arangodb.graphql.schema.ArangoEdgeDirective;
24+
import graphql.schema.SelectedField;
25+
2326
import java.util.List;
2427
import java.util.Map;
2528
import java.util.stream.Collectors;
@@ -40,6 +43,15 @@ public ArangoFilterGroup(List<ArangoFilter> filters, int depth) {
4043
this.depth = depth;
4144
}
4245

46+
public ArangoFilterGroup(SelectedField field, int depth){
47+
ArangoEdgeDirective edgeDirective = new ArangoEdgeDirective(field.getFieldDefinition());
48+
this.filters = field.getArguments().entrySet()
49+
.stream()
50+
.map(e -> new ArangoFilter(e.getKey(), e.getValue(), edgeDirective.getCollection()))
51+
.collect(Collectors.toList());
52+
this.depth = depth;
53+
}
54+
4355
public ArangoFilterGroup(Map<String, Object> arguments, int depth) {
4456
this.filters = arguments.entrySet()
4557
.stream()

src/main/java/com/arangodb/graphql/context/ArangoTypeDiscriminationFilterFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ private String discriminator(GraphQLOutputType type){
4141
}
4242

4343
public ArangoFilter typeFilterFor(GraphQLType type){
44+
return typeFilterFor(type, null);
45+
}
46+
47+
public ArangoFilter typeFilterFor(GraphQLType type, String edgeCollection){
4448
GraphQLType graphQLType = GraphQLTypeUtil.unwrapAll(type);
4549

4650
if(graphQLType instanceof GraphQLObjectType) {
@@ -60,7 +64,7 @@ public ArangoFilter typeFilterFor(GraphQLType type){
6064
alias = graphQLType.getName();
6165
}
6266

63-
return new ArangoFilter(discriminator.get(), alias);
67+
return new ArangoFilter(discriminator.get(), alias, edgeCollection);
6468

6569
}
6670

src/main/java/com/arangodb/graphql/context/SelectedFieldMetadata.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public ArangoFilterGroup filterGroup() {
5656
List<ArangoFilter> filters = new ArrayList<>();
5757

5858
if (selectedField.getArguments().size() > 0) {
59-
ArangoFilterGroup argumentGroup = new ArangoFilterGroup(selectedField.getArguments(), depth());
59+
ArangoFilterGroup argumentGroup = new ArangoFilterGroup(selectedField, depth());
6060
filters.addAll(argumentGroup.getFilters());
6161
}
6262

@@ -131,9 +131,10 @@ public List<GraphQLFieldsContainer> fieldContainers() {
131131
}
132132

133133
private ArangoFilter typeFilter(){
134+
ArangoEdgeDirective edgeDirective = new ArangoEdgeDirective(selectedField.getFieldDefinition());
134135
GraphQLFieldDefinition fieldDefinition = selectedField.getFieldDefinition();
135136
GraphQLType graphQLType = GraphQLTypeUtil.unwrapAll(fieldDefinition.getType());
136137
ArangoTypeDiscriminationFilterFactory typeFilterFactory = new ArangoTypeDiscriminationFilterFactory();
137-
return typeFilterFactory.typeFilterFor(graphQLType);
138+
return typeFilterFactory.typeFilterFor(graphQLType, edgeDirective.getCollection());
138139
}
139140
}

src/main/java/com/arangodb/graphql/generator/AbstractFilterGenerator.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,22 @@ public String generateAql(ArangoGraphQLContext ctx) {
7676

7777
private String filter(ArangoFilter filter, int depth) {
7878

79-
String prefix = depth >= 0 ? "p.vertices[" + depth + "]." : "rootVertex.";
79+
boolean edgeFilter = depth >=0;
80+
String prefix = edgeFilter ? "p.vertices[" + depth + "]." : "rootVertex.";
8081

8182
StringBuilder sb = new StringBuilder();
83+
StringBuilder isSameCollection = new StringBuilder();
8284
sb.append("FILTER (");
8385

86+
if(edgeFilter){
87+
sb.append("(");
88+
isSameCollection.append("IS_SAME_COLLECTION(\"");
89+
isSameCollection.append(filter.getEdgeCollection());
90+
isSameCollection.append("\", p.edges[");
91+
isSameCollection.append(depth -1);
92+
isSameCollection.append("]._id)");
93+
}
94+
8495
Iterator<ArangoFilter> iterator = filter.getValues().iterator();
8596
while (iterator.hasNext()) {
8697
Object value = iterator.next();
@@ -98,6 +109,16 @@ private String filter(ArangoFilter filter, int depth) {
98109
}
99110
sb.append(")");
100111

112+
if(edgeFilter) {
113+
sb.append(" AND ");
114+
sb.append(isSameCollection.toString());
115+
sb.append(")");
116+
117+
sb.append(" OR (NOT ");
118+
sb.append(isSameCollection.toString());
119+
sb.append(")");
120+
}
121+
101122
return sb.toString();
102123

103124
}

src/main/java/com/arangodb/graphql/query/result/ArangoTraversalQueryResult.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.arangodb.graphql.context.ArangoGraphQLContext;
2424
import com.arangodb.graphql.query.BaseDocumentPathEntity;
2525
import com.arangodb.graphql.query.result.resolver.ResultResolver;
26+
import graphql.schema.DataFetchingEnvironment;
27+
import graphql.schema.GraphQLTypeUtil;
2628

2729
import java.util.List;
2830
import java.util.Map;
@@ -71,8 +73,18 @@ public int size(){
7173
*
7274
* @return The result in the structure requested by the GraphQL Query
7375
*/
74-
public List<Map> getResult() {
75-
return result;
76+
public Object getResult() {
77+
DataFetchingEnvironment environment = ctx.getEnvironment();
78+
boolean isList = GraphQLTypeUtil.isList(environment.getFieldType());
79+
if(isList){
80+
return result;
81+
}
82+
else{
83+
if(result.size() == 0){
84+
return null;
85+
}
86+
return result.get(0);
87+
}
7688
}
7789

7890
}

src/test/java/com/arangodb/graphql/generator/TraversalFilterGeneratorTest.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class TraversalFilterGeneratorTest {
4949

5050

5151
@Before
52-
public void setUp(){
52+
public void setUp() {
5353
generator = new TraversalFilterGenerator();
5454
when(context.hasTraversal()).thenReturn(true);
5555
when(context.getTraversalFilters()).thenReturn(Arrays.asList(filterGroup));
@@ -58,49 +58,48 @@ public void setUp(){
5858

5959

6060
@Test
61-
public void generateAqlSingleNumericFilter(){
61+
public void generateAqlSingleNumericFilter() {
6262

6363
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
64-
new ArangoFilter("jersey", 29)
64+
new ArangoFilter("jersey", 29, "edgeCollectionName")
6565
));
6666

67-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].jersey == 29)"));
67+
assertThat(generator.generateAql(context), equalTo("FILTER ((p.vertices[2].jersey == 29) AND IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id)) OR (NOT IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id))"));
6868

6969
}
7070

7171
@Test
72-
public void generateAqlSingleNonNumericFilter(){
72+
public void generateAqlSingleNonNumericFilter() {
7373

7474
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
75-
new ArangoFilter("name", "Felix Potvin")
75+
new ArangoFilter("name", "Felix Potvin", "edgeCollectionName")
7676
));
7777

78-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].name == \"Felix Potvin\")"));
78+
assertThat(generator.generateAql(context), equalTo("FILTER ((p.vertices[2].name == \"Felix Potvin\") AND IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id)) OR (NOT IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id))"));
7979

8080
}
8181

8282

83-
8483
@Test
85-
public void generateAqlMultipleNonNumericFilter(){
84+
public void generateAqlMultipleNonNumericFilter() {
8685

8786
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
88-
new ArangoFilter("name", "Felix Potvin"),
89-
new ArangoFilter("jersey", 29)
87+
new ArangoFilter("name", "Felix Potvin", "edgeCollectionName"),
88+
new ArangoFilter("jersey", 29, "edgeCollectionName")
9089
));
9190

92-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].name == \"Felix Potvin\")\nFILTER (p.vertices[2].jersey == 29)"));
91+
assertThat(generator.generateAql(context), equalTo("FILTER ((p.vertices[2].name == \"Felix Potvin\") AND IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id)) OR (NOT IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id))\nFILTER ((p.vertices[2].jersey == 29) AND IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id)) OR (NOT IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id))"));
9392

9493
}
9594

9695
@Test
97-
public void generateAqlMultiValueFilter(){
96+
public void generateAqlMultiValueFilter() {
9897

9998
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
100-
new ArangoFilter("jersey", Arrays.asList(29, 93))
99+
new ArangoFilter("jersey", Arrays.asList(29, 93), "edgeCollectionName")
101100
));
102101

103-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].jersey == 29 || p.vertices[2].jersey == 93)"));
102+
assertThat(generator.generateAql(context), equalTo("FILTER ((p.vertices[2].jersey == 29 || p.vertices[2].jersey == 93) AND IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id)) OR (NOT IS_SAME_COLLECTION(\"edgeCollectionName\", p.edges[1]._id))"));
104103

105104
}
106105

src/test/java/com/arangodb/graphql/query/ArangoTraversalQueryExecutorTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.arangodb.ArangoDatabase;
2626
import com.arangodb.graphql.context.ArangoGraphQLContext;
2727
import com.arangodb.graphql.query.result.ArangoTraversalQueryResult;
28+
import graphql.schema.DataFetchingEnvironment;
29+
import graphql.schema.GraphQLOutputType;
2830
import org.junit.Before;
2931
import org.junit.Test;
3032
import org.junit.runner.RunWith;
@@ -35,6 +37,7 @@
3537
import java.util.Collections;
3638

3739
import static org.hamcrest.CoreMatchers.equalTo;
40+
import static org.hamcrest.CoreMatchers.nullValue;
3841
import static org.junit.Assert.*;
3942
import static org.mockito.ArgumentMatchers.any;
4043
import static org.mockito.Mockito.verify;
@@ -58,6 +61,12 @@ public class ArangoTraversalQueryExecutorTest {
5861
@Mock
5962
private ArangoGraphQLContext context;
6063

64+
@Mock
65+
private DataFetchingEnvironment dataFetchingEnvironment;
66+
67+
@Mock
68+
private GraphQLOutputType outputType;
69+
6170
private ArangoTraversalQueryExecutor executor;
6271

6372
@Before
@@ -75,13 +84,15 @@ public void execute() {
7584
when(arango.db("my_db")).thenReturn(database);
7685
when(database.query(any(), any(), any(), any())).thenReturn(cursor);
7786
when(cursor.asListRemaining()).thenReturn(Collections.EMPTY_LIST);
87+
when(context.getEnvironment()).thenReturn(dataFetchingEnvironment);
88+
when(dataFetchingEnvironment.getFieldType()).thenReturn(outputType);
7889

7990
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
8091

8192
ArangoTraversalQueryResult result = executor.execute(query);
8293

8394

84-
assertThat(result.getResult().size(), equalTo(0));
95+
assertThat(result.getResult(), nullValue());
8596

8697
verify(database).query(captor.capture(), any(), any(), any());
8798
assertThat(captor.getValue(), equalTo("RETURN 1"));

0 commit comments

Comments
 (0)