Skip to content

Commit

Permalink
[s1ck#49] added functionality to convert complex time predicates into…
Browse files Browse the repository at this point in the history
… simple comparisons
  • Loading branch information
lc0197 committed Jun 15, 2020
1 parent 046afff commit 3572b9b
Show file tree
Hide file tree
Showing 27 changed files with 1,622 additions and 154 deletions.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<version>0.3.5-SNAPSHOT</version>



<name>GDL - Graph Definition Language</name>
<description>ANTLR Grammar for the definition of extended property graphs.</description>
<url>http://github.com/s1ck/gdl.git</url>
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/s1ck/gdl/GDLLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ public void exitGraph(GDLParser.GraphContext ctx) {
*/
@Override
public void exitQuery(GDLParser.QueryContext ctx) {
predicates = Predicate.unfoldTemporalComparisons(predicates);
for(Vertex v : vertices) {
addPredicates(Predicate.fromGraphElement(v, getDefaultVertexLabel()));
}
Expand Down
121 changes: 118 additions & 3 deletions src/main/java/org/s1ck/gdl/model/comparables/time/MaxTimePoint.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package org.s1ck.gdl.model.comparables.time;

import org.s1ck.gdl.model.predicates.Predicate;
import org.s1ck.gdl.model.predicates.booleans.And;
import org.s1ck.gdl.model.predicates.booleans.Not;
import org.s1ck.gdl.model.predicates.booleans.Or;
import org.s1ck.gdl.model.predicates.expressions.Comparison;
import org.s1ck.gdl.utils.Comparator;

import java.util.ArrayList;

/**
* Represents a MAX(p1,...,pn) term, where p1...pn are TimePoints
*/
Expand All @@ -22,8 +31,8 @@ public long evaluate(){
long mn = Long.MIN_VALUE;
for (TimePoint p:args){
long eval = p.evaluate();
if(eval==-1){
return -1;
if(eval== UNDEFINED){
return UNDEFINED;
}
if(eval > mn){
mn = eval;
Expand All @@ -38,7 +47,7 @@ public long getLowerBound(){
long res = Long.MIN_VALUE;
for (TimePoint p: args){
long val = p.getLowerBound();
if(val>-1 && val>res){
if(val!=UNDEFINED && val>res){
res = val;
}
}
Expand All @@ -61,4 +70,110 @@ public long getUpperBound(){
return res;
}

@Override
protected Predicate unfoldEQ(TimePoint arg){
//MAX(p1...pn) == x <=> exists pi: (pi>=p1 AND pi>=p2...AND pi>=pn) AND (pi==x)

// // the predicates (pi>=p1 AND pi>=p2...AND pi>=pn) AND (pi==x)
Predicate[] piPredicates = new Predicate[args.size()];
for(int i= 0; i<args.size(); i++){
// list of (pi>=p1), (pi>=p2),..., (pi>=pn)
ArrayList<Comparison> comparisons = new ArrayList<>();
for(int j=0; j<args.size(); j++){
if(j==i){
continue;
}
comparisons.add(new Comparison(args.get(i), Comparator.GTE, args.get(j)));
}
// conjoin (pi==x) with (pi>=p1 AND pi>=p2...AND pi>=pn)
And conj = new And(new Comparison(args.get(i), Comparator.EQ, arg),
comparisons.get(0));
for(int k=1; k<comparisons.size(); k++){
conj = new And(conj, comparisons.get(k));
}
piPredicates[i]=conj;
}
// disjunction over all ((pi>=p1 AND pi>=p2...AND pi>=pn) AND (pi==x))
Or result = new Or(piPredicates[0], piPredicates[1]);
for(int l=2; l<piPredicates.length; l++){
result = new Or(result, piPredicates[l]);
}
return result;
}

@Override
protected Predicate unfoldNEQ(TimePoint arg){
//MAX(p1...pn) != x <=> for all pi: (pi<p1 OR pi<p2...OR pi<pn) OR (pi!=x)

// the predicates (pi>p1 OR pi>p2...OR pi>pn) OR (pi!=x)
Predicate[] piPredicates = new Predicate[args.size()];
for(int i= 0; i<args.size(); i++){
// list of (pi<p1), (pi<p2),..., (pi<pn)
ArrayList<Comparison> comparisons = new ArrayList<>();
for(int j=0; j<args.size(); j++){
if(j==i){
continue;
}
comparisons.add(new Comparison(args.get(i), Comparator.LT, args.get(j)));
}
// disjunction of (pi!=x) and (pi>p1 OR pi>p2...OR pi>pn)
Or disj = new Or(new Comparison(args.get(i), Comparator.NEQ, arg),
comparisons.get(0));
for(int k=1; k<comparisons.size(); k++){
disj = new Or(disj, comparisons.get(k));
}
piPredicates[i]=disj;
}
// conjunction over all ((pi<p1 OR pi<p2...OR pi<pn) OR (pi!=x))
And result = new And(piPredicates[0], piPredicates[1]);
for(int l=2; l<piPredicates.length; l++){
result = new And(result, piPredicates[l]);
}
return result;
}

@Override
protected Predicate unfoldGT(TimePoint arg){
//MAX(p1...pn) > x <=> p1>x OR p2>x...OR pn>x
Or disjGt = new Or(new Comparison(args.get(0), Comparator.GT, arg),
new Comparison(args.get(1), Comparator.GT, arg));
for (int i=2; i<args.size(); i++){
disjGt = new Or(disjGt, new Comparison(args.get(i), Comparator.GT, arg));
}
return disjGt;
}

@Override
protected Predicate unfoldGTE(TimePoint arg){
//MAX(p1...pn) >= x <=> p1>=x OR p2>=x...OR pn>=x
Or disjGte = new Or(new Comparison(args.get(0), Comparator.GTE, arg),
new Comparison(args.get(1), Comparator.GTE, arg));
for(int i=2; i<args.size(); i++){
disjGte = new Or(disjGte, new Comparison(args.get(i), Comparator.GTE, arg));
}
return disjGte;
}

@Override
protected Predicate unfoldLT(TimePoint arg){
//MAX(p1...pn) < x <=> p1<x AND p2<x...AND pn<x
And disjGt = new And(new Comparison(args.get(0), Comparator.LT, arg),
new Comparison(args.get(1), Comparator.LT, arg));
for (int i=2; i<args.size(); i++){
disjGt = new And(disjGt, new Comparison(args.get(i), Comparator.LT, arg));
}
return disjGt;
}

@Override
protected Predicate unfoldLTE(TimePoint arg){
//MAX(p1...pn) <= x <=> p1<=x AND p2<=x...AND pn<=x
And disjGt = new And(new Comparison(args.get(0), Comparator.LTE, arg),
new Comparison(args.get(1), Comparator.LTE, arg));
for (int i=2; i<args.size(); i++){
disjGt = new And(disjGt, new Comparison(args.get(i), Comparator.LTE, arg));
}
return disjGt;
}

}
127 changes: 124 additions & 3 deletions src/main/java/org/s1ck/gdl/model/comparables/time/MinTimePoint.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package org.s1ck.gdl.model.comparables.time;

import org.s1ck.gdl.model.predicates.Predicate;
import org.s1ck.gdl.model.predicates.booleans.And;
import org.s1ck.gdl.model.predicates.booleans.Not;
import org.s1ck.gdl.model.predicates.booleans.Or;
import org.s1ck.gdl.model.predicates.expressions.Comparison;
import org.s1ck.gdl.utils.Comparator;

import java.util.ArrayList;

/**
* Represents a MAX(p1,...,pn) term, where p1...pn are TimePoints
*/
Expand All @@ -19,8 +28,8 @@ public long evaluate(){
long mn = Long.MAX_VALUE;
for (TimePoint p:args){
long eval = p.evaluate();
if (eval==-1){
return -1;
if (eval==UNDEFINED){
return UNDEFINED;
}
if (eval < mn){
mn = eval;
Expand Down Expand Up @@ -51,10 +60,122 @@ public long getUpperBound(){
long res = Long.MAX_VALUE;
for (TimePoint p: args){
long val = p.getUpperBound();
if(val>-1 && val < res){
if(val!=UNDEFINED && val < res){
res = val;
}
}
return res;
}

@Override
protected Predicate unfoldEQ(TimePoint arg){
//MIN(p1...pn) == x <=> exists pi: (pi<=p1 AND pi<=p2...AND pi<=pn) AND (pi==x)

// the predicates (pi<=p1 AND pi<=p2...AND pi<=pn) AND (pi==x)
Predicate[] piPredicates = new Predicate[args.size()];
for(int i= 0; i<args.size(); i++){
// list of (pi<=p1), (pi<=p2),..., (pi<=pn)
ArrayList<Comparison> comparisons = new ArrayList<>();
for(int j=0; j<args.size(); j++){
if(j==i){
continue;
}
comparisons.add(new Comparison(args.get(i), Comparator.LTE, args.get(j)));
}
// conjoin (pi==x) with (pi<=p1 AND pi<=p2...AND pi<=pn)
And conj = new And(new Comparison(args.get(i), Comparator.EQ, arg),
comparisons.get(0));
for(int k=1; k<comparisons.size(); k++){
conj = new And(conj, comparisons.get(k));
}
piPredicates[i]=conj;
}
// disjunction over all ((pi<=p1 AND pi<=p2...AND pi<=pn) AND (pi==x))
Or result = new Or(piPredicates[0], piPredicates[1]);
for(int l=2; l<piPredicates.length; l++){
result = new Or(result, piPredicates[l]);
}
return result;
}

@Override
protected Predicate unfoldNEQ(TimePoint arg){
// could be implemented as
//return new Not(unfoldEQ(arg));
// not done for simplicity (Nots will be eliminated for temporal predicates later)

//MIN(p1...pn) != x <=> for all pi: (pi>p1 OR pi>p2...OR pi>pn) OR (pi!=x)

// the predicates (pi>p1 OR pi>p2...OR pi>pn) OR (pi!=x)
Predicate[] piPredicates = new Predicate[args.size()];
for(int i= 0; i<args.size(); i++){
// list of (pi>p1), (pi>p2),..., (pi>pn)
ArrayList<Comparison> comparisons = new ArrayList<>();
for(int j=0; j<args.size(); j++){
if(j==i){
continue;
}
comparisons.add(new Comparison(args.get(i), Comparator.GT, args.get(j)));
}
// disjunction of (pi!=x) and (pi>p1 OR pi>p2...OR pi>pn)
Or disj = new Or(new Comparison(args.get(i), Comparator.NEQ, arg),
comparisons.get(0));
for(int k=1; k<comparisons.size(); k++){
disj = new Or(disj, comparisons.get(k));
}
piPredicates[i]=disj;
}
// conjunction over all ((pi>p1 OR pi>p2...OR pi>pn) OR (pi!=x))
And result = new And(piPredicates[0], piPredicates[1]);
for(int l=2; l<piPredicates.length; l++){
result = new And(result, piPredicates[l]);
}
return result;
}

@Override
protected Predicate unfoldGT(TimePoint arg){
//MIN(p1...pn) > x <=> p1>x AND p2>x...AND pn>x
And conjGt = new And(new Comparison(args.get(0), Comparator.GT, arg),
new Comparison(args.get(1), Comparator.GT, arg));
for (int i=2; i<args.size(); i++){
conjGt = new And(conjGt, new Comparison(args.get(i), Comparator.GT, arg));
}
return conjGt;
}

@Override
protected Predicate unfoldGTE(TimePoint arg){
//MIN(p1...pn) >= x <=> p1>=x AND p2>=x...AND pn>=x
And conjGte = new And(new Comparison(args.get(0), Comparator.GTE, arg),
new Comparison(args.get(1), Comparator.GTE, arg));
for(int i=2; i<args.size(); i++){
conjGte = new And(conjGte, new Comparison(args.get(i), Comparator.GTE, arg));
}
return conjGte;
}

@Override
protected Predicate unfoldLT(TimePoint arg){
//MIN(p1...pn) < x <=> p1<x OR p2<x ... OR pn<x
Or disjLt = new Or(new Comparison(args.get(0), Comparator.LT, arg),
new Comparison(args.get(1), Comparator.LT, arg));
for(int i=2; i<args.size(); i++){
disjLt = new Or(disjLt, new Comparison(args.get(i), Comparator.LT, arg));
}
return disjLt;
}

@Override
protected Predicate unfoldLTE(TimePoint arg){
//MIN(p1...pn) <= x <=> p1<=x OR p2<=x ... OR pn<=x
Or disjLte = new Or(new Comparison(args.get(0), Comparator.LTE, arg),
new Comparison(args.get(1), Comparator.LTE, arg));
for(int i=2; i<args.size(); i++){
disjLte = new Or(disjLte, new Comparison(args.get(i), Comparator.LTE, arg));
}
return disjLte;
}


}
Loading

0 comments on commit 3572b9b

Please sign in to comment.