Skip to content

Commit

Permalink
add range 0 support for path pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
[email protected] committed Apr 22, 2020
1 parent 46dc2bc commit 4f475d2
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,12 @@ private void addRelPattern(AtomicInteger counter, AsgQuery query, AsgEBase<Quant
.forEach(value -> {
//if value == 0 remove the RelPattern entirely
if(value==0) {
//todo remove RelPattern & EndPattern
//final AsgEBase<? extends EBase> simplifiedPath = AsgQueryUtil.remove(query,relPattern,endPattern);
// quantAsg.addNext(simplifiedPath);

//take the path after the end pattern section (if exists) & add it as no hop pattern to the Quant
if (endPattern.hasNext()) {
final AsgEBase<? extends EBase> nextAfterEndPattern = endPattern.getNext().get(0);
final AsgEBase<? extends EBase> afterEndPattern = AsgQueryUtil.deepCloneWithEnums(counter, nextAfterEndPattern, e -> true, e -> true);
quantAsg.addNext(afterEndPattern);
}
} else {
final AsgEBase<? extends EBase> relConcretePattern = addPath(counter, value, relPattern, endPattern);
//add the path after the end pattern section
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,41 @@ public void testUntypedToTypedStrategyWithoutQuantsInPath() {
Assert.assertTrue(queryValidator.validate(query).toString(),queryValidator.validate(query).valid());
Assert.assertNotNull(AsgQueryDescriptor.print(query));

}
@Test
public void testUntypedToTypedStrategyWithoutQuantsInPathWithRangeFromZero() {
Ontology.Accessor ont = new Ontology.Accessor(ontology);
AsgQuery query = AsgQuery.Builder.start("Q1", "Dragons")
.next(typed(1,OntologyTestUtils.PERSON.type))
.next(relPattern(2, OntologyTestUtils.OWN.getrType(), new Range(0, 3), R)
.below(relProp(10, RelProp.of(10, START_DATE.type, of(eq, new Date())))))
.next(endPattern(new EUntyped(3,tagSeq("end"),0,-1)))
.build();

RelationPatternRangeAsgStrategy strategy = new RelationPatternRangeAsgStrategy();
strategy.apply(query, new AsgStrategyContext(ont));

Optional<AsgEBase<Quant1>> quant = AsgQueryUtil.elements(query, Quant1.class).stream().filter(q -> q.geteBase().getqType().equals(QuantType.some)).findAny();
Assert.assertFalse(AsgQueryUtil.element(query, RelPattern.class).isPresent());
Assert.assertTrue(quant.isPresent());
Assert.assertEquals(3, quant.get().getNext().size());
Assert.assertEquals(1, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==3).count());
Assert.assertEquals(0, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==2).count());
Assert.assertEquals(3, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==1).count());

Assert.assertEquals(3, AsgQueryUtil.count(quant.get().getNext().get(0), EBase.class));
Assert.assertEquals(7, AsgQueryUtil.count(quant.get().getNext().get(1), EBase.class));
Assert.assertEquals(11, AsgQueryUtil.count(quant.get().getNext().get(2), EBase.class));

Assert.assertEquals(6, AsgQueryUtil.elements(query, Rel.class).stream().filter(r -> r.getB().size() == 1).count());
Assert.assertEquals(0, AsgQueryUtil.elements(query, RelProp.class).size());
Assert.assertEquals(6, AsgQueryUtil.elements(query, RelPropGroup.class).size());

Assert.assertEquals(0, AsgQueryUtil.elements(query, EProp.class).size());
Assert.assertEquals(0, AsgQueryUtil.elements(query, EPropGroup.class).size());
Assert.assertTrue(queryValidator.validate(query).toString(),queryValidator.validate(query).valid());
Assert.assertNotNull(AsgQueryDescriptor.print(query));

}

@Test
Expand Down Expand Up @@ -147,6 +182,46 @@ public void testUntypedToTypedWithPropsStrategyWithoutQuantsInPath() throws Exce
Assert.assertEquals(0, AsgQueryUtil.elements(query, EPropGroup.class).size());


Assert.assertTrue(queryValidator.validate(query).toString(),queryValidator.validate(query).valid());
Assert.assertNotNull(AsgQueryDescriptor.print(query));
}
@Test
public void testUntypedToTypedWithPropsStrategyWithoutQuantsInPathWithRangeFromZero() throws Exception {
Ontology.Accessor ont = new Ontology.Accessor(ontology);
AsgQuery query = AsgQuery.Builder.start("Q1", "Dragons")
.next(typed(1,OntologyTestUtils.PERSON.type))
.next(relPattern(2, OntologyTestUtils.KNOW.getrType(), new Range(0, 3), R)
.below(relProp(10, RelProp.of(10, START_DATE.type, of(eq, new Date())))))
.next(endPattern(new ETyped(3,tagSeq("end"), OntologyTestUtils.PERSON.type,0,-1)))
.next(eProp(4, OntologyTestUtils.FIRST_NAME.type, of(eq, "abc")))
.build();

RelationPatternRangeAsgStrategy strategy = new RelationPatternRangeAsgStrategy();
strategy.apply(query, new AsgStrategyContext(ont));

Optional<AsgEBase<Quant1>> quant = AsgQueryUtil.elements(query, Quant1.class).stream().filter(q -> q.geteBase().getqType().equals(QuantType.some)).findAny();
Assert.assertFalse(AsgQueryUtil.element(query, RelPattern.class).isPresent());
Assert.assertTrue(quant.isPresent());

Assert.assertEquals(4, quant.get().getNext().size());

Assert.assertEquals(1, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==4).count());
Assert.assertEquals(0, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==2).count());
Assert.assertEquals(3, AsgQueryUtil.elements(query, QuantBase.class).stream().filter(e->e.getNext().size()==1).count());

Assert.assertEquals(1, AsgQueryUtil.count(quant.get().getNext().get(0), EProp.class));
Assert.assertEquals(4, AsgQueryUtil.count(quant.get().getNext().get(1), EBase.class));
Assert.assertEquals(8, AsgQueryUtil.count(quant.get().getNext().get(2), EBase.class));
Assert.assertEquals(12, AsgQueryUtil.count(quant.get().getNext().get(3), EBase.class));

Assert.assertEquals(6, AsgQueryUtil.elements(query, Rel.class).stream().filter(r -> r.getB().size() == 1).count());
Assert.assertEquals(0, AsgQueryUtil.elements(query, RelProp.class).size());
Assert.assertEquals(6, AsgQueryUtil.elements(query, RelPropGroup.class).size());

Assert.assertEquals(4, AsgQueryUtil.elements(query, EProp.class).stream().filter(ep -> ep.geteBase().getCon().getOp().equals(eq)).count());
Assert.assertEquals(0, AsgQueryUtil.elements(query, EPropGroup.class).size());


Assert.assertTrue(queryValidator.validate(query).toString(),queryValidator.validate(query).valid());
Assert.assertNotNull(AsgQueryDescriptor.print(query));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public void testFindByConcretePathBuilderOneHop() throws IOException, Interrupte
new CreateForwardOnlyPathTraversalCursorRequest());

// Check Entity Response
Assert.assertEquals(0, pageData.getSize());
Assert.assertEquals(1, pageData.getSize());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,10 +212,6 @@ public AsgEBase<T> next(AsgEBase<? extends EBase> asgEBase) {
return this;
}

public AsgEBase<T> nextList(List<AsgEBase<? extends EBase>> elements) {
elements.forEach(this::addNextChild);
return this;
}

public void addNextChild(AsgEBase<? extends EBase> asgEBase) {
if (!this.next.contains(asgEBase)) {
Expand All @@ -224,6 +220,10 @@ public void addNextChild(AsgEBase<? extends EBase> asgEBase) {
asgEBase.addToParents(this);
}

public void addNextChild(List<AsgEBase<? extends EBase> >elements) {
elements.forEach(this::addNextChild);
}

public AsgEBase<T> below(AsgEBase<? extends EBase> asgEBase) {
addBChild(asgEBase);
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
import com.yangdb.fuse.model.Tagged;
import com.yangdb.fuse.model.query.EBase;
import com.yangdb.fuse.model.query.Rel;
import com.yangdb.fuse.model.query.RelPattern;
import com.yangdb.fuse.model.query.Start;
import com.yangdb.fuse.model.query.entity.EEntityBase;
import com.yangdb.fuse.model.query.entity.EndPattern;
Expand Down Expand Up @@ -823,7 +822,7 @@ public static void replace(AsgEBase source, AsgEBase target) {
}


public static int count(AsgEBase<? extends EBase> asgEBase, Class<EBase> aClass) {
public static int count(AsgEBase<? extends EBase> asgEBase, Class<? extends EBase> aClass) {
return elements(asgEBase, classPredicateFunction.apply(aClass)).size();
}

Expand All @@ -837,9 +836,28 @@ public static List<AsgEBase<? extends EBase>> mergePath(List<AsgEBase<? extends

}

public static AsgEBase<? extends EBase> remove(AsgQuery query, AsgEBase<? extends EBase> ... elements) {
//todo
throw new UnsupportedOperationException();
/**
* removes all elements from query
* @param query
* @param element
* @return
*/
public static AsgQuery remove(AsgQuery query, AsgEBase<? extends EBase> ... element) {
for (AsgEBase<? extends EBase> asgEBase : element) {
_remove(query, asgEBase);
}
return query;
}

private static void _remove(AsgQuery query, AsgEBase<? extends EBase> element) {
List<AsgEBase<? extends EBase>> newParents = new ArrayList<>(element.getParents());
newParents.forEach(p -> p.removeNextChild(element));
newParents.forEach(p -> p.addNextChild(element.getNext()));
//clean element
element.setParent(new ArrayList<>());
element.setNext(new ArrayList<>());
//clean query from element
query.getElements().remove(element);
}

public static class OptionalStrippedQuery {
Expand Down

0 comments on commit 4f475d2

Please sign in to comment.