Changeset: c14bec877931 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c14bec877931 Modified Files: monetdb5/extras/rdf/common/rdfjgraph.c monetdb5/extras/rdf/common/rdfjgraph.h sql/backends/monet5/sql.c sql/backends/monet5/sql_rdf_jgraph.c Branch: rdf Log Message:
Handling the case when join predicate is not equal cmp of s or o diffs (truncated from 422 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 @@ -81,13 +81,41 @@ void setNodeType(jgnode *node, JNodeT t) } +static +int existEdge(jgraph *jg, int from, int to){ + jgedge *nxtedge; + jgedge *tmpedge; + int exist = 0; + + jgnode *node = jg->lstnodes[from]; + + nxtedge = node->first; + while (nxtedge != NULL){ + tmpedge = nxtedge; + assert(tmpedge->from == node->vid); + if (tmpedge->to == to){ + exist = 1; + break; + } + nxtedge = nxtedge->next; + } + + return exist; +} + /* * We DO NOT check for the duplication when adding edge + * UPDATE: ADD checking for duplication * */ -void add_directedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id){ +void add_directedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id, int need_add_exps){ jgnode *fromnode; jgedge *edge; - + + if (existEdge(jg, from, to)){ + printf("The edge[%d,%d] is duplicated\n", from,to); + return; + } + edge = (jgedge *) malloc(sizeof(jgedge)); edge->from = from; edge->to = to; @@ -99,6 +127,7 @@ void add_directedJGedge(int from, int to edge->r_id = rel_id; edge->p_r_id = p_rel_id; edge->is_processed = 0; + edge->need_add_exps = need_add_exps; fromnode = jg->lstnodes[from]; @@ -169,10 +198,10 @@ void update_undirectededge_jp(jgraph *jg update_directededge_jp(jg, to, from, jp); } -void add_undirectedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id){ +void add_undirectedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id, int need_add_exps){ - add_directedJGedge(from, to, op, jg, data, jp, rel_id, p_rel_id); - add_directedJGedge(to, from, op, jg, data, jp, rel_id, p_rel_id); + add_directedJGedge(from, to, op, jg, data, jp, rel_id, p_rel_id, need_add_exps); + add_directedJGedge(to, from, op, jg, data, jp, rel_id, p_rel_id, need_add_exps); } @@ -211,15 +240,15 @@ void buildExampleJGraph(void){ for (i = 0; i < 5; i++){ addJGnode(&tmpid, jg, NULL, 0, BUN_NONE, BUN_NONE, NULL, 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); - add_undirectedJGedge(0, 4, op_join, jg, NULL, JP_NAV, -1, -1); + add_undirectedJGedge(0, 1, op_join, jg, NULL, JP_NAV, -1, -1, 0); + add_undirectedJGedge(0, 3, op_join, jg, NULL, JP_NAV, -1, -1, 0); + add_undirectedJGedge(0, 4, op_join, jg, NULL, JP_NAV, -1, -1, 0); - add_undirectedJGedge(1, 3, op_join, jg, NULL, JP_NAV, -1, -1); - add_undirectedJGedge(1, 2, op_join, jg, NULL, JP_NAV, -1, -1); + add_undirectedJGedge(1, 3, op_join, jg, NULL, JP_NAV, -1, -1, 0); + add_undirectedJGedge(1, 2, op_join, jg, NULL, JP_NAV, -1, -1, 0); - add_undirectedJGedge(2, 3, op_join, jg, NULL, JP_NAV, -1, -1); - add_undirectedJGedge(2, 4, op_join, jg, NULL, JP_NAV, -1, -1); + add_undirectedJGedge(2, 3, op_join, jg, NULL, JP_NAV, -1, -1, 0); + add_undirectedJGedge(2, 4, op_join, jg, NULL, JP_NAV, -1, -1, 0); printJGraph(jg); freeJGraph(jg); } 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 @@ -63,6 +63,8 @@ typedef struct jgedge { int p_r_id; //parent child join id int is_processed; //Keep state of the edge --> edge is already processed //and transformed + int need_add_exps; //All exps from rel->exps of this edge need to be added + //into the join predicate between patterns } jgedge; @@ -103,10 +105,10 @@ rdf_export void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, oid soid, oid poid, char *prop, 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); +void add_undirectedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id, int need_add_exps); rdf_export -void add_directedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id); +void add_directedJGedge(int from, int to, operator_type op, jgraph *jg, void *data, JP jp, int rel_id, int p_rel_id, int need_add_exps); rdf_export void update_undirectededge_jp(jgraph *jg, int from, int to, JP jp); diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -130,7 +130,7 @@ sql_symbol2relation(mvc *c, symbol *sym) if (1) c->emode = m_normal; - if (0) c->emod = mod_explain; + if (1) c->emod = mod_explain; } } else { 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 @@ -482,7 +482,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]\n", from, to, fromnode->patternId, tonode->patternId, lstEdges[orders[i]]->r_id, lstEdges[orders[i]]->p_r_id); + 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); } return orders; @@ -516,12 +516,13 @@ void _add_jg_node(mvc *c, jgraph *jg, sq //running structural recognition process) so that //we can directly get its oid from TKNR TKNRstringToOid(&poid, &prop); - GDKfree(prop); assert (poid != BUN_NONE); } } addJGnode(&tmpvid, jg, rel, subjgId, soid, poid, prop, t); + + if (prop) GDKfree(prop); } /* Example @@ -567,7 +568,7 @@ list* remove_p_from_proj_exps(mvc *c, li * * */ 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){ +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 *hasOuter){ switch (rel->op) { case op_right: @@ -575,7 +576,10 @@ void addRelationsToJG(mvc *c, sql_rel *p break; case op_left: case op_join: - if (rel->op == op_left || rel->op == op_right) printf("[Outter join]\n"); + if (rel->op == op_left || rel->op == op_right){ + printf("[Outter join]\n"); + *hasOuter = 1; + } else printf("[join]\n"); printf("--- Between %s and %s ---\n", op2string(((sql_rel *)rel->l)->op), op2string(((sql_rel *)rel->r)->op) ); @@ -584,8 +588,8 @@ void addRelationsToJG(mvc *c, sql_rel *p *subjgId = *subjgId + 1; } - addRelationsToJG(c, rel, rel->l, depth+1, jg, 0, subjgId, level, tmp_level + 1, node_root); - addRelationsToJG(c, rel, rel->r, depth+1, jg, 0, subjgId, level, tmp_level + 1, node_root); + addRelationsToJG(c, rel, rel->l, depth+1, jg, 0, subjgId, level, tmp_level + 1, node_root, hasOuter); + addRelationsToJG(c, rel, rel->r, depth+1, jg, 0, subjgId, level, tmp_level + 1, node_root, hasOuter); break; case op_select: @@ -599,7 +603,7 @@ void addRelationsToJG(mvc *c, sql_rel *p _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); + addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root, hasOuter); } break; case op_basetable: @@ -616,9 +620,9 @@ void addRelationsToJG(mvc *c, sql_rel *p rel->exps = remove_p_from_proj_exps(c, rel->exps); if (rel->l) - addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root); + addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root, hasOuter); if (rel->r) - addRelationsToJG(c, rel, rel->r, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root); + addRelationsToJG(c, rel, rel->r, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root, hasOuter); break; case op_union: printf("[union] ==> Handling differently\n"); @@ -629,9 +633,9 @@ void addRelationsToJG(mvc *c, sql_rel *p default: printf("[%s]\n", op2string(rel->op)); if (rel->l) - addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root); + addRelationsToJG(c, rel, rel->l, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root, hasOuter); if (rel->r) - addRelationsToJG(c, rel, rel->r, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root); + addRelationsToJG(c, rel, rel->r, depth+1, jg, 1, subjgId, level, tmp_level + 1, node_root, hasOuter); break; } @@ -857,6 +861,20 @@ int have_same_subj(jgraph *jg, int from, else return 0; } +static +void connect_same_subj_node(jgraph *jg){ + int nnode = jg->nNode; + + for (int from = 0; from < nnode; from++){ + for (int to = (from + 1); to < nnode; to++){ + if (have_same_subj(jg, from, to) == 1){ + JP tmpjp = JP_S; + add_undirectedJGedge(from, to, op_join, jg, NULL, tmpjp, -1, -1, 0); + } + } + } +} + /* * Input: sql_rel with op == op_join, op_left or op_right * */ @@ -865,6 +883,7 @@ void _add_join_edges(jgraph *jg, sql_rel sql_exp *tmpexp; list *tmpexps; + int need_add_exps = 0; assert(rel->op == op_join || rel->op == op_left || rel->op == op_right); tmpexps = rel->exps; @@ -888,8 +907,45 @@ void _add_join_edges(jgraph *jg, sql_rel //About the case "oid[s14_t4.o] < sys.sql_add(s14_t3.o, oid "120@0")" //e.g., q5 bsbm, just ignore - if (l->type != e_column && r->type != e_column) continue; - + if (l->type != e_column && r->type != e_column){ + JP tmpjp = JP_NAV; + sql_exp *tmp = NULL; + list *lst = NULL; + node *tmpen = NULL; + + (void) tmpjp; + assert(l->type == e_convert); + assert(r->type == e_func); + + lst = r->l; + tmpen = lst->h; + + //There can be two parameters in the list, however, we only need to check + //the first one --> s14_t3.o in the example + tmp = (sql_exp *) tmpen->data; + + assert(tmp->type == e_column); + + from = rname_to_nodeId(nm, ((sql_exp *)l->l)->rname); + + to = rname_to_nodeId(nm, tmp->rname); + + assert(rel->op == op_join); + + printf("Add edge between patterns from node %d to node %d\n", from, to); + if (need_add_exps == 0){ + need_add_exps = 1; + add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjp, rel_id, p_rel_id, 1); + } else { + add_undirectedJGedge(from, to, rel->op, jg, rel, tmpjp, rel_id, p_rel_id, 0); + } + + continue; + + } + + + //For normal case assert(l->type == e_column); assert(r->type == e_column); printf("Join: [Table]%s.[Column]%s == [Table]%s.[Column]%s \n", l->rname, l->name, r->rname, r->name); @@ -900,12 +956,12 @@ void _add_join_edges(jgraph *jg, sql_rel JP tmpjp = JP_NAV; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list