Changeset: 23b8cf85a0a7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=23b8cf85a0a7
Modified Files:
        sql/backends/monet5/rel_bin.c
Branch: arrays
Log Message:

remove crossproduct when joining two arrays


diffs (77 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1729,10 +1729,71 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
        stmt *ld = NULL, *rd = NULL;
        int need_left = (rel->flag == LEFT_JOIN);
 
-       if (rel->l) /* first construct the left sub relation */
+       stmt *leftArray = NULL, *rightArray = NULL;
+       if (rel->l) { /* first construct the left sub relation */
+               sql_rel *rtmp;
                left = subrel_bin(sql, rel->l, refs);
-       if (rel->r) /* first construct the right sub relation */
+               
+               rtmp = (sql_rel*)rel->l;
+               if(rtmp->op == op_basetable) {
+                       sql_table *t = (sql_table*)rtmp->l;
+                       if(isArray(t))
+                               leftArray = rel2bin_basetable(sql, rel->l);
+               }
+       }
+
+       if (rel->r) {/* first construct the right sub relation */
+               sql_rel *rtmp;
                right = subrel_bin(sql, rel->r, refs);
+               
+               rtmp = (sql_rel*)rel->r;
+               if(rtmp->op == op_basetable) {
+                       sql_table *t = (sql_table*)rtmp->l;
+                       if(isArray(t))
+                               rightArray = rel2bin_basetable(sql, rel->r);
+               }
+       }
+
+       if(leftArray && rightArray) {
+               l = sa_list(sql->sa);
+
+               for( n = left->op4.lval->h; n; n = n->next ) {
+                       stmt *c = n->data;
+                       char *rnme = table_name(sql->sa, c);
+                       char *nme = column_name(sql->sa, c);
+                       stmt *s = c; //stmt_project(sql->sa, jl, 
column(sql->sa, c) );
+
+                       /* as append isn't save, we append to a new copy */
+                       if (rel->op == op_left || rel->op == op_full || rel->op 
== op_right)
+                               s = Column(sql->sa, s);
+                       if (rel->op == op_left || rel->op == op_full)
+                               s = stmt_append(sql->sa, s, 
stmt_project(sql->sa, ld, c));
+                       if (rel->op == op_right || rel->op == op_full) 
+                               s = stmt_append(sql->sa, s, stmt_const(sql->sa, 
rd, (c->flag&OUTER_ZERO)?stmt_atom_wrd(sql->sa, 0):stmt_atom(sql->sa, 
atom_general(sql->sa, tail_type(c), NULL))));
+
+                       s = stmt_alias(sql->sa, s, rnme, nme);
+                       list_append(l, s);
+               }
+               for( n = right->op4.lval->h; n; n = n->next ) {
+                       stmt *c = n->data;
+                       char *rnme = table_name(sql->sa, c);
+                       char *nme = column_name(sql->sa, c);
+                       stmt *s = c; //stmt_project(sql->sa, jr, 
column(sql->sa, c) );
+
+                       /* as append isn't save, we append to a new copy */
+                       if (rel->op == op_left || rel->op == op_full || rel->op 
== op_right)
+                               s = Column(sql->sa, s);
+                       if (rel->op == op_left || rel->op == op_full) 
+                               s = stmt_append(sql->sa, s, stmt_const(sql->sa, 
ld, (c->flag&OUTER_ZERO)?stmt_atom_wrd(sql->sa, 0):stmt_atom(sql->sa, 
atom_general(sql->sa, tail_type(c), NULL))));
+                       if (rel->op == op_right || rel->op == op_full) 
+                               s = stmt_append(sql->sa, s, 
stmt_project(sql->sa, rd, c));
+
+                       s = stmt_alias(sql->sa, s, rnme, nme);
+                       list_append(l, s);
+               }
+               return stmt_list(sql->sa, l);
+       }
+
        if (!left || !right) 
                return NULL;    
        left = row2cols(sql, left);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to