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

Reply via email to