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