aggravg.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:9k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * aggravg.c  - calculation of average aggregate functions
  3.  *              Kernel of GNU SQL-server 
  4.  *
  5.  * This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: aggravg.c,v 1.246 1997/04/10 06:57:28 vera Exp $ */
  29. #include <assert.h>
  30. #include "xmem.h"
  31. #include "destrn.h"
  32. #include "sctp.h"
  33. #include "strml.h"
  34. #include "fdcltrn.h"
  35. extern struct des_nseg desnseg;
  36. static int
  37. agravg (double *avg, i4_t n_avg, u2_t type, char *key, u2_t fn)
  38. {
  39.   char *sc;
  40.   u2_t k, k1;
  41.   u2_t v22;
  42.   i4_t v42;
  43.   double val;
  44.   sc = key;
  45.   key += scscal (key);
  46.   for (k = 0, k1 = 0; k < fn; k1 = 0, sc++)
  47.     for (; k1 < 7 && k < fn; k++, k1++)
  48.       if ((*sc & BITVL(k1)) != 0)
  49. key = proval (key, type);
  50.   switch (type)
  51.     {
  52.     case T1B:
  53.       val = *key;
  54.       break;
  55.     case T2B:
  56.       v22 = t2bunpack (key);
  57.       val = v22;
  58.       break;
  59.     case TFLOAT:
  60.       bcopy (key, (char *) &v42, size4b);
  61.       val = v42;
  62.       break;
  63.     case T4B:
  64.       v42 = t4bunpack (key);
  65.       val = v42;
  66.       break;
  67.     default:
  68.       val = 0;
  69.       error ("TRN.agravg: This data type is incorrect");
  70.       break;
  71.     }
  72.   *avg = ((*avg) * n_avg + val) / (n_avg + 1);
  73.   n_avg += 1;
  74.   return (n_avg);
  75. }
  76. struct ans_avg
  77. avgitab (struct id_ind * pidind, u2_t slsz,
  78.          char *sc, u2_t diasz, char *diasc)
  79. {
  80.   u2_t fn, fdf, sn;
  81.   struct des_field *df;
  82.   struct ldesscan *disc;
  83.   struct d_sc_i *scind;
  84.   struct ldesind *di;
  85.   struct d_r_t *desrel;
  86.   char *asp = NULL;
  87.   struct id_rel *pidrel;
  88.   struct des_tid tid;
  89.   i4_t rep;
  90.   i2_t n;
  91.   u2_t *ai, *afi, kn, type, dscsz;
  92.   i4_t n_avg = 0;
  93.   double avg = 0;
  94.   struct A pg;
  95.   struct ans_avg ans;
  96.   pidrel = &pidind->irii;
  97.   sn = pidrel->urn.segnum;
  98.   if ((ans.cotavg = cont_id (pidind, &desrel, &di)) != OK)
  99.     return (ans);
  100.   fn = desrel->desrbd.fieldnum;
  101.   fdf = desrel->desrbd.fdfnum;
  102.   df = (struct des_field *) (desrel + 1);
  103.   if ((ans.cotavg = testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL)) != OK)
  104.     return (ans);
  105.   ai = (u2_t *) (di + 1);
  106.   if ((ans.cotavg = testdsc (desrel, &diasz, diasc, ai, &dscsz)) != OK)
  107.     return (ans);
  108.   if ((ans.cotavg = synlsc (RSC, pidrel, sc, slsz, fn, NULL)) != OK)
  109.     return (ans);
  110.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  111.   if ((ans.cotavg = synlsc (RSC, pidrel, diasc, diasz, kn, ai)) != OK)
  112.     return (ans);
  113.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di, SCI, RSC, 0,
  114.                                   NULL, sc, slsz, 0, NULL, diasz + size2b);
  115.   disc = &scind->dessc;
  116.   disc->pdi = di;
  117.   disc->curlpn = (u2_t) ~ 0;
  118.   asp = (char *) (scind + 1) + slsz + size2b;
  119.   if (diasz == 0)
  120.     disc->dpnsc = NULL;
  121.   else
  122.     disc->dpnsc = asp;
  123.   t2bpack (diasz, asp);
  124.   disc->dpnsval = asp + size2b + dscsz;
  125.   asp += size2b;
  126.   bcopy (diasc, asp, diasz);
  127.   ai = (u2_t *) (disc->pdi + 1);
  128.   type = (df + *ai)->field_type;
  129.   if (type == TCH || type == TFL)
  130.     {
  131.       ans.cotavg = NCF;
  132.       return (ans);
  133.     }
  134.   rep = ind_ftid (disc, &tid, SLOWSCAN);
  135.   n_avg = agravg (&avg, n_avg, type, disc->cur_key, 0);
  136.   for (; rep != EOI; rep = ind_tid (disc, &tid, SLOWSCAN))
  137.     {
  138.       while ((asp = getpg (&pg, sn, tid.tpn, 's')) == NULL);
  139.       afi = (u2_t *) (asp + phsize);
  140.       ai = afi + tid.tindex;
  141.       if (*ai != 0 &&
  142.               fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  143. {
  144.   n_avg = agravg (&avg, n_avg, type, disc->cur_key, 0);
  145. }
  146.       putpg (&pg, 'n');
  147.     }
  148.   xfree (disc->cur_key);
  149.   delscan (n);
  150.   ans.agr_avg = avg;
  151.   return (ans);
  152. }
  153. struct ans_avg
  154. avgstab (struct id_rel *pidrel)
  155. {
  156.   u2_t pn, *ai, *afi, *ali, kn, type;
  157.   struct des_field *df;
  158.   struct des_trel *destrel;
  159.   char *asp;
  160.   i2_t ntob;
  161.   i4_t n_avg = 0;
  162.   double avg = 0;
  163.   struct A pg;
  164.   struct ans_avg ans;
  165.   if (pidrel->urn.segnum != NRSNUM)
  166.     ans.cotavg = NIOB;
  167.   ntob = pidrel->urn.obnum;
  168.   if (ntob > desnseg.mtobnum)
  169.     ans.cotavg = NIOB;
  170.   destrel = (struct des_trel *) * (desnseg.tobtab + ntob);
  171.   if (destrel == NULL)
  172.     ans.cotavg = NIOB;
  173.   if (((struct prtob *) destrel)->prob != TREL)
  174.     ans.cotavg = NIOB;
  175.   if (((struct prtob *) destrel)->prsort != SORT)
  176.     ans.cotavg = N_SORT;
  177.   df = (struct des_field *) (destrel + 1);
  178.   kn = *(u2_t *) ((char *) destrel + destrel->fieldn * rfsize);
  179.   type = (df + kn)->field_type;
  180.   if (type == TCH || type == TFL)
  181.     {
  182.       ans.cotavg = NCF;
  183.       return (ans);
  184.     }
  185.   for (pn = destrel->tobtr.firstpn; pn != (u2_t) ~ 0;)
  186.     {
  187.       asp = getwl (&pg, NRSNUM, pn);
  188.       afi = (u2_t *) (asp + phtrsize);
  189.       ali = afi + ((struct p_h_tr *) asp)->linptr;
  190.       for (ai = afi; ai <= ali; ai++)
  191. if (*ai != 0)
  192.   n_avg = agravg (&avg, n_avg, type, asp + *ai + 1, kn);
  193.       pn = ((struct listtob *) asp)->nextpn;
  194.       putwul (&pg, 'n');
  195.     }
  196.   ans.agr_avg = avg;
  197.   return (ans);
  198. }
  199. i4_t
  200. fndslc (struct d_r_t *desrel, char *asp, u2_t *ai,
  201.         char *selcon, u2_t slsz, char *cort)
  202. {
  203.   i4_t tuple_size;
  204.   char *tuple;
  205.   unsigned char t;
  206.   u2_t fn, fdf;
  207.   struct des_field * df;
  208.   struct A inpage;
  209.   char *arrpnt[BD_PAGESIZE];
  210.   u2_t arrsz[BD_PAGESIZE];
  211.   tuple = asp + *ai;
  212.   t = *tuple & MSKCORT;
  213.   if (t == CREM || t == IDTR)
  214.     return (0);
  215.   if (t == IND)
  216.     {
  217.       u2_t pn2, ind2;
  218.       ind2 = t2bunpack (tuple + 1);
  219.       pn2 = t2bunpack (tuple + 1 + size2b); 
  220.       while ((asp = getpg (&inpage, desrel->segnr, pn2, 's')) == NULL);
  221.       ai = (u2_t *) (asp + phsize) + ind2;
  222.       tuple = asp + *ai;
  223.     }
  224.   fn = desrel->desrbd.fieldnum;
  225.   fdf = desrel->desrbd.fdfnum;
  226.   df = (struct des_field *) (desrel + 1);
  227.   tuple_size = tstcsel (df, fn, fdf, slsz, selcon, tuple, arrpnt, arrsz);
  228.   if (tuple_size != 0 && cort != NULL)
  229.     bcopy (tuple, cort, tuple_size);
  230.   if (t == IND)
  231.     putpg (&inpage, 'n');
  232.   return (tuple_size);
  233. }
  234. #define BETWEEN_CMP  (t == SS || t == SES || t == SSE || t == SESE)
  235. static int
  236. fcv (i4_t t, u2_t field_type, char **sel_vals, char *tuple_value, u2_t tval_length)
  237. {
  238.   char *b1, *b2;
  239.   i4_t (*f) (char *, char *, u2_t, u2_t);
  240.   u2_t nb1, nb2;
  241.   i4_t v, v1, res;
  242.   if (t == ANY || t == NEQUN)
  243.     return (OK);
  244.   switch (field_type)
  245.     {
  246.     case T1B:
  247.       f = f1b;
  248.       *sel_vals = ftint (t, *sel_vals, &b1, &b2, size1b);
  249.       nb1 = nb2 = size1b;
  250.       break;
  251.     case T2B:
  252.       f = f2b;
  253.       *sel_vals = ftint (t, *sel_vals, &b1, &b2, size2b);
  254.       nb1 = nb2 = size2b;
  255.       break;
  256.     case T4B:
  257.       f = f4b;
  258.       *sel_vals = ftint (t, *sel_vals, &b1, &b2, size4b);
  259.       nb1 = nb2 = size4b;
  260.       break;
  261.     case TFL:
  262.       f = ffloat;
  263.       *sel_vals = ftch (t, *sel_vals, &b1, &b2, &nb1, &nb2);
  264.       tuple_value += size2b;
  265.       tval_length -= size2b;
  266.       break;
  267.     case TCH:
  268.       f = chcmp;
  269.       *sel_vals = ftch (t, *sel_vals, &b1, &b2, &nb1, &nb2);
  270.       tuple_value += size2b;
  271.       tval_length -= size2b;
  272.       break;
  273.     case TFLOAT:
  274.       f = flcmp;
  275.       *sel_vals = ftint (t, *sel_vals, &b1, &b2, size4b);
  276.       nb1 = nb2 = size4b;
  277.       break;
  278.     default:
  279.       f = f1b;
  280.       error ("TR.fcv:That data type isn't existence");
  281.       break;
  282.     }
  283.   
  284.   v = f (tuple_value, b1, tval_length, nb1);
  285.   
  286.   if (v == 0) /* current == first */
  287.     res = (t == EQ || t == SES || t == SESE ||
  288.    t == SMLEQ || t == GRTEQ) ? OK : NCR;
  289.   else
  290.     if (v > 0) /* current > first */
  291.       if (BETWEEN_CMP)
  292. {
  293.   v1 = f (tuple_value, b2, tval_length, nb2); 
  294.   if (v1 == 0) /* current == last */
  295.     res = (t == SSE || t == SESE) ? OK : NCR;
  296.   else 
  297.     res = (v1 > 0) ? NCR : OK;
  298. }
  299.       else
  300. res = (t == NEQ || t == GRT || t == GRTEQ) ? OK : NCR;
  301.     else /* current < first */
  302.       res = (t == SML || t == SMLEQ || t == NEQ) ? OK : NCR;
  303.   
  304.   return res;
  305. }
  306. #undef BETWEEN_CMP
  307. int
  308. tstcsel (struct des_field *df, u2_t f_n, u2_t fdf, u2_t slsz, char *selc,
  309.          char *tuple, char **arrpnt, u2_t *arrsz)
  310. {
  311.   unsigned char t;
  312.   i4_t sst;
  313.   u2_t n = 0;
  314.   char *sel_vals, *pnt;
  315.   int tuple_size;
  316.   tuple_size = tuple_break (tuple, arrpnt, arrsz, df, fdf, f_n);
  317.   if (slsz == 0)
  318.     return (tuple_size);
  319.   sel_vals = selc;
  320.   for (sst = 1; (t = selsc1 (&sel_vals, sst++)) != ENDSC;);
  321.   if (sst % 2 == 0)
  322.     sel_vals++;
  323.   for (sst = 1; (t = selsc1 (&selc, sst++)) != ENDSC && n < f_n; n++)
  324.     {
  325.       if ((pnt = arrpnt[n]) == NULL) /* NULL VALUE */
  326. if(t != EQUN && t != ANY)
  327.   return (0);
  328. else {}
  329.       else
  330.         if (fcv (t, (df + n)->field_type, &sel_vals, pnt, arrsz[n]) != OK)
  331.           return (0);
  332.     }
  333.   return (tuple_size);
  334. }