Annotation of 43BSD/ingres/source/decomp/ageval.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <tree.h>
                      3: # include      <symbol.h>
                      4: # include      <pv.h>
                      5: # include      "globs.h"
                      6: # include      <sccs.h>
                      7: # include      <errors.h>
                      8: 
                      9: SCCSID(@(#)ageval.c    8.3     12/18/85)
                     10: 
                     11: /*
                     12: **     AGEVAL -- evaluate simple aggregate.
                     13: **
                     14: **     Ageval is passed the tree of a simple aggregate,
                     15: **     and an array of space to store the results. The
                     16: **     amount of space actually allocated is stored in
                     17: **     (*result)->sym.len
                     18: **
                     19: **     If the aggregate is unique (eg. countu, sumu, avgu)
                     20: **     or if the aggregate is multi-variable, special
                     21: **     processing is done. A temporary relation is formed
                     22: **     with a result domain for each single agg in the tree.
                     23: **     Decomp is called to retrieve
                     24: **     the values to be aggregated into that relation.
                     25: **
                     26: **     If the aggregate is unique, then duplicates are
                     27: **     removed from the temporary relation.
                     28: **
                     29: **     Next the aggregate is run on either the original relation
                     30: **     or on the temporary relation.
                     31: **
                     32: **     Finally the result is read from OVQP and if a
                     33: **     temporary relation was used, it is destroyed.
                     34: **
                     35: **     Trace Flags:
                     36: **             41
                     37: */
                     38: 
                     39: 
                     40: QTREE *
                     41: ageval(tree, result)
                     42: QTREE  *tree;          /* root of aggregate */
                     43: QTREE  *result[];      /* space for results */
                     44: {
                     45:        register QTREE  *aghead, *resdom, *aop;
                     46:        QTREE           *newtree;
                     47:        QTREE           *lnodv[MAXDOM + 2];
                     48:        int             agbuf[1+AGBUFSIZ/sizeof(int)];
                     49:        int             temp_relnum, i;
                     50:        extern int      derror();
                     51:        extern QTREE    *makroot(), *makavar(), *makresdom();
                     52: 
                     53: #      ifdef xDTR1
                     54:        if (tTf(41, 2))
                     55:        {
                     56:                printf("entered ageval\n");
                     57:                treepr(tree);
                     58:        }
                     59: #      endif
                     60: 
                     61:        aghead = tree;
                     62:        aop = aghead->left;
                     63:        temp_relnum = NORESULT;
                     64: 
                     65:        /* if PRIME or multi-var, form aggregate domain in temp relation */
                     66:        if (prime(aop) || aghead->sym.value.sym_root.tvarc > 1)
                     67:        {
                     68:                initbuf((char *)agbuf, AGBUFSIZ, AGBUFFULL, derror);
                     69: 
                     70:                lnodv[lnode(aop, lnodv, 0)] = 0;
                     71: 
                     72:                /* create new tree for retrieve and give it the qualification */
                     73:                newtree = makroot((char *)agbuf);
                     74:                newtree->right = aghead->right;
                     75:                aghead->right = De.de_qle;
                     76: 
                     77:                /* put a resdom on new tree for each aop in orig tree */
                     78:                /* make each aop in orig tree reference new relation */
                     79:                for (i = 0; aop = lnodv[i]; )
                     80:                {
                     81: 
                     82:                        /* create resdom for new tree */
                     83:                        resdom = makresdom((char *)agbuf, aop);
                     84:                        resdom->sym.value.sym_resdom.resno = ++i;
                     85:                        resdom->right = aop->right;
                     86: 
                     87:                        /* connect it to newtree */
                     88:                        resdom->left = newtree->left;
                     89:                        newtree->left = resdom;
                     90: 
                     91:                        /* make orig aop reference new relation */
                     92:                        aop->right = makavar(resdom, FREEVAR, i);
                     93:                }
                     94: 
                     95:                /* make result relation */
                     96:                temp_relnum = mak_t_rel(newtree, "a", -1);
                     97: 
                     98:                /* prepare for query */
                     99:                mapvar(newtree, 0);
                    100:                decomp(newtree, mdRETR, temp_relnum);
                    101:                De.de_rangev[FREEVAR].relnum = temp_relnum;
                    102:                De.de_sourcevar = FREEVAR;
                    103: 
                    104:                /* if prime, remove dups */
                    105:                if (prime(aghead->left))
                    106:                {
                    107:                        /* modify to heapsort */
                    108:                        removedups(FREEVAR);
                    109:                }
                    110: 
                    111:        }
                    112: 
                    113:        De.de_newq = 1;
                    114:        De.de_newr = TRUE;
                    115: 
                    116:        call_ovqp(aghead, mdRETR, NORESULT);    /* call ovqp with no result relation */
                    117:        De.de_newq = 0;
                    118: 
                    119:        /* pick up results */
                    120:        readagg_result(result);
                    121: 
                    122:        /* if temp relation was created, destroy it */
                    123:        if (temp_relnum != NORESULT)
                    124:                dstr_rel(temp_relnum);
                    125: 
                    126: }
                    127: /*
                    128: **     Determine if an aggregate contains any
                    129: **     prime aggregates. Note that there might
                    130: **     be more than one aggregate.
                    131: */
                    132: 
                    133: prime(aop)
                    134: QTREE  *aop;
                    135: {
                    136:        register QTREE  *a;
                    137: 
                    138:        a = aop;
                    139:        do
                    140:        {
                    141:                switch (a->sym.value.sym_op.opno)
                    142:                {
                    143:                  case opCOUNTU:
                    144:                  case opSUMU:
                    145:                  case opAVGU:
                    146:                        return (TRUE);
                    147:                }
                    148:        } while (a = a->left);
                    149:        return (FALSE);
                    150: }
                    151: /*
                    152: **     Remove dups from an unopened relation
                    153: **     by calling heapsort
                    154: */
                    155: 
                    156: removedups(var)
                    157: int    var;
                    158: {
                    159:        register char   *p;
                    160:        char            *rangename();
                    161: 
                    162:        closer1(var);   /* guarantee that relation has been closed */
                    163:        initp();
                    164:        p = rangename(var);     /* get name of relation */
                    165: #      ifdef xDTR1
                    166:        if (tTf(41, 1))
                    167:        {
                    168:                printf("removing dups from %s\n", p);
                    169:        }
                    170: #      endif
                    171:        setp(PV_STR, p);
                    172:        setp(PV_STR,"heapsort");
                    173:        setp(PV_STR,"num");
                    174:        call_dbu(mdMODIFY, FALSE);
                    175: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.