Skip to content

Commit ae5a167

Browse files
author
Burak Serdar
committed
Fix #771: Subsequent implicit inclusions hide explicit inclusions
1 parent cf497c9 commit ae5a167

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

query-api/src/main/java/com/redhat/lightblue/query/Projection.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,32 @@ private Inclusion getFieldInclusion(Path field, ProjectionList p, Path context)
321321
LOGGER.debug("Checking if a projection list projects {}", field);
322322
Inclusion lastResult = Inclusion.undecided;
323323
List<Projection> items = p.getItems();
324+
// Iterate projection list backwards. This way, the last projection expression that makes a decision on the field wins
325+
// There are exceptions to this below
324326
ListIterator<Projection> itemsItr = items.listIterator(items.size());
325327
while (itemsItr.hasPrevious()) {
326328
Inclusion ret = itemsItr.previous().getFieldInclusion(field, context);
327329
if (ret != Inclusion.undecided) {
328-
lastResult = ret;
329-
break;
330+
// This projection expression makes a decision on the field
331+
// If the decision is explicit, then return it
332+
if(ret == Inclusion.explicit_inclusion||
333+
ret == Inclusion.explicit_exclusion) {
334+
lastResult=ret;
335+
break;
336+
}
337+
338+
// Here, ret is implicit inclusion or implicit exclusion
339+
// If lastResult is undecided, then keep this decision
340+
// If lastResult is not undecided, then it is an implicit decision, and that stays
341+
if(lastResult==Inclusion.undecided) {
342+
lastResult = ret;
343+
}
330344
}
331345
}
346+
// Here: if we have a projection list with:
347+
// [ explicit_inclusion, implicit_inclusion ]
348+
// we return explicit_inclusion. Same with
349+
// [ implicit_inclusion, explicit_inclusion]
332350
LOGGER.debug("Projection list projects {}: {}", field, lastResult);
333351
return lastResult;
334352
}

query-api/src/test/java/com/redhat/lightblue/query/ProjectionFieldReferenceTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,10 @@ public void projection_list() throws Exception {
147147
Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.y.q")));
148148
Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.t")));
149149
}
150+
151+
@Test
152+
public void explicit_inclusion_override() throws Exception {
153+
Projection p=Projection.fromJson(JsonUtils.json("[{\"field\":\"x\"},{\"field\":\"*\",\"recursive\":true}]"));
154+
Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("x")));
155+
}
150156
}

0 commit comments

Comments
 (0)