Changeset: 8ff2256bbdba for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ff2256bbdba Modified Files: monetdb5/extras/rdf/common/rdfjgraph.c monetdb5/extras/rdf/common/rdfjgraph.h sql/backends/monet5/sql_rdf_jgraph.c Branch: rdf Log Message:
Fix the problems of computing inner join groups diffs (truncated from 374 to 300 lines): diff --git a/monetdb5/extras/rdf/common/rdfjgraph.c b/monetdb5/extras/rdf/common/rdfjgraph.c --- a/monetdb5/extras/rdf/common/rdfjgraph.c +++ b/monetdb5/extras/rdf/common/rdfjgraph.c @@ -52,7 +52,7 @@ jgraph* initJGraph(void){ return jg; } -void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, JNodeT t){ +void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, oid _soid, JNodeT t){ jgnode *node = (jgnode *) malloc(sizeof(jgnode)); node->vid = jg->nNode; @@ -64,6 +64,7 @@ void addJGnode(int *vid, jgraph *jg, voi node->subjgId = subjgId; node->patternId = -1; node->ijpatternId = -1; + node->soid = _soid; node->type = t; jg->lstnodes[jg->nNode] = node; @@ -204,7 +205,7 @@ void buildExampleJGraph(void){ jgraph *jg = initJGraph(); for (i = 0; i < 5; i++){ - addJGnode(&tmpid, jg, NULL, 0, JN_REQUIRED); + addJGnode(&tmpid, jg, NULL, 0, BUN_NONE, JN_REQUIRED); } add_undirectedJGedge(0, 1, op_join, jg, NULL, JP_NAV, -1, -1); add_undirectedJGedge(0, 3, op_join, jg, NULL, JP_NAV, -1, -1); 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 @@ -79,7 +79,8 @@ typedef struct jgnode { int subjgId; int patternId; //For star pattern int ijpatternId; //Id of inner join subgraph for nodes connected - //only by inner join in the star pattern + //only by inner join in the star patter + oid soid; //Oid of the subject if it is already known JNodeT type; //This node can be optional, or required in the pattern } jgnode; @@ -97,7 +98,7 @@ rdf_export void freeJGraph(jgraph *jg); //Free join graph rdf_export -void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, JNodeT type); +void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, oid soid, JNodeT type); rdf_export void add_undirectedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id); 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 @@ -154,6 +154,8 @@ void addRelationsToJG(mvc *sql, sql_rel * Get the table from rdf schema * */ +static void get_predicate_from_exps(mvc *c, list *tmpexps, char **prop, char **subj, int get_subject_only); + static sql_table* get_rdf_table(mvc *c, char *tblname){ sql_table *tbl = NULL; @@ -467,6 +469,30 @@ int* get_crossedge_apply_orders(jgraph * return orders; } + +static +void _add_jg_node(mvc *c, jgraph *jg, sql_rel *rel, int subjgId, JNodeT t){ + int tmpvid = -1; + str subj = NULL; + oid soid = BUN_NONE; + + //Set subject oid if it is there + if (rel->op==op_select){ + //Check whether there is constrainst on s_oid + list *exps = rel->exps; + + if (exps){ + get_predicate_from_exps(c, exps, NULL, &subj, 1); + } + if (subj){ + SQLrdfstrtoid(&soid, &subj); + assert (soid != BUN_NONE); + } + } + + addJGnode(&tmpvid, jg, rel, subjgId, soid, t); +} + /* * Algorithm for adding sql rels to Join Graph * @@ -480,7 +506,6 @@ int* get_crossedge_apply_orders(jgraph * * */ static void addRelationsToJG(mvc *c, sql_rel *parent, sql_rel *rel, int depth, jgraph *jg, int new_subjg, int *subjgId, int *level, int tmp_level, sql_rel **node_root){ - int tmpvid =-1; switch (rel->op) { case op_right: @@ -509,7 +534,7 @@ void addRelationsToJG(mvc *c, sql_rel *p *level = tmp_level; *node_root = parent; } - addJGnode(&tmpvid, jg, (sql_rel *) rel, *subjgId, JN_REQUIRED); + _add_jg_node(c, jg, (sql_rel *) rel, *subjgId, JN_REQUIRED); } else{ //This is the connect to a new join sg addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root); @@ -521,7 +546,7 @@ void addRelationsToJG(mvc *c, sql_rel *p *level = tmp_level; *node_root = parent; } - addJGnode(&tmpvid, jg, (sql_rel *) rel, *subjgId, JN_REQUIRED); + _add_jg_node(c, jg, (sql_rel *) rel, *subjgId, JN_REQUIRED); break; default: printf("[%s]\n", op2string(rel->op)); @@ -697,6 +722,19 @@ void get_jp(str pred1, str pred2, JP *jp } +static +int have_same_subj(jgraph *jg, int from, int to){ + + jgnode *fromnode, *tonode; + + fromnode = jg->lstnodes[from]; + tonode = jg->lstnodes[to]; + + if ((fromnode->soid != BUN_NONE) && (fromnode->soid == tonode->soid)) return 1; + + else return 0; +} + /* * Input: sql_rel with op == op_join, op_left or op_right * */ @@ -708,6 +746,11 @@ void _add_join_edges(jgraph *jg, sql_rel assert(rel->op == op_join || rel->op == op_left || rel->op == op_right); tmpexps = rel->exps; + + if (rel->op == op_left){ + printf("Add Join Edge via LEFT JOIN: \n"); + } + if (tmpexps){ node *en; @@ -751,6 +794,7 @@ void _add_join_edges(jgraph *jg, sql_rel //TODO: Handle other cases int tmpCond; int from, to; + JP tmpjg = JP_NAV; assert(tmpexp->l); assert(atom_type(tmpexp->l)->type->localtype != TYPE_ptr); tmpCond = (int) atom_get_int(tmpexp->l); @@ -759,8 +803,11 @@ void _add_join_edges(jgraph *jg, sql_rel printf("Join (condition 1) between %s and %s\n", rel_name((sql_rel*) rel->l), rel_name((sql_rel *)rel->r)); from = rname_to_nodeId(nm, rel_name((sql_rel*) rel->l)); to = rname_to_nodeId(nm, rel_name((sql_rel*) rel->r)); - if (rel->op == op_join) add_undirectedJGedge(from, to, rel->op, jg, rel, JP_NAV, rel_id, p_rel_id); - else if (rel->op == op_left) add_directedJGedge(from, to, op_left, jg, rel, JP_NAV, rel_id, p_rel_id); + if (have_same_subj(jg, from, to) == 1){ + tmpjg = JP_S; + } + if (rel->op == op_join) add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjg, rel_id, p_rel_id); + else if (rel->op == op_left) add_directedJGedge(from, to, op_left, jg, rel, tmpjg, rel_id, p_rel_id); else assert(0); //Other case is not handled yet printf("From: %d To %d\n", from, to); @@ -774,13 +821,33 @@ void _add_join_edges(jgraph *jg, sql_rel } printf("\n\n\n"); } + else{ + str relname1; + str relname2; + int from, to; + JP tmpjp = JP_S; + + relname1 = rel_name((sql_rel*) rel->l); + relname2 = rel_name((sql_rel*) rel->r); + + printf("CROSS PRODUCT HERE between %s and %s\n", relname1, relname2); + + assert (rel->op == op_join); + + from = rname_to_nodeId(nm, relname1); + to = rname_to_nodeId(nm, relname2); + + if (have_same_subj(jg, from, to) == 1){ + printf("Connect to nodes having known subjects\n"); + add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjp, rel_id, p_rel_id); + } + } } static void addJoinEdgesToJG(mvc *c, sql_rel *parent, sql_rel *rel, int depth, jgraph *jg, int new_subjg, int *subjgId, nMap *nm, char **isConnect, int *last_rel_join_id, int p_rel_id, int *level, int tmp_level, sql_rel **edge_root){ - //int tmpvid =-1; int tmp_r_id; switch (rel->op) { @@ -929,18 +996,14 @@ void _detect_star_pattern(jgraph *jg, jg //and the to_node does not belong to //any pattern, add to the current pattern - //Khi kiem tra xem co cung pattern khong co the dua vao - //subject trong truong hop subject biet roi. - //Consider query 2 - jgedge *tmpedge; tmpedge = node->first; while (tmpedge != NULL){ if (tmpedge->jp == JP_S){ int optm = _optm; - int tonode_ijpatternId = node->ijpatternId; jgnode *tonode = jg->lstnodes[tmpedge->to]; + /* if (tmpedge->op == op_left){ //left outer join optm = 1; tonode_ijpatternId++; @@ -948,10 +1011,10 @@ void _detect_star_pattern(jgraph *jg, jg else if (tmpedge->op == op_right){ assert(0); //Have not handle this case } + */ if (tonode->patternId == -1){ tonode->patternId = pId; - tonode->ijpatternId = tonode_ijpatternId; if (optm == 1) setNodeType(tonode, JN_OPTIONAL); @@ -1145,7 +1208,7 @@ void extractURI_from_exp(mvc *c, char ** * * */ static -void get_predicate_from_exps(mvc *c, list *tmpexps, char **prop, char **subj){ +void get_predicate_from_exps(mvc *c, list *tmpexps, char **prop, char **subj, int get_subject_only){ node *en; @@ -1167,8 +1230,8 @@ void get_predicate_from_exps(mvc *c, lis //Check if the column name is p, then //extract the input property name if (strcmp(colexp->name, "p") == 0){ - num_p_cond++; + if (get_subject_only) continue; extractURI_from_exp(c, prop, (sql_exp *)tmpexp->r); //In case the column name is not in the abstract table, add it if (0) add_abstract_column(c, *prop); @@ -1182,7 +1245,8 @@ void get_predicate_from_exps(mvc *c, lis } - assert(num_p_cond == 1 && (*prop) != NULL); //Verify that there is only one p in this op_select sql_rel + if (!get_subject_only) + assert(num_p_cond == 1 && (*prop) != NULL); //Verify that there is only one p in this op_select sql_rel } @@ -1222,7 +1286,7 @@ void extract_prop_and_subj_from_exps(mvc //Get the column name by checking exps of r tmpexps = r->exps; if (tmpexps){ - get_predicate_from_exps(c, tmpexps, prop, subj); + get_predicate_from_exps(c, tmpexps, prop, subj, 0); } } @@ -1898,7 +1962,7 @@ sql_rel* transform_inner_join_subjg (mvc tmpexps = tmprel->exps; - if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, &subj); + if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, &subj, 0); //After having prop, get the corresponding column name @@ -2034,7 +2098,7 @@ sql_rel* build_rdfscan (mvc *c, jgraph * tmpexps = tmprel->exps; - if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, &subj); + if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, &subj, 0); //After having prop, get the corresponding column name @@ -2424,6 +2488,48 @@ void get_union_expr(mvc *c, sql_rel *r, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list