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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list