Skip to content

Commit 42f6c01

Browse files
committed
#1 - Filter Conflict at same object graph depth
1 parent 315123a commit 42f6c01

File tree

6 files changed

+61
-13
lines changed

6 files changed

+61
-13
lines changed

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/test/java/com/arangodb/graphql/generator/TraversalFilterGeneratorTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,21 @@ public void setUp(){
6161
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
7272
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

@@ -85,22 +85,22 @@ public void generateAqlSingleNonNumericFilter(){
8585
public void generateAqlMultipleNonNumericFilter(){
8686

8787
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
88-
new ArangoFilter("name", "Felix Potvin"),
89-
new ArangoFilter("jersey", 29)
88+
new ArangoFilter("name", "Felix Potvin", "edgeCollectionName"),
89+
new ArangoFilter("jersey", 29, "edgeCollectionName")
9090
));
9191

92-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].name == \"Felix Potvin\")\nFILTER (p.vertices[2].jersey == 29)"));
92+
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].name == \"Felix Potvin\")\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))"));
9393

9494
}
9595

9696
@Test
9797
public void generateAqlMultiValueFilter(){
9898

9999
when(filterGroup.getFilters()).thenReturn(Arrays.asList(
100-
new ArangoFilter("jersey", Arrays.asList(29, 93))
100+
new ArangoFilter("jersey", Arrays.asList(29, 93), "edgeCollectionName")
101101
));
102102

103-
assertThat(generator.generateAql(context), equalTo("FILTER (p.vertices[2].jersey == 29 || p.vertices[2].jersey == 93)"));
103+
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))"));
104104

105105
}
106106

0 commit comments

Comments
 (0)