Changeset: 069413ef63e2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=069413ef63e2
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:

More code refinement


diffs (truncated from 494 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, oid _soid, 
JNodeT t){
+void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, oid _soid, oid 
_poid, char *prop, JNodeT t){
 
        jgnode *node = (jgnode *) malloc(sizeof(jgnode)); 
        node->vid = jg->nNode; 
@@ -65,6 +65,10 @@ void addJGnode(int *vid, jgraph *jg, voi
        node->patternId = -1; 
        node->ijpatternId = -1;
        node->soid = _soid; 
+       node->poid = _poid; 
+       if (prop) node->prop = GDKstrdup(prop);
+       else  node->prop = NULL; 
+
        node->type = t;
        
        jg->lstnodes[jg->nNode] = node; 
@@ -205,7 +209,7 @@ void buildExampleJGraph(void){
        jgraph *jg = initJGraph(); 
 
        for (i = 0; i < 5; i++){
-               addJGnode(&tmpid, jg, NULL, 0, BUN_NONE,  JN_REQUIRED); 
+               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); 
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
@@ -81,6 +81,8 @@ typedef struct jgnode {
        int ijpatternId;                //Id of inner join subgraph for nodes 
connected 
                                        //only by inner join in the star patter
        oid soid;                       //Oid of the subject if it is already 
known
+       oid poid;                       //Oid of the predicate if it is already 
known (usually Yes)
+       str prop;                       //Store the original name of the prop
        JNodeT type;                    //This node can be optional, or 
required in the pattern
 } jgnode; 
 
@@ -98,7 +100,7 @@ rdf_export
 void freeJGraph(jgraph *jg);           //Free join graph
 
 rdf_export
-void addJGnode(int *vid, jgraph *jg, void *data, int subjgId, oid soid, JNodeT 
type); 
+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);
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
@@ -474,7 +474,9 @@ static
 void _add_jg_node(mvc *c, jgraph *jg, sql_rel *rel, int subjgId, JNodeT t){
        int tmpvid = -1;
        str subj = NULL; 
+       str prop = NULL; 
        oid soid = BUN_NONE; 
+       oid poid = BUN_NONE; 
 
        //Set subject oid if it is there
        if (rel->op==op_select){
@@ -482,15 +484,24 @@ void _add_jg_node(mvc *c, jgraph *jg, sq
                list *exps = rel->exps; 
 
                if (exps){
-                       get_predicate_from_exps(c, exps, NULL, &subj, 1);
+                       get_predicate_from_exps(c, exps, &prop , &subj, 0);
                }
                if (subj){
                        SQLrdfstrtoid(&soid, &subj);
                        assert (soid != BUN_NONE); 
                }
+               if (prop){
+                       
+                       //Get propId, assuming the tokenizer is open already 
+                       //Note that, the prop oid is the original one (before
+                       //running structural recognition process) so that 
+                       //we can directly get its oid from TKNR
+                       TKNRstringToOid(&poid, &prop); 
+                       assert (poid != BUN_NONE); 
+               }
        }
 
-       addJGnode(&tmpvid, jg, rel, subjgId, soid, t);
+       addJGnode(&tmpvid, jg, rel, subjgId, soid, poid, prop, t);
 }
 
 /*
@@ -1051,37 +1062,29 @@ spProps *init_sp_props(int num){
 }
 
 static
-void add_props_to_spprops(spProps *spprops, int idx, sp_po po, char *col){
-       oid id; 
-
-       spprops->lstProps[idx] = GDKstrdup(col); 
-
-       //Get propId, assuming the tokenizer is open already 
-       //Note that, the prop oid is the original one (before
-       //running structural recognition process) so that 
-       //we can directly get its oid from TKNR
-       TKNRstringToOid(&id, & (spprops->lstProps[idx])); 
-       spprops->lstPropIds[idx] = id;  
+void add_props_and_subj_to_spprops(spProps *spprops, int idx, sp_po po, jgnode 
*node){
+
+       if (node->prop){
+               spprops->lstProps[idx] = GDKstrdup(node->prop); 
+               assert(node->poid != BUN_NONE); 
+               spprops->lstPropIds[idx] = node->poid; 
+               spprops->lstPOs[idx] = po;
+
+               //without any information, assuming that the column is 
single-valued col
+               spprops->lstctype[idx] = CTYPE_SG; 
+       }
        
-       spprops->lstPOs[idx] = po; 
+       //For subject
+       if (node->soid){
+               if (spprops->subj == BUN_NONE){
+                       spprops->subj = node->soid; 
+               }
+               else
+                       assert(spprops->subj == node->soid); 
+       }
+}
+
        
-       //without any information, assuming that the column is single-valued col
-       spprops->lstctype[idx] = CTYPE_SG; 
-}
-
-static
-void add_subj_to_spprops(spProps *spprops, char *subj){
-       oid soid = BUN_NONE;
-       
-       SQLrdfstrtoid(&soid, &subj); 
-
-       if (spprops->subj == BUN_NONE){
-               spprops->subj = soid; 
-       }
-       else
-               assert(spprops->subj == soid); 
-
-}
 
 static
 void print_spprops(spProps *spprops){
@@ -1257,7 +1260,7 @@ void get_predicate_from_exps(mvc *c, lis
  *
  * */
 static
-void extract_prop_and_subj_from_exps(mvc *c, sql_rel *r, char **prop, char 
**subj){
+void verify_rel(sql_rel *r){
        
        list *tmpexps = NULL; 
        char select_s = 0, select_p = 0, select_o = 0; 
@@ -1282,12 +1285,6 @@ void extract_prop_and_subj_from_exps(mvc
        }
 
        assert(select_s && select_p && select_o);
-       
-       //Get the column name by checking exps of r
-       tmpexps = r->exps;
-       if (tmpexps){
-               get_predicate_from_exps(c, tmpexps, prop, subj, 0); 
-       }
 }
 
 
@@ -1949,25 +1946,19 @@ sql_rel* transform_inner_join_subjg (mvc
        
        
        for (i = 0; i < nnode; i++){
-               sql_rel *tmprel = (sql_rel*) (jg->lstnodes[jsg[i]]->data);
+               jgnode *tmpnode = jg->lstnodes[jsg[i]];
+               sql_rel *tmprel = (sql_rel*) (tmpnode->data);
                int colIdx; 
                int isMVcol = 0; 
-               list *tmpexps = NULL; 
-               str prop; 
-               str subj;
                oid tmpPropId;
 
                assert(tmprel->op == op_select);
                assert(((sql_rel*)tmprel->l)->op == op_basetable); 
-
-               tmpexps = tmprel->exps;
-
-               if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, &subj, 
0);
-
-               //After having prop, get the corresponding column name
-
-               TKNRstringToOid(&tmpPropId, &prop);
-
+               
+               tmpPropId = tmpnode->poid; 
+
+               assert(tmpPropId != BUN_NONE); 
+       
                colIdx = getColIdx_from_oid(tId, global_csset, tmpPropId);
 
                //Check whether the column is multi-valued prop
@@ -2049,7 +2040,7 @@ sql_rel* transform_inner_join_subjg (mvc
  *  - sp_prj_exps stores all the columns should be selected in the "original 
order" 
  * */
 static
-sql_rel* build_rdfscan (mvc *c, jgraph *jg, int tId, int ncol, int nijgroup, 
int **ijgroup, int *nnodes_per_ijgroup){
+sql_rel* build_rdfexception (mvc *c, jgraph *jg, int tId, int ncol, int 
nijgroup, int **ijgroup, int *nnodes_per_ijgroup){
 
        sql_rel *rel_rdfscan = NULL;
        str tblname; 
@@ -2085,24 +2076,115 @@ sql_rel* build_rdfscan (mvc *c, jgraph *
        for (gr = 0; gr < nijgroup; gr++){
                for (i = 0; i < nnodes_per_ijgroup[gr]; i++){
                        int nodeid = ijgroup[gr][i];
-                       sql_rel *tmprel = (sql_rel*) 
(jg->lstnodes[nodeid]->data);
+                       jgnode *tmpnode = jg->lstnodes[nodeid];
+                       sql_rel *tmprel = (sql_rel*) (tmpnode->data);
                        int colIdx; 
                        int isMVcol = 0; 
-                       list *tmpexps = NULL; 
-                       str prop; 
-                       str subj;
                        oid tmpPropId;
 
                        assert(tmprel->op == op_select);
                        assert(((sql_rel*)tmprel->l)->op == op_basetable); 
 
-                       tmpexps = tmprel->exps;
-
-                       if (tmpexps) get_predicate_from_exps(c, tmpexps, &prop, 
&subj, 0);
-
-                       //After having prop, get the corresponding column name
-
-                       TKNRstringToOid(&tmpPropId, &prop);
+                       tmpPropId = tmpnode->poid; 
+
+                       colIdx = getColIdx_from_oid(tId, global_csset, 
tmpPropId);
+
+                       //Check whether the column is multi-valued prop
+                       isMVcol = isMVCol(tId, colIdx, global_csset);
+
+                       //Only for RDFscan, otherwise we need to handle 
Multi-valued prop
+                       tranforms_exps(c, tmprel, trans_select_exps, 
trans_table_exps, tblname, colIdx, tmpPropId, &atblname, &asubjcolname, NULL, 
NULL, 0); 
+
+                       if (isMVcol == 0){
+                               num_nonMV_col++; 
+                       }
+                       else{
+                               num_mv_col++;
+                       }
+               }
+       }
+       
+       sprintf(tmp, "[RDFscan] select exprs: "); 
+       exps_print_ext(c, trans_select_exps, 0, tmp);
+       sprintf(tmp, "          base table expression: \n"); 
+       exps_print_ext(c, trans_table_exps, 0, tmp);    
+
+
+
+       rel_basetbl = rel_basetable(c, get_rdf_table(c,tblname), tblname); 
+
+       rel_basetbl->exps = trans_table_exps;
+
+       if (num_mv_col > 0) r_r_prop->containMV = 1; 
+       
+       rel_rdfscan = rel_rdfscan_create(c->sa, rel_basetbl, trans_select_exps, 
r_r_prop); 
+
+       
+       list_destroy(trans_select_exps);
+
+       return rel_rdfscan; 
+
+}
+
+
+/*
+ * Input: 
+ * - A sub-join graph (jsg) that all nodes are connected by using inner join
+ * - The table (tId) that the node belongs to has been identified 
+ *   (The table corresponding to the star pattern is known)
+ * 
+ * Output: 
+ *  - A select from a relational table with list of columns. Or a join between
+ *  select from a table and mv_table if there is mv prop. 
+ *  - sp_prj_exps stores all the columns should be selected in the "original 
order" 
+ * */
+static
+sql_rel* build_rdfscan (mvc *c, jgraph *jg, int tId, int ncol, int nijgroup, 
int **ijgroup, int *nnodes_per_ijgroup){
+
+       sql_rel *rel_rdfscan = NULL;
+       str tblname; 
+       oid tblnameoid;
+       str atblname = NULL;            //alias for table of sp
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to