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