Changeset: e42c210c2f2c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e42c210c2f2c
Modified Files:
        sql/backends/monet5/sql_rdf_jgraph.c
Branch: rdf
Log Message:

Use the right functions to create sql_exp of sys.or and sys.ifthenelse


diffs (282 lines):

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
@@ -323,6 +323,37 @@ void exps_print_ext(mvc *sql, list *exps
 }
        
 
+/*
+static 
+list *single_exp_list(sql_allocator *sa, sql_exp *e){
+       list *lst = NULL; 
+       lst = new_exp_list(sa);
+
+       append(lst, e); 
+
+       return lst; 
+}
+*/
+
+/*
+ * Return sys.isnull(e)
+ * Right now, it is more like e = null
+ * */
+static 
+sql_exp* exp_isnull(mvc *sql, sql_exp *e){
+       sql_exp *isnull_exp = rel_unop_(sql, e, NULL, "isnull", card_value);
+       return isnull_exp; 
+}
+
+static 
+sql_exp* exp_isnotnull(mvc *sql, sql_exp *e){
+       sql_exp *isnull_exp = rel_unop_(sql, e, NULL, "isnull", card_value);
+       sql_exp *not_exp = exp_atom_bool(sql->sa, 0);
+       
+       sql_exp *isnotnull_exp = exp_compare(sql->sa, isnull_exp, not_exp, 
cmp_equal);
+
+       return isnotnull_exp; 
+}
 
 static
 void printRel_JGraph(jgraph *jg, mvc *sql){
@@ -1197,13 +1228,14 @@ void extract_prop_and_subj_from_exps(mvc
 
 
 static
-void tranforms_exps(mvc *c, sql_rel *r, list *trans_select_exps, list 
*trans_tbl_exps, str tblname, int colIdx, oid tmpPropId, str *atblname, str 
*asubjcolname, list *sp_prj_exps, list *base_column_exps){
+void tranforms_exps(mvc *c, sql_rel *r, list *trans_select_exps, list 
*trans_tbl_exps, str tblname, int colIdx, oid tmpPropId, str *atblname, str 
*asubjcolname, list *sp_prj_exps, list *base_column_exps, int isOptionalGroup){
 
        list *tmpexps = NULL; 
        list *tmp_tbl_exps = NULL; 
        sql_allocator *sa = c->sa; 
        char tmpcolname[100]; //TODO: Should we use char[]
        sql_rel *tbl_rel = NULL;
+       int isConstrain_o = 0; 
        
        printf("Converting op_select in star pattern to sql_rel of 
corresponding table\n"); 
        //Get the column name by checking exps of r
@@ -1236,11 +1268,11 @@ void tranforms_exps(mvc *c, sql_rel *r, 
 
                        } else if (strcmp(e->name, "o") == 0){
                                sql_exp *m_exp = exp_copy(sa, tmpexp);
-                               modify_exp_col(c, m_exp, tblname, tmpcolname, 
e->rname, e->name, 1);
-                               
+
                                //append this exp to list
                                append(trans_select_exps, m_exp);
                                num_o_cond++;
+                               isConstrain_o = 1; 
 
                        } else if (strcmp(e->name, "s") == 0){
                                char subj_colname[50] = "subject";
@@ -1280,11 +1312,20 @@ void tranforms_exps(mvc *c, sql_rel *r, 
                                sql_exp *e = exp_alias(sa, tmpexp->rname, 
tmpexp->name, origtblname, origcolname, &tmpcol->type, CARD_MULTI, 
tmpcol->null, 0);
                                sql_exp *proj_e = exp_alias(sa, tmpexp->rname, 
tmpexp->name, tmpexp->rname, tmpexp->name, &tmpcol->type, CARD_MULTI, 
tmpcol->null, 0);  
                                sql_exp *base_col_e = exp_copy(sa, proj_e);
+                               sql_exp *notnull_m_exp = NULL; 
 
                                printf("tmpcolname in rdf basetable is %s\n", 
tmpcolname);
                                append(trans_tbl_exps, e); 
                                if (sp_prj_exps) append(sp_prj_exps, proj_e); 
                                if (base_column_exps) append(base_column_exps, 
base_col_e);
+                               
+                               if (isConstrain_o == 0 && isOptionalGroup == 0){
+                                       //Add not NULL condition if
+                                       //there is no constrain on o yet.
+                                       sql_exp *base_col_dup = exp_copy(sa, 
base_col_e); 
+                                       notnull_m_exp = exp_isnotnull(c, 
base_col_dup); 
+                                       append(trans_select_exps, 
notnull_m_exp);
+                               }
                        }
 
                        if (strcmp(tmpexp->name, "s") == 0){
@@ -1650,47 +1691,7 @@ sql_rel *connect_sp_select_and_mv_prop(m
 
 }
 
-static 
-list *single_exp_list(sql_allocator *sa, sql_exp *e){
-       list *lst = NULL; 
-       lst = new_exp_list(sa);
-
-       append(lst, e); 
-
-       return lst; 
-}
-
-/*
- * Return sys.isnull(e)
- * Right now, it is more like e = null
- * */
-static 
-sql_exp* exp_isnull(sql_allocator *sa, sql_exp *e){
-       sql_exp *l = NULL; 
-       sql_exp *r = NULL; 
-       sql_exp *isnull_exp = NULL;
-
-       l = e;
-       r = exp_atom(sa, atom_general(sa, exp_subtype(l), NULL));
-       
-       isnull_exp = exp_compare(sa, l, r, cmp_equal); 
-       
-       return isnull_exp; 
-}
-
-static 
-sql_exp* exp_isnotnull(sql_allocator *sa, sql_exp *e){
-       sql_exp *l = NULL; 
-       sql_exp *r = NULL; 
-       sql_exp *isnotnull_exp = NULL;
-
-       l = e;
-       r = exp_atom(sa, atom_general(sa, exp_subtype(l), NULL));
-       
-       isnotnull_exp = exp_compare(sa, l, r, cmp_notequal); 
-       
-       return isnotnull_exp; 
-}
+
 
 /*
  * Create exps for optional set of columns
@@ -1721,11 +1722,12 @@ sql_exp* exp_isnotnull(sql_allocator *sa
  * */
 
 static 
-list *create_optional_exps(sql_allocator *sa, list *base_column_exps, int 
isOptionalGroup, int contain_mv_col){
+list *create_optional_exps(mvc *sql, list *base_column_exps, int 
isOptionalGroup, int contain_mv_col){
        list *opt_exps = NULL ;
        list *req_exps = NULL; 
        sql_exp *or_exp = NULL; 
        node *en = NULL; 
+       sql_allocator *sa = sql->sa; 
 
        list *only_o_exps = NULL; //keeping only o
        only_o_exps = new_exp_list(sa); 
@@ -1747,24 +1749,19 @@ list *create_optional_exps(sql_allocator
                } else {
                        node *first_node = only_o_exps->h;
                        sql_exp *first_exp = (sql_exp *) first_node->data;
-                       sql_exp *first_isnull_exp = exp_isnull(sa, first_exp); 
+                       sql_exp *first_isnull_exp = exp_isnull(sql, first_exp); 
 
                        if (first_node->next){
                                for (en = first_node->next; en; en = en->next){
                                        sql_exp *tmpexp = (sql_exp *) en->data;
                                        sql_exp *tmp_isnull_exp = NULL; 
                                        assert(tmpexp->type == e_column); 
-                                       tmp_isnull_exp = exp_isnull(sa, 
tmpexp); 
+                                       tmp_isnull_exp = exp_isnull(sql, 
tmpexp); 
 
                                        if (or_exp == NULL){
-                                               list *lst1 = 
single_exp_list(sa, first_isnull_exp); 
-                                               list *lst2 = 
single_exp_list(sa, tmp_isnull_exp); 
-                                               or_exp = exp_or(sa, lst1, 
lst2);        
+                                               or_exp = rel_binop_(sql, 
first_isnull_exp, tmp_isnull_exp, NULL, "or", card_value);
                                        } else {
-                                               list *lst1 = 
single_exp_list(sa, or_exp); 
-                                               list *lst2 = 
single_exp_list(sa, tmp_isnull_exp);
-
-                                               or_exp = exp_or(sa, lst1, 
lst2); 
+                                               or_exp = rel_binop_(sql, 
or_exp, tmp_isnull_exp, NULL, "or", card_value);
                                        }
                                }
                        }
@@ -1779,20 +1776,17 @@ list *create_optional_exps(sql_allocator
                                sql_exp *tmpexp = (sql_exp *) en->data;
                                sql_exp *if_exp = NULL; 
                                sql_exp *exp_null = NULL; 
-                               list *lst_ifthen;
-                               list *lst_else;
 
                                assert(tmpexp->type == e_column);
                                assert(or_exp != NULL);         
 
                                if (strcmp(tmpexp->name, "o") == 0){
-
+                                       sql_exp *res = exp_copy(sa, tmpexp); 
                                        exp_null = exp_atom(sa, 
atom_general(sa, exp_subtype(tmpexp), NULL));
                                        
-                                       lst_ifthen = single_exp_list(sa, 
exp_null); 
-                                       lst_else = single_exp_list(sa, tmpexp); 
-
-                                       if_exp = exp_if(sa, or_exp, lst_ifthen, 
lst_else);      
+                                       if_exp = rel_nop_(sql, or_exp, 
exp_null, res, NULL, NULL, "ifthenelse", card_value);    
+
+                                       assert (if_exp != NULL); 
 
                                        append(opt_exps, if_exp); 
                                } else {
@@ -1813,12 +1807,9 @@ list *create_optional_exps(sql_allocator
                req_exps = new_exp_list(sa); 
                for (en = base_column_exps->h; en; en = en->next){
                        sql_exp *tmpexp = (sql_exp *) en->data;
-                       sql_exp *exp_notnull = NULL;
-                       assert(tmpexp->type == e_column);
-
-                       exp_notnull = exp_isnotnull(sa, tmpexp); 
-
-                       append(req_exps, exp_notnull);
+                       sql_exp *r_exp = exp_copy(sa, tmpexp); 
+                       
+                       append(req_exps, r_exp);
                }
 
                return req_exps; 
@@ -1827,11 +1818,12 @@ list *create_optional_exps(sql_allocator
 }
 
 static
-void append_sp_rdfscan_proj_exps(list *opt_col_exps, list 
*sp_rdfscan_proj_exps){
+void append_sp_rdfscan_proj_exps(sql_allocator *sa, list *opt_col_exps, list 
*sp_rdfscan_proj_exps){
        node *en; 
        for (en = opt_col_exps->h; en; en = en->next){
                sql_exp *tmpexp = (sql_exp *) en->data;
-               append(sp_rdfscan_proj_exps, tmpexp); 
+               sql_exp *proj_exp = exp_copy(sa, tmpexp);
+               append(sp_rdfscan_proj_exps, proj_exp); 
        }
 }
 
@@ -1913,7 +1905,7 @@ sql_rel* transform_inner_join_subjg (mvc
                isMVcol = isMVCol(tId, colIdx, global_csset);
 
                if (isMVcol == 0){
-                       tranforms_exps(c, tmprel, trans_select_exps, 
trans_table_exps, tblname, colIdx, tmpPropId, &atblname, &asubjcolname, 
sp_prj_exps, base_column_exps); 
+                       tranforms_exps(c, tmprel, trans_select_exps, 
trans_table_exps, tblname, colIdx, tmpPropId, &atblname, &asubjcolname, 
sp_prj_exps, base_column_exps, isOptionalGroup); 
                        has_nonMV_col=1; 
                }
                else{
@@ -1947,17 +1939,20 @@ sql_rel* transform_inner_join_subjg (mvc
                *is_contain_mv = 1; 
                rel = connect_sp_select_and_mv_prop(c, rel_wo_mv, mvPropRels, 
tblname, atblname, asubjcolname, nnode); 
 
-               opt_exps = create_optional_exps(c->sa, base_column_exps, 
isOptionalGroup, 1);
+               opt_exps = create_optional_exps(c, base_column_exps, 
isOptionalGroup, 1);
        }
        else{
                *is_contain_mv = 0;
                rel = rel_wo_mv; 
 
-               opt_exps = create_optional_exps(c->sa, base_column_exps, 
isOptionalGroup, 0);
+               opt_exps = create_optional_exps(c, base_column_exps, 
isOptionalGroup, 0);
+                       
+               printf("OPTIONAL Expressions\n");
+               exps_print_ext(c, opt_exps, 0, NULL); 
        }
 
 
-       append_sp_rdfscan_proj_exps(opt_exps, sp_rdfscan_proj_exps);
+       append_sp_rdfscan_proj_exps(c->sa, opt_exps, sp_rdfscan_proj_exps);
        //rel_print(c, rel, 0); 
        //GDKfree(tblname); 
 
@@ -2046,7 +2041,7 @@ sql_rel* build_rdfscan (mvc *c, jgraph *
                        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); 
+                       tranforms_exps(c, tmprel, trans_select_exps, 
trans_table_exps, tblname, colIdx, tmpPropId, &atblname, &asubjcolname, NULL, 
NULL, 0); 
 
                        if (isMVcol == 0){
                                num_nonMV_col++; 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to