Skip to content

Commit f88739a

Browse files
authored
Merge pull request #687 from bserdar/686
686
2 parents 823e5b8 + 4809da1 commit f88739a

File tree

7 files changed

+77
-14
lines changed

7 files changed

+77
-14
lines changed

crud/src/main/java/com/redhat/lightblue/assoc/QueryPlanChooser.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -143,25 +143,29 @@ private void iterateReferences(CompositeMetadata root, List<Conjunct> unassigned
143143
Error.push("iterateReferences");
144144
try {
145145
Set<Path> childPaths = root.getChildPaths();
146+
LOGGER.debug("childPaths={}",childPaths);
146147
QueryPlanNode sourceNode = qplan.getNode(root);
147148
for (Path childPath : childPaths) {
149+
LOGGER.debug("Processing child path={}",childPath);
148150
ResolvedReferenceField rrf = root.getDescendantReference(childPath);
149151
if(rrf!=null) {
150152
QueryPlanNode destNode = qplan.getNode(rrf.getReferencedMetadata());
151-
QueryPlanData qd = qplan.getEdgeData(sourceNode, destNode);
152-
if (qd == null) {
153-
qplan.setEdgeData(sourceNode, destNode, qd = qplan.newData());
154-
}
155-
qd.setReference(rrf);
156-
ReferenceField ref = rrf.getReferenceField();
157-
if (ref.getQuery() != null) {
158-
LOGGER.debug("Association query:{}", ref.getQuery());
159-
List<Conjunct> refQueryClauses = new ArrayList<>();
160-
rewriteQuery(ref.getQuery(), refQueryClauses, qplan, rrf);
161-
LOGGER.debug("Association query clauses:{}", refQueryClauses);
162-
assignQueriesToPlanNodesAndEdges(refQueryClauses, unassignedClauses);
163-
}
164-
iterateReferences(rrf.getReferencedMetadata(), unassignedClauses);
153+
if(destNode!=null) {
154+
QueryPlanData qd = qplan.getEdgeData(sourceNode, destNode);
155+
if (qd == null) {
156+
qplan.setEdgeData(sourceNode, destNode, qd = qplan.newData());
157+
}
158+
qd.setReference(rrf);
159+
ReferenceField ref = rrf.getReferenceField();
160+
if (ref.getQuery() != null) {
161+
LOGGER.debug("Association query:{}", ref.getQuery());
162+
List<Conjunct> refQueryClauses = new ArrayList<>();
163+
rewriteQuery(ref.getQuery(), refQueryClauses, qplan, rrf);
164+
LOGGER.debug("Association query clauses:{}", refQueryClauses);
165+
assignQueriesToPlanNodesAndEdges(refQueryClauses, unassignedClauses);
166+
}
167+
iterateReferences(rrf.getReferencedMetadata(), unassignedClauses);
168+
} // else, this destination entity is excluded in query plan
165169
} else
166170
throw new RuntimeException("Cannot retrieve descendant reference for "+childPath);
167171
}

crud/src/test/java/com/redhat/lightblue/mediator/CompositeFinderTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,17 @@ public void retrieveAandBonly() throws Exception {
245245
}
246246

247247
@Test
248+
public void retrieveAandB_noproject() throws Exception {
249+
FindRequest fr = new FindRequest();
250+
fr.setQuery(query("{'field':'obj1.c.*._id','op':'=','rvalue':'CDEEP2'}"));
251+
fr.setProjection(projection("[{'field':'*','recursive':1},{'field':'level1.arr1.*.ref'}]"));
252+
fr.setEntityVersion(new EntityVersion("A", "1.0.0"));
253+
Response response = mediator.find(fr);
254+
Assert.assertEquals(1, response.getEntityData().size());
255+
Assert.assertEquals("ADEEP2", response.getEntityData().get(0).get("_id").asText());
256+
}
257+
258+
248259
public void retrieveAandBonly_defaultVersion() throws Exception {
249260
FindRequest fr = new FindRequest();
250261
fr.setQuery(query("{'field':'_id','op':'=','rvalue':'A01'}"));

crud/src/test/resources/composite/A_data.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,23 @@
903903
]
904904
}
905905
},{
906+
"_id":"ADEEP2",
907+
"objectType":"A",
908+
"b_ref":"BNONP",
909+
"obj1":{
910+
"c_ref":"CDEEP2"
911+
},
912+
"level1": {
913+
"arr1": [
914+
{
915+
"b_ref":"B01"
916+
},
917+
{
918+
"b_ref":"B02"
919+
}
920+
]
921+
}
922+
},{
906923
"_id":"MANYB1",
907924
"objectType":"A",
908925
"nonid_b_ref":"MANYB1"

crud/src/test/resources/composite/B_data.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,5 +517,9 @@
517517
"_id":"BMANY4",
518518
"objectType":"B",
519519
"field1":"MANYB2"
520+
},{
521+
"_id":"BNONP",
522+
"objectType":"B",
523+
"field1":"BNONP"
520524
}
521525
]

crud/src/test/resources/composite/C_data.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,4 +448,13 @@
448448
"d_ref":"D50"
449449
},
450450
"b_ref":"B50"
451+
},{
452+
"_id":"CDEEP2",
453+
"objectType":"C",
454+
"field1":"-zcfIobvXmCmii5u8GdKaVAv3o7ax",
455+
"obj1":{
456+
"field1":"7w.ldg",
457+
"d_ref":"D50"
458+
},
459+
"b_ref":"B50"
451460
}]

metadata/src/main/java/com/redhat/lightblue/metadata/CompositeMetadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ public String toTreeString() {
185185
return bld.toString();
186186
}
187187

188+
@Override
189+
public String toString() {
190+
return toTreeString();
191+
}
192+
188193
/**
189194
* Returns the composite metadata containing the field pointed by the given
190195
* path

metadata/src/test/java/com/redhat/lightblue/metadata/AbstractGetMetadataTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,19 @@ public void query_b_in_A() throws Exception {
120120
Assert.assertNull(a.getChildMetadata(new Path("obj1.c")));
121121
}
122122

123+
@Test
124+
public void query_b_project_c() throws Exception {
125+
EntityMetadata md = getMd("composite/A.json");
126+
GMD gmd = new GMD();
127+
gmd.add(query("{'field':'b.*.field1','op':'=','rvalue':'x'}"));
128+
gmd.add(projection("[{'field':'*'},{'field':'obj1.c'}]"));
129+
CompositeMetadata a = CompositeMetadata.buildCompositeMetadata(md, gmd);
130+
131+
System.out.println(a.toTreeString());
132+
Assert.assertNotNull(a.getChildMetadata(new Path("b")));
133+
Assert.assertNotNull(a.getChildMetadata(new Path("obj1.c")));
134+
}
135+
123136
@Test
124137
public void query_b_and_c_in_A() throws Exception {
125138
EntityMetadata md = getMd("composite/A.json");

0 commit comments

Comments
 (0)