Changeset: 06cabc5d5434 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=06cabc5d5434
Modified Files:
sql/server/rel_exp.c
sql/server/rel_optimizer.c
Branch: graph0
Log Message:
QRW: join reordering WIP
diffs (103 lines):
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1187,6 +1187,9 @@ exp_is_join(sql_exp *e, list *rels)
/* range expression */
if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r &&
e->f && e->card >= CARD_AGGR && !complex_select(e))
return exp_is_rangejoin(e, rels);
+ /* graph join */
+ if (e->type == e_graph)
+ return 0;
return -1;
}
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -406,8 +406,23 @@ exp_count(int *cnt, sql_exp *e)
return 0;
*cnt -= 5*list_length(e->l);
return 5*list_length(e->l);
+ case e_graph:
+ if(exp_card(e->l) == CARD_ATOM && exp_card(e->r) == CARD_ATOM){
+ *cnt += 1000; // this is going to result to a constant
predicate TRUE or FALSE
+ } else {
+ exp_count(cnt, e->l);
+ exp_count(cnt, e->r);
+ if(exp_card(e->l) == CARD_ATOM || exp_card(e->r) ==
CARD_ATOM){
+ // single shortest path
+ *cnt += 500;
+ } else {
+ // this is going to be expensive, many-to-many
shortest paths
+ // do not change cnt
+ }
+ }
+ return 0; // the return value is ignored anyway
case e_convert:
- /* functions are more expensive, depending on the number of
columns involved. */
+ /* functions are more expensive, depending on the number of
columns involved. */
if (e->card == CARD_ATOM)
return 0;
/* fall through */
@@ -595,9 +610,9 @@ order_join_expressions(mvc *sql, list *d
sql_rel *l = find_rel(rels, e->l);
sql_rel *r = find_rel(rels, e->r);
- if (l && is_select(l->op) && l->exps)
+ if (l && (is_select(l->op) || l->op == op_graph_select)
&& l->exps)
keys[i] += list_length(l->exps)*10 +
exps_count(l->exps)*debug;
- if (r && is_select(r->op) && r->exps)
+ if (r && (is_select(r->op) || r->op == op_graph_select)
&& r->exps)
keys[i] += list_length(r->exps)*10 +
exps_count(r->exps)*debug;
}
pos[i] = i;
@@ -629,7 +644,7 @@ find_join_rels(list **L, list **R, list
sql_exp *e = n->data;
sql_rel *l = NULL, *r = NULL;
- if (!is_complex_exp(e->flag)){
+ if (e->type != e_cmp || !is_complex_exp(e->flag)){
l = find_rel(rels, e->l);
r = find_rel(rels, e->r);
}
@@ -689,7 +704,7 @@ find_fk( mvc *sql, list *rels, list *exp
sql_idx *idx = NULL;
sql_exp *je = djn->data, *le = je->l, *re = je->r;
- if (is_complex_exp(je->flag))
+ if (je->type != e_cmp || is_complex_exp(je->flag))
break;
if (!find_prop(je->p, PROP_JOINIDX)) {
int swapped = 0;
@@ -8660,9 +8675,6 @@ rel_graph_pda(int *changes, mvc *sql, sq
if(rel_is_ref(target) || rel_is_ref(parent))
return rel;
- // ref cnt
- printf("[rel_graph_pda] cnt: %d\n", graph_rel->ref.refcnt);
-
// case 1 - try to push down through a join or another graph operator
if(is_join(target->op) || is_graph(target->op)){
sql_rel* l = target->l;
@@ -8752,7 +8764,7 @@ rel_graph_create_join(int *changes, mvc
// if we did bind the lhs above, then we are guaranteed that the
// rhs will bind as well. Otherwise we are in the case where
- // the rule `rel_graph_pda' would have move this operator above
+ // the rule `rel_graph_pda' would have moved this operator above
// this cross product.
if(el){
sql_exp* ne = NULL; // construct the new e_graph
expression (jic)
@@ -9012,12 +9024,9 @@ static sql_rel *
if (graph_operators){
rel = rewrite_topdown(sql, rel, rel_graph_pda, &changes);
- printf("[Optimizer] rel_graph_pda: %s\n", dump_rel(sql, rel));
rel = rewrite_topdown(sql, rel, rel_graph_create_join,
&changes);
- printf("[Optimizer] rel_graph_create_join: %s\n", dump_rel(sql,
rel));
// rel_graph_create_join creates empty (dummy) selects
rel = rewrite(sql, rel, &rel_remove_empty_select, &e_changes);
- printf("[Optimizer] rel_remove_empty_select: %s\n",
dump_rel(sql, rel));
}
if (gp.cnt[op_select] && gp.cnt[op_join]) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list