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

Reply via email to