Changeset: a4df1be85e4e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a4df1be85e4e Modified Files: sql/backends/monet5/sql_rdf.h sql/backends/monet5/sql_rdf_jgraph.c Branch: rdf Log Message:
Minor code reallocation diffs (truncated from 327 to 300 lines): diff --git a/sql/backends/monet5/sql_rdf.h b/sql/backends/monet5/sql_rdf.h --- a/sql/backends/monet5/sql_rdf.h +++ b/sql/backends/monet5/sql_rdf.h @@ -56,4 +56,6 @@ extern BATiter global_mapi; #define APPLY_OPTIMIZATION_FOR_OPTIONAL 1 /* Instead of using left join, we use a project with ifthenelse */ /* on the set of optional columns */ +#define HANDLING_EXCEPTION 1 + #endif /*_SQL_RDF_H */ 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 @@ -2530,6 +2530,153 @@ void generate_ijpatternId(jgraph *jg, in printf("Number of ijgroup is: %d\n", (ijpId + 1)); } + +static +sql_rel* _group_star_pattern_for_single_table(mvc *c, jgraph *jg, int *group, int nnode, int tId, list **sp_proj_exps, list **sp_rdfscan_proj_exps, + int *contain_mv_col){ + + int i, j; + int *nnodes_per_ijgroup; + int nijgroup = 0; + int **ijgroup; + sql_rel **ijrels; //rel for inner join groups + sql_rel **edge_ijrels; //sql_rel connecting each pair of ijrels + int is_contain_mv = 0; + sql_rel *rel_rdfscan = NULL; + sql_rel *tbl_m_rel = NULL; + + int *ingroup_contain_mv = NULL; sql_rel *tmprel_rdfscan = NULL; + + *sp_proj_exps = new_exp_list(c->sa); + *sp_rdfscan_proj_exps = new_exp_list(c->sa); + + ijgroup = get_inner_join_groups_in_sp_group(jg, group, nnode, &nijgroup, &nnodes_per_ijgroup); + + printf("Number of inner join group is: %d\n", nijgroup); + + rel_rdfscan = build_rdfscan(c, jg, tId, nnode, nijgroup, ijgroup, nnodes_per_ijgroup); + + for (i = 0; i < nijgroup; i++){ + printf("Group %d: ", i); + for (j = 0; j < nnodes_per_ijgroup[i]; j++){ + printf(" %d",ijgroup[i][j]); + } + printf("\n"); + + } + + ijrels = (sql_rel **) malloc(sizeof(sql_rel*) * nijgroup); + edge_ijrels = (sql_rel **) malloc(sizeof(sql_rel*) * (nijgroup - 1)); + ingroup_contain_mv = (int *) malloc(sizeof(int) * nijgroup); + + for (i = 0; i < nijgroup; i++){ + int isOptionalGroup = 0; + if (i > 0) isOptionalGroup = 1; + ingroup_contain_mv[i] = 0; + ijrels[i] = transform_inner_join_subjg (c, jg, tId, ijgroup[i], nnodes_per_ijgroup[i], *sp_proj_exps, *sp_rdfscan_proj_exps, &is_contain_mv, isOptionalGroup); + ingroup_contain_mv[i] = is_contain_mv; + + } + + *contain_mv_col = is_contain_mv; + if (is_contain_mv) printf("Contain MV cols \n"); + printf("Original Projection of all columns (w/o considering mv col): \n"); + exps_print_ext(c, *sp_proj_exps, 0, NULL); + + printf("RDFscan expression for table matching %d\n",tId); + exps_print_ext(c, *sp_rdfscan_proj_exps, 0, NULL); + + if (nijgroup > 1){ + #if (APPLY_OPTIMIZATION_FOR_OPTIONAL == 0) + //Always use left outer join for connecting ijgroup + printf("APPLY_OPTIMIZATION_FOR_OPTIONAL \n"); + //Connect these ijrels by outer joins + for (i = 0; i < (nijgroup - 1); i++){ + edge_ijrels[i] = _group_edge_between_two_groups(c, jg, i, ijgroup[i], nnodes_per_ijgroup[i], + ijgroup[i+1], nnodes_per_ijgroup[i+1], ijrels[i], ijrels[i+1], 1); + } + connect_groups(nijgroup, ijrels, edge_ijrels); + + tbl_m_rel = edge_ijrels[0]; + + #else + //if the inner group does not have mv prop, then use the IFTHENELSE approach + //First: Connect all non-mv prop groups into single rel (with the first rel) + sql_rel *non_mv_rep_rel = NULL; //Represent all non-mv props. + int n_mv_groups = 1; //Number of groups with mv prop + //Start from 1 (the first is the combination of + //all non-mv groups) + int n_non_mv_groups = 0; + int *old_idx_map = (int *) malloc(sizeof(int) * nijgroup); + + sql_rel **newijrels = (sql_rel **) malloc(sizeof(sql_rel*) * nijgroup); + + non_mv_rep_rel = ijrels[0]; + for (i = 1; i < nijgroup; i++){ + if (ingroup_contain_mv[i] == 0){ + n_non_mv_groups++; + non_mv_rep_rel = rdf_rel_simple_combine_with_optional_cols(c->sa, non_mv_rep_rel, ijrels[i]); + } + else { + old_idx_map[n_mv_groups] = i; + newijrels[n_mv_groups] = ijrels[i]; + n_mv_groups++; + } + } + + newijrels[0] = non_mv_rep_rel; + old_idx_map[0] = 0; + + if (n_mv_groups > 1){ + //Then, connect with groups having mv props + for (i = 0; i < (n_mv_groups - 1); i++){ + int id1 = old_idx_map[i]; + int id2 = old_idx_map[i+1]; + + edge_ijrels[i] = _group_edge_between_two_groups(c, jg, i, ijgroup[id1], nnodes_per_ijgroup[id1], + ijgroup[id2], nnodes_per_ijgroup[id2], newijrels[i], newijrels[i+1], 1); + } + + connect_groups(n_mv_groups, newijrels, edge_ijrels); + tmprel_rdfscan = edge_ijrels[0]; + } + else{ + tmprel_rdfscan = newijrels[0]; + } + if (n_non_mv_groups > 0){ //Add IFTHENELSE project + sql_rel *tmp_proj_rel = rel_project(c->sa, tmprel_rdfscan, *sp_rdfscan_proj_exps); + tbl_m_rel = tmp_proj_rel; + } + else{ + tbl_m_rel = tmprel_rdfscan; + } + #endif + } + else{ //nijgroup = 1 + tbl_m_rel = ijrels[0]; + } + + #if USINGRDFSCAN + tbl_m_rel = rel_rdfscan; + #else + rel_destroy(rel_rdfscan); + #endif + + //Free + for (i = 0; i < nijgroup; i++){ + free(ijgroup[i]); + } + + free(ijgroup); + free(nnodes_per_ijgroup); + free(edge_ijrels); + free(ijrels); + + + return tbl_m_rel; +} + + /* * Create a select sql_rel from a star pattern * */ @@ -2537,14 +2684,13 @@ void generate_ijpatternId(jgraph *jg, in static sql_rel* _group_star_pattern(mvc *c, jgraph *jg, int *group, int nnode, int pId){ sql_rel *rel = NULL; - int i, j, tblIdx; + int i, tblIdx; char is_all_select = 1; char is_only_basetable = 1; spProps *spprops = NULL; int *tmptbId = NULL; int num_match_tbl = 0; - //This transformed exps list contain exps list from op_select //on the object @@ -2609,141 +2755,8 @@ sql_rel* _group_star_pattern(mvc *c, jgr sp_rdfscan_proj_exps = (list **) malloc(sizeof(list *) * num_match_tbl); for (tblIdx = 0; tblIdx < num_match_tbl; tblIdx++){ - int tId = tmptbId[tblIdx]; - int *nnodes_per_ijgroup; - int nijgroup = 0; - int **ijgroup; - sql_rel **ijrels; //rel for inner join groups - sql_rel **edge_ijrels; //sql_rel connecting each pair of ijrels - int is_contain_mv = 0; - sql_rel *rel_rdfscan = NULL; - - int *ingroup_contain_mv = NULL; sql_rel *tmprel_rdfscan = NULL; - - sp_proj_exps[tblIdx] = new_exp_list(c->sa); - sp_rdfscan_proj_exps[tblIdx] = new_exp_list(c->sa); - - ijgroup = get_inner_join_groups_in_sp_group(jg, group, nnode, &nijgroup, &nnodes_per_ijgroup); - - printf("Number of inner join group is: %d\n", nijgroup); - - rel_rdfscan = build_rdfscan(c, jg, tId, nnode, nijgroup, ijgroup, nnodes_per_ijgroup); - - for (i = 0; i < nijgroup; i++){ - printf("Group %d: ", i); - for (j = 0; j < nnodes_per_ijgroup[i]; j++){ - printf(" %d",ijgroup[i][j]); - } - printf("\n"); - - } - - ijrels = (sql_rel **) malloc(sizeof(sql_rel*) * nijgroup); - edge_ijrels = (sql_rel **) malloc(sizeof(sql_rel*) * (nijgroup - 1)); - ingroup_contain_mv = (int *) malloc(sizeof(int) * nijgroup); - - for (i = 0; i < nijgroup; i++){ - int isOptionalGroup = 0; - if (i > 0) isOptionalGroup = 1; - ingroup_contain_mv[i] = 0; - ijrels[i] = transform_inner_join_subjg (c, jg, tId, ijgroup[i], nnodes_per_ijgroup[i], sp_proj_exps[tblIdx], sp_rdfscan_proj_exps[tblIdx], &is_contain_mv, isOptionalGroup); - ingroup_contain_mv[i] = is_contain_mv; - - } - - contain_mv_col[tblIdx] = is_contain_mv; - if (is_contain_mv) printf("Contain MV cols \n"); - printf("Original Projection of all columns (w/o considering mv col): \n"); - exps_print_ext(c, sp_proj_exps[tblIdx], 0, NULL); - - printf("RDFscan expression for table matching %d\n",tblIdx); - exps_print_ext(c, sp_rdfscan_proj_exps[tblIdx], 0, NULL); - - if (nijgroup > 1){ - #if (APPLY_OPTIMIZATION_FOR_OPTIONAL == 0) - //Always use left outer join for connecting ijgroup - printf("APPLY_OPTIMIZATION_FOR_OPTIONAL \n"); - //Connect these ijrels by outer joins - for (i = 0; i < (nijgroup - 1); i++){ - edge_ijrels[i] = _group_edge_between_two_groups(c, jg, i, ijgroup[i], nnodes_per_ijgroup[i], - ijgroup[i+1], nnodes_per_ijgroup[i+1], ijrels[i], ijrels[i+1], 1); - } - connect_groups(nijgroup, ijrels, edge_ijrels); - - tbl_m_rels[tblIdx] = edge_ijrels[0]; - - #else - //if the inner group does not have mv prop, then use the IFTHENELSE approach - //First: Connect all non-mv prop groups into single rel (with the first rel) - sql_rel *non_mv_rep_rel = NULL; //Represent all non-mv props. - int n_mv_groups = 1; //Number of groups with mv prop - //Start from 1 (the first is the combination of - //all non-mv groups) - int n_non_mv_groups = 0; - int *old_idx_map = (int *) malloc(sizeof(int) * nijgroup); - - sql_rel **newijrels = (sql_rel **) malloc(sizeof(sql_rel*) * nijgroup); - - non_mv_rep_rel = ijrels[0]; - for (i = 1; i < nijgroup; i++){ - if (ingroup_contain_mv[i] == 0){ - n_non_mv_groups++; - non_mv_rep_rel = rdf_rel_simple_combine_with_optional_cols(c->sa, non_mv_rep_rel, ijrels[i]); - } - else { - old_idx_map[n_mv_groups] = i; - newijrels[n_mv_groups] = ijrels[i]; - n_mv_groups++; - } - } - - newijrels[0] = non_mv_rep_rel; - old_idx_map[0] = 0; - - if (n_mv_groups > 1){ - //Then, connect with groups having mv props - for (i = 0; i < (n_mv_groups - 1); i++){ - int id1 = old_idx_map[i]; - int id2 = old_idx_map[i+1]; - - edge_ijrels[i] = _group_edge_between_two_groups(c, jg, i, ijgroup[id1], nnodes_per_ijgroup[id1], - ijgroup[id2], nnodes_per_ijgroup[id2], newijrels[i], newijrels[i+1], 1); - } - - connect_groups(n_mv_groups, newijrels, edge_ijrels); - tmprel_rdfscan = edge_ijrels[0]; - } - else{ - tmprel_rdfscan = newijrels[0]; - } - if (n_non_mv_groups > 0){ //Add IFTHENELSE project - sql_rel *tmp_proj_rel = rel_project(c->sa, tmprel_rdfscan, sp_rdfscan_proj_exps[tblIdx]); - tbl_m_rels[tblIdx] = tmp_proj_rel; - } - else{ - tbl_m_rels[tblIdx] = tmprel_rdfscan; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list