Changeset: b1e0105a70e9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b1e0105a70e9 Modified Files: monetdb5/extras/rdf/common/rdfjgraph.h monetdb5/extras/rdf/rdfschema.c monetdb5/extras/rdf/rdftypes.c sql/backends/monet5/sql_rdf.c sql/backends/monet5/sql_rdf_jgraph.c sql/server/rel_optimizer.c Branch: rdf Log Message:
- Simply predicates of atom True. This works for lubm queries, but still need to verify with BSBM queries 2 and 5. - When joining two star patterns, remove all experessions whose the left or right relation does not belong to any of these pattern. - When transforming the query plan replace all the rdf function e.g., rdf_strtoid, rdf_timetoid by the exact oid value diffs (truncated from 493 to 300 lines): diff --git a/monetdb5/extras/rdf/common/rdfjgraph.h b/monetdb5/extras/rdf/common/rdfjgraph.h --- a/monetdb5/extras/rdf/common/rdfjgraph.h +++ b/monetdb5/extras/rdf/common/rdfjgraph.h @@ -42,7 +42,8 @@ typedef enum JoinPredicate { //Join pr JP_S, //Join on S JP_P, JP_O, - JP_SO //Join on both S and O + JP_SO, //Join on both S and O + JP_CP //Cross Product } JP; typedef enum JNodeType { diff --git a/monetdb5/extras/rdf/rdfschema.c b/monetdb5/extras/rdf/rdfschema.c --- a/monetdb5/extras/rdf/rdfschema.c +++ b/monetdb5/extras/rdf/rdfschema.c @@ -10482,6 +10482,7 @@ void getRealValue(ValPtr returnValue, oi //printf("objOid = " BUNFMT " \n",objOid); if (objType == URI || objType == BLANKNODE){ oid oldoid = objOid; + (void) oldoid; objOid = objOid - ((oid)objType << (sizeof(BUN)*8 - 4)); assert(oldoid == objOid); diff --git a/monetdb5/extras/rdf/rdftypes.c b/monetdb5/extras/rdf/rdftypes.c --- a/monetdb5/extras/rdf/rdftypes.c +++ b/monetdb5/extras/rdf/rdftypes.c @@ -587,7 +587,7 @@ encodeValueInOid(ValPtr vrPtrRealValue, } static ObjectType getObjType_fromValRec(ValRecord v){ - ObjectType objT; + ObjectType objT = URI; switch (v.vtype){ case TYPE_bte: case TYPE_sht: @@ -605,8 +605,10 @@ static ObjectType getObjType_fromValRec( break; case TYPE_str: //Have not handle this case assert(0); + break; default: assert(0); + break; } return objT; 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 @@ -1484,6 +1484,8 @@ SQLrdftimetoid(oid *ret, str *datetime){ lng tmp = BUN_NONE; ValRecord vrec; + printf("SQLrdftimetoid: %s\n", *datetime); + convertDateTimeToLong(*datetime, &tmp); VALset(&vrec,TYPE_lng, &tmp); @@ -2114,6 +2116,7 @@ SQLrdfScan(Client cntxt, MalBlkPtr mb, M nRet = 2 * (*nP); (void) nRP; + (void) nRet; assert (pci->retc == nRet); 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 @@ -155,6 +155,7 @@ void addRelationsToJG(mvc *sql, sql_rel * */ static void get_predicate_from_exps(mvc *c, list *tmpexps, char **prop, char **subj, int get_subject_only); +static sql_exp* get_atom_oid(mvc *c, sql_exp *re); static sql_table* get_rdf_table(mvc *c, char *tblname){ @@ -468,19 +469,50 @@ int* get_crossedge_apply_orders(jgraph * for (i = 0; i < num; i++){ orders[i] = i; } - + + //Put all JP_CP to end for (i = 0; i < num; i++){ jgedge *e1 = lstEdges[orders[i]]; for (j = i+1; j < num; j++){ jgedge *e2 = lstEdges[orders[j]]; - if (e1->p_r_id < e2->p_r_id){ + if (e1->jp == JP_CP && e2->jp != JP_CP){ tmp = orders[i]; orders[i] = orders[j]; orders[j] = tmp; } + } } + //Order by p_r_id + for (i = 0; i < num; i++){ + jgedge *e1 = lstEdges[orders[i]]; + for (j = i+1; j < num; j++){ + jgedge *e2 = lstEdges[orders[j]]; + + if (e1->jp != JP_CP && e2->jp != JP_CP && e1->p_r_id < e2->p_r_id){ + tmp = orders[i]; + orders[i] = orders[j]; + orders[j] = tmp; + } + + } + } + + //Order by need_add_exps + for (i = 0; i < num; i++){ + jgedge *e1 = lstEdges[orders[i]]; + for (j = i+1; j < num; j++){ + jgedge *e2 = lstEdges[orders[j]]; + if (e1->jp != JP_CP && e2->jp != JP_CP && e1->p_r_id == e2->p_r_id && e2->need_add_exps > e1->need_add_exps){ + tmp = orders[i]; + orders[i] = orders[j]; + orders[j] = tmp; + } + + } + } + #if PRINT_FOR_DEBUG printf("Orders of applying cross edges\n"); for (i = 0; i < num; i++){ @@ -488,7 +520,7 @@ int* get_crossedge_apply_orders(jgraph * int to = lstEdges[orders[i]]->to; jgnode *fromnode = jg->lstnodes[from]; jgnode *tonode = jg->lstnodes[to]; - printf("Cross edge [%d, %d][P%d -> P%d] [r = %d, p = %d][Exp_Need = %d]\n", from, to, fromnode->patternId, tonode->patternId, lstEdges[orders[i]]->r_id, lstEdges[orders[i]]->p_r_id, lstEdges[orders[i]]->need_add_exps); + printf("Cross edge [%d, %d][P%d -> P%d] [r = %d, p = %d][Exp_Need = %d][JP = %d]\n", from, to, fromnode->patternId, tonode->patternId, lstEdges[orders[i]]->r_id, lstEdges[orders[i]]->p_r_id, lstEdges[orders[i]]->need_add_exps, lstEdges[orders[i]]->jp); } #endif @@ -691,8 +723,14 @@ void handling_Union(mvc *c, sql_rel *rel case op_union: assert (rel->l && rel->r); *hasUnion = 1; + printf("Left Union: ===Before====\n"); + _rel_print(c, rel->l); buildJoinGraph(c, rel->l, depth + 1); + printf("Left Union: ===After=====\n"); + _rel_print(c, rel->l); buildJoinGraph(c, rel->r, depth + 1); + printf("Right Union: =======\n"); + _rel_print(c, rel->r); break; default: if (rel->l) @@ -1113,6 +1151,10 @@ void _add_join_edges(jgraph *jg, sql_rel printf("Connect to nodes having known subjects\n"); #endif add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjp, rel_id, p_rel_id, 0); + } + else { + tmpjp = JP_CP; + add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjp, rel_id, p_rel_id, 0); } } @@ -1408,25 +1450,6 @@ void free_sp_props(spProps *spprops){ } -static -sql_exp* get_atom_oid(mvc *c, sql_exp *re){ - oid newoid; - atom *at = re->l; - sql_exp *newre = NULL; - - newoid = BUN_NONE; - assert(at != NULL); - - #if PRINT_FOR_DEBUG - printf("Atom expression \n"); - exp_print(c, THRdata[0] , re, 0,0,0); - #endif - - get_encodedOid_from_atom(at, &newoid); - newre = exp_atom_oid(c->sa, newoid); - - return newre; -} /* * Get column name from exp of p in a sql_rel * Example: s12_t0.p = oid[sys.rdf_strtoid(char(67) "<http://www/product>")] @@ -1494,11 +1517,13 @@ void modify_exp_col(mvc *c, sql_exp *m_e #if EVERYTHING_AS_OID //first: Convert the compared value into oid + /* if (re->type == e_atom){ newre = get_atom_oid(c, re); } else { newre = exp_convert(c->sa, m_exp->r, exp_fromtype(le), &totype); - } + }*/ + newre = get_atom_oid(c, re); #else newre = exp_convert(c->sa, m_exp->r, exp_fromtype(le), &totype); #endif @@ -1524,11 +1549,13 @@ void extractURI_from_exp(mvc *c, char ** list *lst = NULL; char *funcname; + (void) funcname; + assert(exp->type == e_func); funcname = ((sql_subfunc *)exp->f)->func->base.name; - assert(strcmp(funcname, "rdf_strtoid") == 0); + assert(strcmp(funcname, "rdf_strtoid") == 0 || strcmp(funcname, "rdf_timetoid") == 0); lst = exp->l; @@ -1545,11 +1572,8 @@ void extractURI_from_exp(mvc *c, char ** } static -void get_o_constraint_value(mvc *c, sql_exp *m_exp, oid *tmpvalue){ +void get_o_constraint_value(mvc *c, sql_exp *re, oid *tmpvalue){ oid newoid; - sql_exp *re = m_exp->r; - - assert(m_exp->type == e_cmp); //first: Convert the compared value into oid newoid = BUN_NONE; @@ -1569,8 +1593,12 @@ void get_o_constraint_value(mvc *c, sql_ SQLrdfstrtoid(&newoid, &uri); assert (newoid != BUN_NONE); - } else if (strcmp(funcname, "rdf_timetoid") != 0){ - printf("TODO: The function %s is not handled yet\n", funcname); + } else if (strcmp(funcname, "rdf_timetoid") == 0){ + extractURI_from_exp(c, &uri, re); + SQLrdftimetoid(&newoid, &uri); + assert (newoid != BUN_NONE); + } else { + printf("This function %s is not handled yet\n",funcname); } if (!uri) GDKfree(uri); @@ -1582,6 +1610,19 @@ void get_o_constraint_value(mvc *c, sql_ } +static +sql_exp* get_atom_oid(mvc *c, sql_exp *re){ + oid newoid; + sql_exp *newre = NULL; + + newoid = BUN_NONE; + + get_o_constraint_value(c, re, &newoid); + + newre = exp_atom_oid(c->sa, newoid); + + return newre; +} /* * //Example: [s12_t0.p = oid[sys.rdf_strtoid(char(67) "<http://www/product>")], s12_t0.o = oid[sys.rdf_strtoid(char(85) "<http://www/Product9>"] @@ -1654,6 +1695,9 @@ void verify_rel(sql_rel *r){ assert(r->op == op_select); assert(((sql_rel*)r->l)->op == op_basetable); + (void) select_s; + (void) select_p; + (void) select_o; //Verify that this select function select all three columns s, p, o tmpexps = ((sql_rel*)r->l)->exps; @@ -1689,7 +1733,8 @@ void get_o_constraint(mvc *c, o_constrai if (strcmp(e->name, "o") == 0){ int cmp = get_cmp(tmpexp); oid tmp_o_value = BUN_NONE; - get_o_constraint_value(c, tmpexp, &tmp_o_value); + assert(tmpexp->type == e_cmp); + get_o_constraint_value(c, tmpexp->r, &tmp_o_value); o_cst->cmp_type = cmp; @@ -2977,9 +3022,39 @@ sql_rel* build_rdfscan (mvc *c, jgraph * #endif +//Check whether an experession +//is formed by 2 relaltions belonging to +//the inner join groups that are going to be connected +static +int is_in_ijgroups(const char *rname1, const char *rname2, + int *group1, int nnode1, int *group2, int nnode2, nMap *nm){ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list