Update of /cvsroot/monetdb/pathfinder/compiler/algebra/opt
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv3923/compiler/algebra/opt

Modified Files:
      Tag: M5XQ
        opt_algebra_cse.c 
Log Message:
propagated changes of Friday Jun 12 2009 - Monday Jun 15 2009
from the development trunk to the M5XQ branch

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009/06/12 - tsheyar: compiler/algebra/opt/opt_algebra_cse.c,1.52
-- Replaced aggregate operators count, min, max, avg, sum, prod, seqty1,
   and all in the algebra by a single aggregate operator ``aggr''
   that can handle multiple aggregates. The aggregate entries
   are of kind count, min, max, avg, sum, prod, seqty1, all, and dist.

-- Added new aggregate kind ``dist'' that allows to represent group by
   columns that functionally depend on the partitioning criterion
   in the result of the grouping aggregate.

-- Added rewrite that merges aggregates.

-- Added rewrite that removes superfluous aggregates.

-- Added rewrite that pushes a rank operator through an aggregate.

-- Extended the XML import to cope with the old
   as well as the new representation of aggregates.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


U opt_algebra_cse.c
Index: opt_algebra_cse.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/algebra/opt/opt_algebra_cse.c,v
retrieving revision 1.50.2.1
retrieving revision 1.50.2.2
diff -u -d -r1.50.2.1 -r1.50.2.2
--- opt_algebra_cse.c   7 May 2009 14:42:53 -0000       1.50.2.1
+++ opt_algebra_cse.c   15 Jun 2009 12:44:40 -0000      1.50.2.2
@@ -92,12 +92,7 @@
     , [la_bool_or]         = "la_bool_or"
     , [la_bool_not]        = "la_bool_not"
     , [la_to]              = "la_to"
-    , [la_avg]             = "la_avg"
-    , [la_max]             = "la_max"
-    , [la_min]             = "la_min"
-    , [la_sum]             = "la_sum"
-    , [la_prod]            = "la_prod"
-    , [la_count]           = "la_count"
+    , [la_aggr]            = "la_aggr"
     , [la_rownum]          = "la_rownum"
     , [la_rowrank]         = "la_rowrank"
     , [la_rank]            = "la_rank"
@@ -105,8 +100,6 @@
     , [la_type]            = "la_type"
     , [la_type_assert]     = "la_type_assert"
     , [la_cast]            = "la_cast"
-    , [la_seqty1]          = "la_seqty1"
-    , [la_all]             = "la_all"
     , [la_step]            = "la_step"
     , [la_step_join]       = "la_step_join"
     , [la_guide_step]      = "la_guide_step"
@@ -995,12 +988,27 @@
 
             return false;
 
-        case la_avg:
-        case la_max:
-        case la_min:
-        case la_sum:
-        case la_prod:
-        case la_count:
+        case la_aggr:
+        {
+            unsigned int i = 0;
+            unsigned int j = 0;
+            for (i = 0; i < a->sem.aggr.count; i++) {
+                 for (j = 0; j < b->sem.aggr.count; j++) {
+                     if ((IS_NULL (a->sem.aggr.aggr[i].col)
+                          ? col_NULL
+                          : ACTCOL (L(a), a->sem.aggr.aggr[i].col) ==
+                          IS_NULL (b->sem.aggr.aggr[j].col)
+                          ? col_NULL
+                          : ACTCOL (L(b), b->sem.aggr.aggr[j].col)) &&
+                         (a->sem.aggr.aggr[i].kind ==
+                          b->sem.aggr.aggr[j].kind))
+                         break;
+                 }
+
+                 if (j >= b->sem.aggr.count)
+                     return false;
+            }
+
             /* partition column is not necesserily set */
             if (IS_NULL(a->sem.aggr.part)?col_NULL:
                     ACTCOL (L(a), a->sem.aggr.part) !=
@@ -1008,15 +1016,7 @@
                     ACTCOL (L(b), b->sem.aggr.part))
                 return false;
 
-
-            /* even col is not necesserily set */
-            if (IS_NULL(a->sem.aggr.col)?col_NULL:
-                    ACTCOL (L(a), a->sem.aggr.col) !=
-                IS_NULL(b->sem.aggr.col)?col_NULL:
-                    ACTCOL (L(b), b->sem.aggr.col))
-                return false;
-
-            return true;
+        }   return true;
 
         case la_rownum:
         case la_rowrank:
@@ -1060,24 +1060,6 @@
 
             return false;
 
-        case la_seqty1:
-        case la_all:
-            /* partition column is not necesserily set */
-            if (IS_NULL(a->sem.aggr.part)?col_NULL:
-                    ACTCOL (L(a), a->sem.aggr.part) !=
-                IS_NULL(b->sem.aggr.part)?col_NULL:
-                    ACTCOL (L(b), b->sem.aggr.part))
-                return false;
-
-            /* even col is not necesserily set */
-            if (IS_NULL(a->sem.aggr.col)?col_NULL:
-                    ACTCOL (L(a), a->sem.aggr.col) !=
-                IS_NULL(b->sem.aggr.col)?col_NULL:
-                    ACTCOL (L(b), b->sem.aggr.col))
-                return false;
-
-            return true;
-
         case la_step:
             if (!((ACTCOL (R(a), a->sem.step.iter) ==
                  ACTCOL (R(b), b->sem.step.iter))))
@@ -1717,26 +1699,29 @@
                                               n->sem.unary.res),
                              ACTCOL (L(n), n->sem.unary.col));
 
-        case la_avg:
-        case la_max:
-        case la_min:
-        case la_sum:
-        case la_prod:
-            return PFla_aggr (n->kind, CSE(L(n)),
-                              create_unq_name (CSE(L(n))->schema,
-                                               n->sem.aggr.res),
-                              ACTCOL (L(n), n->sem.aggr.col),
-                              (n->sem.aggr.part == col_NULL)?
-                              col_NULL:
-                              ACTCOL (L(n), n->sem.aggr.part));
+        case la_aggr:
+        {
+            PFalg_aggr_t *aggr = PFmalloc (n->sem.aggr.count *
+                                           sizeof (PFalg_aggr_t));
+            /* copy aggr_list */
+            for (unsigned int i = 0; i < n->sem.aggr.count; i++)
+                aggr[i] = PFalg_aggr (
+                              n->sem.aggr.aggr[i].kind,
+                              create_unq_name (
+                                  CSE(L(n))->schema,
+                                  n->sem.aggr.aggr[i].res),
+                              IS_NULL (n->sem.aggr.aggr[i].col)
+                              ? col_NULL
+                              : ACTCOL (L(n), n->sem.aggr.aggr[i].col));
+
+             return PFla_aggr (CSE(L(n)),
+                               IS_NULL (n->sem.aggr.part)
+                               ? col_NULL
+                               : ACTCOL (L(n), n->sem.aggr.part),
+                               n->sem.aggr.count,
+                               aggr);
+        }
 
-        case la_count:
-            return PFla_count (CSE(L(n)),
-                               create_unq_name (CSE(L(n))->schema,
-                                                n->sem.aggr.res),
-                               (n->sem.aggr.part == col_NULL)?
-                               col_NULL:
-                               ACTCOL (L(n), n->sem.aggr.part));
         case la_rownum:
         case la_rowrank:
         case la_rank:
@@ -1805,24 +1790,6 @@
                               ACTCOL (L(n), n->sem.type.col),
                               n->sem.type.ty);
 
-        case la_seqty1:
-            return PFla_seqty1 (CSE(L(n)),
-                                create_unq_name (CSE(L(n))->schema,
-                                                 n->sem.aggr.res),
-                                ACTCOL (L(n), n->sem.aggr.col),
-                                (n->sem.aggr.part == col_NULL)?
-                                col_NULL:
-                                ACTCOL (L(n), n->sem.aggr.part));
-
-        case la_all:
-            return PFla_all (CSE(L(n)),
-                             create_unq_name (CSE(L(n))->schema,
-                                              n->sem.aggr.res),
-                             ACTCOL (L(n), n->sem.aggr.col),
-                             (n->sem.aggr.part == col_NULL)?
-                             col_NULL:
-                             ACTCOL (L(n), n->sem.aggr.part));
-
         case la_step:
             return PFla_step (CSE(L(n)), CSE(R(n)),
                               n->sem.step.spec,
@@ -2322,15 +2289,13 @@
                      actcol (cse->sem.unary.res, ori->sem.unary.res));
             break;
 
-        case la_avg:
-        case la_max:
-        case la_min:
-        case la_sum:
-        case la_prod:
+        case la_aggr:
             actmap = create_actcol_map ();
-            INACTCOL (actmap,
-                      actcol (cse->sem.aggr.res, ori->sem.aggr.res),
-                      actcol (cse->sem.aggr.col, ori->sem.aggr.col));
+
+            for (unsigned int i = 0; i < cse->sem.aggr.count; i++)
+                INACTCOL (actmap,
+                          actcol (cse->sem.aggr.aggr[i].res,
+                                  ori->sem.aggr.aggr[i].res));
 
             assert ((cse->sem.aggr.part == col_NULL &&
                      ori->sem.aggr.part == col_NULL) ||
@@ -2340,26 +2305,9 @@
             /* if grouping is performed on the same attribute as the
                aggregate function is applied don't add this item to
                the mapping structure */
-            if ((cse->sem.aggr.part != col_NULL) && 
-                (ori->sem.aggr.part != ori->sem.aggr.col))
+            if ((cse->sem.aggr.part != col_NULL))
                 INACTCOL (actmap,
                           actcol (cse->sem.aggr.part, ori->sem.aggr.part));
-
-            break;
-
-        case la_count:
-            actmap = create_actcol_map ();
-            INACTCOL (actmap,
-                      actcol (cse->sem.aggr.res, ori->sem.aggr.res));
-
-            assert ((cse->sem.aggr.part == col_NULL &&
-                     ori->sem.aggr.part == col_NULL) ||
-                    (cse->sem.aggr.part != col_NULL &&
-                     ori->sem.aggr.part != col_NULL));
-
-            if (ori->sem.aggr.part != col_NULL)
-                INACTCOL (actmap,
-                           actcol (cse->sem.aggr.part, ori->sem.aggr.part));
             break;
 
         case la_rownum:
@@ -2392,23 +2340,6 @@
                       actcol (cse->sem.type.res, ori->sem.type.res));
             break;
 
-        case la_seqty1:
-        case la_all:
-            actmap = create_actcol_map ();
-            INACTCOL (actmap,
-                      actcol (cse->sem.aggr.res, ori->sem.aggr.res));
-
-            assert ((cse->sem.aggr.part == col_NULL &&
-                     ori->sem.aggr.part == col_NULL) ||
-                    (cse->sem.aggr.part != col_NULL &&
-                     ori->sem.aggr.part != col_NULL));
-
-            if (cse->sem.aggr.part != col_NULL)
-                INACTCOL (actmap,
-                    actcol (cse->sem.aggr.part, ori->sem.aggr.part));
-
-            break;
-
         case la_step:
         case la_guide_step:
             actmap = create_actcol_map ();


------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to