Changeset: b47c74b43a16 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b47c74b43a16
Modified Files:
        sql/backends/monet5/sql_rdf.c
        sql/backends/monet5/sql_rdf.h
        sql/backends/monet5/sql_rdf.mal
        sql/backends/monet5/sql_rdf_jgraph.c
        sql/server/rel_rdfscan.c
        sql/server/rel_rdfscan.h
Branch: rdf
Log Message:

2nd Optimization in Handling exception

SELECTION pushdown


diffs (237 lines):

diff --git a/sql/backends/monet5/sql_rdf.c b/sql/backends/monet5/sql_rdf.c
--- a/sql/backends/monet5/sql_rdf.c
+++ b/sql/backends/monet5/sql_rdf.c
@@ -1506,7 +1506,7 @@ bat2return(MalStkPtr stk, InstrPtr pci, 
 
 
 static
-void get_full_outerjoin_p_slices(oid *lstprops, int np, BAT *full_obat, BAT 
*full_sbat, BAT **r_sbat, BAT ***r_obats){
+void get_full_outerjoin_p_slices(oid *lstprops, int np, oid *los, oid *his, 
BAT *full_obat, BAT *full_sbat, BAT **r_sbat, BAT ***r_obats){
 
        BAT **obats, **sbats; 
        int i; 
@@ -1516,8 +1516,8 @@ void get_full_outerjoin_p_slices(oid *ls
        (*r_obats) = (BAT**)malloc(sizeof(BAT*) * np);
 
        for (i = 0; i < np; i++){
-               getSlides_per_P(pso_propstat, &(lstprops[i]),full_obat, 
full_sbat, &(obats[i]), &(sbats[i])); 
-               printf("Slides of P = "BUNFMT "\n", lstprops[i]);
+               getSlides_per_P(pso_propstat, &(lstprops[i]), los[i], his[i], 
full_obat, full_sbat, &(obats[i]), &(sbats[i])); 
+               printf("Slides of P = "BUNFMT " with o constraints from 
"BUNFMT" to " BUNFMT"\n", lstprops[i], los[i], his[i]);
                if (sbats[i]){
                        printf("   contains "BUNFMT " rows in sbat\n", 
BATcount(sbats[i]));
                        //BATprint(sbats[i]);
@@ -1801,6 +1801,11 @@ SQLrdfScan(Client cntxt, MalBlkPtr mb, M
        int *nP = NULL;         //Number of props
        int *nRP = NULL;        
        oid *lstProps = NULL; 
+       
+       //Constraints for o values
+       oid *los = NULL; 
+       oid *his = NULL; 
+
        int i;
        //int *lstbattypes = NULL; 
        clock_t sT; 
@@ -1823,9 +1828,17 @@ SQLrdfScan(Client cntxt, MalBlkPtr mb, M
                
        b = (BAT **) GDKmalloc (sizeof (BAT*) * pci->retc); 
        lstProps = (oid *)GDKmalloc(sizeof(oid) * (*nP)); 
+       los = (oid *)GDKmalloc(sizeof(oid) * (*nP));
+       his = (oid *)GDKmalloc(sizeof(oid) * (*nP));
+
        for (i = 0; i < (*nP); i++){
                oid *tmpp = (oid *) getArgReference(stk, pci, pci->retc + 2 + 
i);
+               oid *lo = (oid *) getArgReference(stk, pci, pci->retc + 2 + 
(*nP) + i);
+               oid *hi = (oid *) getArgReference(stk, pci, pci->retc + 2 + 2 * 
(*nP) + i);
+
                lstProps[i] = *tmpp; 
+               los[i] = *lo; 
+               his[i] = *hi; 
        }
        
        for (i = 0; i < pci->retc; i++){
@@ -1860,7 +1873,7 @@ SQLrdfScan(Client cntxt, MalBlkPtr mb, M
                pso_fullSbat = mvc_bind(m, schema, "pso", "s",0);
                pso_fullObat = mvc_bind(m, schema, "pso", "o",0);
 
-               get_full_outerjoin_p_slices(lstProps, *nP, pso_fullObat, 
pso_fullSbat, &r_sbat, &r_obats);
+               get_full_outerjoin_p_slices(lstProps, *nP, los, his, 
pso_fullObat, pso_fullSbat, &r_sbat, &r_obats);
 
                eT1 = clock(); 
                printf("Step 1 in Handling exception took  %f seconds.\n", 
((float)(eT1 - sT1))/CLOCKS_PER_SEC);
@@ -2087,16 +2100,45 @@ void getOffsets(PsoPropStat *pso_pstat, 
        }
 }
 
-void getSlides_per_P(PsoPropStat *pso_pstat, oid *p, BAT *obat, BAT *sbat, BAT 
**ret_oBat, BAT **ret_sBat){
+/*
+ * Get slide of PSO for an input P with lower bound constraint (lo_cst) and 
upper bound constraint (hi_cst)
+ * */
+void getSlides_per_P(PsoPropStat *pso_pstat, oid *p, oid lo_cst, oid hi_cst, 
BAT *obat, BAT *sbat, BAT **ret_oBat, BAT **ret_sBat){
        BUN l, h;       
-       
        getOffsets(pso_pstat, p, &l, &h); 
        
        if (l != BUN_NONE){
-               *ret_oBat = BATslice(obat, l, h+1); 
+               BAT *tmp_o = NULL, *tmp_s = NULL; 
+               oid lo, hi; 
+               tmp_o = BATslice(obat, l, h+1); 
 
-               *ret_sBat = BATslice(sbat, l, h+1); 
-               (*ret_sBat)->tsorted = true; 
+               tmp_s = BATslice(sbat, l, h+1); 
+               
+               #if RDF_HANDLING_EXCEPTION_SELECTPUSHDOWN_OPT
+                       if (lo_cst == BUN_NONE && hi_cst == BUN_NONE){  //No 
constraint
+                               *ret_oBat =  tmp_o; 
+                               *ret_sBat = tmp_s; 
+                       } else {        
+                               if (lo_cst == BUN_NONE){
+                                       lo = oid_nil; 
+                                       hi = hi_cst; 
+                               } else if (hi_cst == BUN_NONE){
+                                       lo = lo_cst; 
+                                       hi = oid_nil; 
+                               
+                               } else {        //Have both lower and upper 
bounds
+                                       lo = lo_cst; 
+                                       hi = hi_cst; 
+                               }
+                               //BATsubselect(inputbat, <dont know yet>, 
lowValue, Highvalue, isIncludeLowValue, isIncludeHigh, <anti> 
+                               *ret_oBat = BATsubselect(tmp_o, NULL, &lo, &hi, 
1, 1, 0); 
+                               *ret_sBat = BATproject(*ret_oBat, tmp_s); 
+                       }
+               #else
+                       *ret_oBat =  tmp_o; 
+                       *ret_sBat = tmp_s; 
+               #endif
+               (*ret_sBat)->tsorted = true;
        } else {
                *ret_oBat = NULL;
                *ret_sBat = NULL; 
@@ -2118,6 +2160,9 @@ void build_PsoPropStat(BAT *full_pbat, i
        int batsize = 150000; 
        pi = bat_iterator(full_pbat); 
 
+       (void) full_sbat; 
+       (void) full_obat;
+
        batsize = maxNumP;      //Can be smaller
 
        pso_propstat = (PsoPropStat *) GDKmalloc(sizeof(PsoPropStat)); 
@@ -2139,14 +2184,6 @@ void build_PsoPropStat(BAT *full_pbat, i
        printf("Number of P in PSO is: "BUNFMT"\n", 
BATcount(pso_propstat->pBat)); 
        //BATprint(pso_propstat->pBat); 
        //BATprint(pso_propstat->offsetBat); 
-       if (0)          //Testing only 
-       {
-               int np = 5; 
-               oid lstprops[5] = {100, 200, 400, 500, 700} ; 
-               BAT *r_sbat, **r_obats; 
-               get_full_outerjoin_p_slices(&(lstprops[0]), np, full_obat, 
full_sbat, &r_sbat, &r_obats); 
-               
-       }
        
 }
                                
diff --git a/sql/backends/monet5/sql_rdf.h b/sql/backends/monet5/sql_rdf.h
--- a/sql/backends/monet5/sql_rdf.h
+++ b/sql/backends/monet5/sql_rdf.h
@@ -56,7 +56,7 @@ sql5_export void getMvTblSQLname(char *t
 sql5_export str SQLrdfScan_old(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLrdfScan(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
-sql5_export void getSlides_per_P(PsoPropStat *pso_pstat, oid *prop, BAT *obat, 
BAT *sbat, BAT **ret_oBat, BAT **ret_sBat); 
+sql5_export void getSlides_per_P(PsoPropStat *pso_pstat, oid *p, oid low, oid 
hi, BAT *obat, BAT *sbat, BAT **ret_oBat, BAT **ret_sBat); 
 
 extern SimpleCSset *global_csset; 
 extern PropStat *global_p_propstat;
@@ -72,4 +72,6 @@ extern PsoPropStat *pso_propstat;
 
 #define RDF_HANDLING_EXCEPTION_MISSINGPROP_OPT 1
 
+#define RDF_HANDLING_EXCEPTION_SELECTPUSHDOWN_OPT 1
+
 #endif /*_SQL_RDF_H */
diff --git a/sql/backends/monet5/sql_rdf.mal b/sql/backends/monet5/sql_rdf.mal
--- a/sql/backends/monet5/sql_rdf.mal
+++ b/sql/backends/monet5/sql_rdf.mal
@@ -58,7 +58,7 @@ command rdfstrtoid(urlstr:str):oid
 address        SQLrdfstrtoid
 comment "Convert from string to encoded id";
 
-#pattern rdfscan{unsafe}(nprop:int, x:bat[:oid, :oid])(:bat[:oid,:any]...)
+#x:oid contains list of property, their lower bound, their upper bound (if 
these bounds exist)
 pattern rdfscan{unsafe}(nprop:int, nrqrop:int, x:oid...)(:bat[:oid,:any]...)
 address SQLrdfScan
 comment "RDFscan operator which return results from exceptional values";
diff --git a/sql/backends/monet5/sql_rdf_jgraph.c 
b/sql/backends/monet5/sql_rdf_jgraph.c
--- a/sql/backends/monet5/sql_rdf_jgraph.c
+++ b/sql/backends/monet5/sql_rdf_jgraph.c
@@ -2382,6 +2382,10 @@ sql_rel* build_rdfexception (mvc *c, int
        sql_table *tbl; 
        list *trans_select_exps = NULL; 
        list *trans_base_exps = NULL; 
+
+       //Constraints for o values
+       oid *los; 
+       oid *his; 
        
        printf("Get real expressions from tableId %d\n", tId);
 
@@ -2436,7 +2440,14 @@ sql_rel* build_rdfexception (mvc *c, int
        
        if (0) rel_rdfscan = rel_rdfscan_create(c->sa, rel_basetbl, 
trans_select_exps, NULL); 
 
-       rel_rdfscan = rel_rdfscan_func(c, tbl, spprops->num, 
nnodes_per_ijgroup[0], spprops->lstPropIds); 
+       los = (oid *) malloc(sizeof(oid) * spprops->num);
+       his = (oid *) malloc(sizeof(oid) * spprops->num);
+       for (i = 0; i < spprops->num; i++){
+               los[i] = spprops->lst_o_constraints[i].low;
+               his[i] = spprops->lst_o_constraints[i].hi;
+       }
+ 
+       rel_rdfscan = rel_rdfscan_func(c, tbl, spprops->num, 
nnodes_per_ijgroup[0], spprops->lstPropIds, los, his); 
        
        printf("\nRDFSCAN \n");
        _rel_print(c, rel_rdfscan);
diff --git a/sql/server/rel_rdfscan.c b/sql/server/rel_rdfscan.c
--- a/sql/server/rel_rdfscan.c
+++ b/sql/server/rel_rdfscan.c
@@ -91,7 +91,7 @@ table_column_types(sql_allocator *sa, sq
 }
 
 sql_rel *
-rel_rdfscan_func(mvc *sql, sql_table *t, int numprop, int nRP, oid *lstprop)
+rel_rdfscan_func(mvc *sql, sql_table *t, int numprop, int nRP, oid *lstprop, 
oid *los, oid *his)
 {
        sql_rel *res;
        list *exps, *args;
@@ -112,6 +112,13 @@ rel_rdfscan_func(mvc *sql, sql_table *t,
        for (i = 0; i < numprop; i++){
                append(args, exp_atom_oid(sql->sa, lstprop[i]));        
        }
+       for (i = 0; i < numprop; i++){
+               append(args, exp_atom_oid(sql->sa, los[i]));
+       }
+       
+       for (i = 0; i < numprop; i++){
+               append(args, exp_atom_oid(sql->sa, his[i]));
+       }
 
        import = exp_op(sql->sa, args, f); 
        
diff --git a/sql/server/rel_rdfscan.h b/sql/server/rel_rdfscan.h
--- a/sql/server/rel_rdfscan.h
+++ b/sql/server/rel_rdfscan.h
@@ -18,7 +18,7 @@ extern void free_rdf_rel_prop(rdf_rel_pr
 
 extern rdf_rel_prop *init_rdf_rel_prop(int ncol, int n_ijgroup, int 
*nnodes_per_ijgroup); 
 
-extern sql_rel *rel_rdfscan_func(mvc *sql, sql_table *t, int numprop, int 
numRP, oid *lstprops); 
+extern sql_rel *rel_rdfscan_func(mvc *sql, sql_table *t, int numprop, int 
numRP, oid *lstprops, oid *los, oid *his); 
 
 
 #endif /*_REL_RDFSCAN_H_*/
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to