Skip to content

Commit

Permalink
[s1ck#49] implemented between and precedes
Browse files Browse the repository at this point in the history
  • Loading branch information
lc0197 committed Jun 15, 2020
1 parent 61187f9 commit 75f4aad
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/main/antlr4/org/s1ck/gdl/GDL.g4
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ intervalFunc
: overlapsIntervallOperator
| asOfOperator
| fromToOperator
| betweenOperator
| precedesOperator
;
overlapsIntervallOperator
: 'overlaps(' interval ')'
Expand All @@ -196,10 +198,19 @@ fromToOperator
: 'fromTo(' timePoint ',' timePoint ')'
;

betweenOperator
: 'between(' timePoint ',' timePoint ')'
;

precedesOperator
: 'precedes(' interval ')'
;

stampFunc
: beforePointOperator
| afterPointOperator
| asOfOperator
| precedesOperator
;

beforePointOperator
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/org/s1ck/gdl/GDLLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,12 @@ else if(intervalFunc.asOfOperator()!=null){
else if(intervalFunc.fromToOperator()!=null){
return createFromToPredicates(from, to, intervalFunc.fromToOperator());
}
else if(intervalFunc.betweenOperator()!=null){
return createBetweenPredicates(from, to, intervalFunc.betweenOperator());
}
else if(intervalFunc.precedesOperator()!=null){
return createPrecedesPredicates(to, intervalFunc.precedesOperator());
}
return null;
}

Expand Down Expand Up @@ -477,6 +483,36 @@ private Predicate createFromToPredicates(TimePoint from, TimePoint to, GDLParser
);
}

/**
* Creates a predicate a.between(x,y) = a.from<=y AND a.to>x
* @param from from value of the calling interval
* @param to to value of the calling interval
* @param ctx context of the call, containing x and y
* @return between predicate
*/
private Predicate createBetweenPredicates(TimePoint from, TimePoint to, GDLParser.BetweenOperatorContext ctx){
TimePoint x = buildTimePoint(ctx.timePoint(0));
TimePoint y = buildTimePoint(ctx.timePoint(1));
return new And(
new Comparison(from, Comparator.LTE, y),
new Comparison(to, Comparator.GT, x)
);
}

/**
* Creates a predicate a.precedes(b) = a <= b.
* Function is used for interval and timestamp function {@code precedes}, as they both
* only compare two time stamps
* @param point the time stamp of the caller to compare
* @param ctx the context containing the value to be compared
* @return precedes predicate
*/
private Predicate createPrecedesPredicates(TimePoint point, GDLParser.PrecedesOperatorContext ctx){
TimePoint[] arg = buildIntervall(ctx.interval());
TimePoint arg_from = arg[0];
return new Comparison(point, Comparator.LTE, arg_from);
}

/**
* Creates an array {@code {from, to}} representing an intervall.
* @param ctx context from which to derive {@code from} and {@code to}
Expand Down Expand Up @@ -541,6 +577,9 @@ else if(stampFunc.beforePointOperator()!=null) {
else if(stampFunc.afterPointOperator()!=null){
return createAfterPredicates(tp, stampFunc.afterPointOperator());
}
else if(stampFunc.precedesOperator()!=null){
return createPrecedesPredicates(tp, stampFunc.precedesOperator());
}
return null;
}

Expand Down
33 changes: 33 additions & 0 deletions src/test/java/org/s1ck/gdl/GDLLoaderTemporalTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,39 @@ public void fromToTest(){
assertEquals(result.toString(), expected.toString());
}

@Test
public void betweenTest(){
GDLLoader loader = getLoaderFromGDLString("MATCH (a)-->(b) " +
"WHERE a.tx.between(b.tx_from, 2020-04-28T10:39:15)");
Predicate result = loader.getPredicates().get();
Predicate expected = new And(
new Comparison(
new TimeSelector("a", TimeSelector.TimeField.TX_FROM),
Comparator.LTE,
new TimeLiteral("2020-04-28T10:39:15")
),
new Comparison(
new TimeSelector("a", TimeSelector.TimeField.TX_TO),
Comparator.GT,
new TimeSelector("b", TimeSelector.TimeField.TX_FROM)
)
).switchSides();
assertEquals(result.toString(), expected.toString());
}

@Test
public void precedesTest(){
GDLLoader loader = getLoaderFromGDLString("MATCH (a)-->(b) " +
"WHERE a.tx.precedes(b.val)");
Predicate result = loader.getPredicates().get();
Predicate expected = new Comparison(
new TimeSelector("a", TimeSelector.TimeField.TX_TO),
Comparator.LTE,
new TimeSelector("b", TimeSelector.TimeField.VAL_FROM)
).switchSides();
assertEquals(result.toString(), expected.toString());
}

@Test
public void graphTimeStampTest(){

Expand Down

0 comments on commit 75f4aad

Please sign in to comment.