IITDBGroup / gprom

GProM is a middleware that adds support for provenance to database backends.
http://www.cs.iit.edu/%7edbgroup/research/gprom.php
Apache License 2.0
8 stars 5 forks source link

Merging datalog rules #95

Open manips2002 opened 1 year ago

manips2002 commented 1 year ago
TPCQ15: 
PROGRAM:
        q(s_suppkey,s_name,s_address,s_phone,rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),q1(s_suppkey,rev),q2(rev).
        rp(x1,x2,x3,x4,x5) :- rtpcq15(x1,x2,x3,x4,x5).
        q1(l_suppkey,sum((l_extp * (1 - l_discount)))) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),((l_shipdate >= '1996-01-01')),((l_shipdate < '1996-04-01')).
        q2(max(rev)) :- q1(q1,rev).
        prov_q1(s_suppkey,rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),q1(s_suppkey,rev),q2(rev),rp(s_suppkey,s_name,s_address,s_phone,rev).
        prov_q1(q1,rev) :- q1(q1,rev),prov_q2(V1).
        prov_q2(rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),q1(s_suppkey,rev),q2(rev),rp(s_suppkey,s_name,s_address,s_phone,rev).
        prov_lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),((l_shipdate >= '1996-01-01')),((l_shipdate < '1996-04-01')),prov_q1(l_suppkey,V1).
ANSWER RELATION:
        prov_lineitem

INFO(datalog_model.c:453) Program after merging subqueries:

PROGRAM:
        prov_lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),((l_shipdate >= '1996-01-01')),((l_shipdate < '1996-04-01')),supplier(l_suppkey,V2,V3,V4,V5,V6,V7),@q1(l_suppkey,v1),@q2(v1),rtpcq15(l_suppkey,V2,V3,V5,v1).
        prov_lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),((l_shipdate >= '1996-01-01')),((l_shipdate < '1996-04-01')),@q1(l_suppkey,v1),supplier(V1,V2,V3,V4,V5,V6,V7),@q1(V1,V2),@q2(V2),rtpcq15(V1,V2,V3,V5,V2).
        q1(l_suppkey,sum((l_extp * (1 - l_discount)))) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),((l_shipdate >= '1996-01-01')),((l_shipdate < '1996-04-01')).
        q2(max(rev)) :- @q1(q1,rev).
ANSWER RELATION:
        prov_lineitem
FDS:
        supplier: s_suppkey->s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment
        lineitem: l_orderkey, l_linenumber->l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
lordpretzel commented 1 year ago

all queries run, but without semantic optimization we get an empty result.

q(s_suppkey,s_name,s_address,s_phone,rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),
q1(s_suppkey,rev),
q2(rev).

rp(x1,x2,x3,x4,x5) :- rtpcq15(x1,x2,x3,x4,x5).

q1(l_suppkey,sum((l_extp * (1 - l_discount)))) :- lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),
((l_shipdate >= '1996-01-01')),
((l_shipdate < '1996-04-01')).

q2(max(rev)) :- q1(q1,rev).

prov_q1(s_suppkey,rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),
                          q1(s_suppkey,rev),
                          q2(rev),
                          rp(s_suppkey,s_name,s_address,s_phone,rev).

prov_q1(q1,rev) :- q1(q1,rev),
                   prov_q2(V1).

prov_q2(rev) :- supplier(s_suppkey,s_name,s_address,s1,s_phone,s2,s3),
                q1(s_suppkey,rev),
                q2(rev),
                rp(s_suppkey,s_name,s_address,s_phone,rev).

prov_lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12) :-
    lineitem(l1,l2,l_suppkey,l3,l4,l_extp,l_discount,l5,l6,l7,l_shipdate,l8,l9,l10,l11,l12),
    ((l_shipdate >= '1996-01-01')),                                                                                                
    ((l_shipdate < '1996-04-01')),
    prov_q1(l_suppkey,V1).