/**************************************************************************************/
/* File:        demo33                                                                */
/* Project:     ATSQL2 : Workshop Demo                                                */
/* Author:      Andreas Steiner                                                       */
/* Date:        19-06-1995                                                            */
/* Results:                                                                           */
/**************************************************************************************/

set clock to timestamp '1995/9/18';

create table empl(eno integer, ename char(10)) as valid and transaction;
create table dept(eno integer, dname char(10)) as valid and transaction;
create table sal(eno integer, amount integer) as valid and transaction;

create table exceptions(eno integer) as valid and transaction;


nonsequenced valid period '1991/3/15-1999/12/31'
  insert into empl values(081,'Fred');
nonsequenced valid period '1990/10/2-1999/12/31'
  insert into empl values(175,'Bill');
nonsequenced valid period '1990/4/2-1992/3/15'
  insert into empl values(187,'Tom');

nonsequenced valid period '1991/3/15-1999/12/31'
  insert into dept values(081,'Research');
nonsequenced valid period '1990/10/2-1999/12/31'
  insert into dept values(175,'Sales');
nonsequenced valid period '1991/2/15-1992/3/31'
  insert into dept values(187,'Sales');
nonsequenced valid period '1990/4/2-1991/2/15'
  insert into dept values(187,'Research');

nonsequenced valid period '1992/1/21-1993/1/14'
  insert into sal values(081,4600);
nonsequenced valid period '1991/5/15-1999/12/31'
  insert into sal values(175,4910);
nonsequenced valid period '1990/4/2-1992/2/31'
  insert into sal values(187,4800);
nonsequenced valid period '1990/10/2-1991/5/15'
  insert into sal values(175,4800);
nonsequenced valid period '1991/3/15-1992/1/21'
  insert into sal values(081,4500);
nonsequenced valid period '1993/1/14-1999/12/31'
  insert into sal values(081,5000);

nonsequenced valid period '1996/6/12-1999/12/31'
  insert into exceptions values(081);

valid select * from empl;

/*
                    VALID       eno     ename
 ------------------------ --------- ---------
  [1991/03/15-1999/12/31)        81      Fred
  [1990/10/02-1999/12/31)       175      Bill
  [1990/04/02-1992/03/15)       187       Tom
 */


valid select * from dept;

/*
                    VALID       eno     dname
 ------------------------ --------- ---------
  [1991/03/15-1999/12/31)        81  Research
  [1990/10/02-1999/12/31)       175     Sales
  [1991/02/15-1992/03/31)       187     Sales
  [1990/04/02-1991/02/15)       187  Research
*/

valid select * from sal;

/*
                    VALID       eno    amount
 ------------------------ --------- ---------
  [1992/01/21-1993/01/14)        81      4600
  [1991/05/15-1999/12/31)       175      4910
  [1990/04/02-1992/02/31)       187      4800
  [1990/10/02-1991/05/15)       175      4800
  [1991/03/15-1992/01/21)        81      4500
  [1993/01/14-1999/12/31)        81      5000
*/


valid select * from exceptions;

/*
                    VALID       eno
 ------------------------ ---------
  [1996/06/12-1999/12/31)        81
*/



/* *** temporal semi-completeness *** */
/* Which researchers earn more than the best paid salesman? */

VALID
SELECT e1.eno, e1.ename, amount
FROM   empl e1, dept d1, sal s1
WHERE  d1.dname = 'Research'
AND    e1.eno = s1.eno
AND    e1.eno = d1.eno
AND    NOT EXISTS (SELECT *
                   FROM   dept d2, sal s2
                   WHERE  d2.eno = s2.eno
                   AND    s2.amount > s1.amount);

/*
                    VALID    e1.eno  e1.ename    amount
 ------------------------ --------- --------- ---------
  [1993/01/14-1999/12/31)        81      Fred      5000
  [1990/04/02-1991/02/15)       187       Tom      4800
*/


VALID
SELECT e1.eno
FROM   empl e1, dept d1, sal s1
WHERE  d1.dname = 'Research'
AND    e1.eno = s1.eno
AND    e1.eno = d1.eno
AND    NOT EXISTS (SELECT *
                   FROM   dept d2, sal s2
                   WHERE  d2.eno = s2.eno
                   AND    s2.amount > s1.amount)
EXCEPT
SELECT * FROM exceptions;

/*
                    VALID    e1.eno
 ------------------------ ---------
  [1990/04/02-1991/02/15)       187
  [1993/01/14-1996/06/12)        81
*/



/* *** temporal completeness *** */
/* What department worked Tom for immediately after he left the 
   research department? */

NONSEQUENCED VALID
SELECT new, valid(a1), valid(a2)
FROM   (VALID
        SELECT dname old
        FROM   empl e, dept d
        WHERE  e.eno = d.eno
        AND    d.dname = 'Research'
        AND    e.ename = 'Tom') a1,
       (VALID
        SELECT dname new
        FROM   empl e, dept d
        WHERE  e.eno = d.eno
        AND    d.dname = 'Sales'
        AND    e.ename = 'Tom') a2
WHERE  valid(a1) MEETS valid(a2);

/*
       new                valid(a1)                valid(a2)
 --------- ------------------------ ------------------------
     Sales  [1990/04/02-1991/02/15)  [1991/02/15-1992/03/15)
*/

 

/* *** coalescing *** */
/* How long have any people been employed? */


VALID (SELECT 1 FROM empl) (PERIOD);

/*
                    VALID         1
 ------------------------ ---------
  [1990/04/02-1999/12/31)         1
*/


/* *** assertion *** */
/* Every employee must have a salary */

CREATE ASSERTION emp_has_salary 
  VALID CHECK (
    NOT EXISTS( 
           SELECT * 
           FROM   empl e 
           WHERE  NOT EXISTS (SELECT *
                              FROM   sal s
                              WHERE  e.eno = s.eno)));

CHECK;


/*** delete ***/
/* Delete those employees who don't have salaries */

VALID 
DELETE FROM empl e
WHERE NOT EXISTS (SELECT *
                  FROM   sal s
                  WHERE  e.eno = s.eno);

VALID SELECT * FROM empl;

/*
                    VALID       eno     ename
 ------------------------ --------- ---------
  [1991/03/15-1999/12/31)        81      Fred
  [1990/10/02-1999/12/31)       175      Bill
  [1990/04/02-1992/02/31)       187       Tom
*/


CHECK;

/*** views ***/
/* Who earns more than 4800 and when ? */

CREATE VIEW big_sal AS
  VALID 
  SELECT e.ename, s.amount
  FROM   empl e, sal s
  WHERE  s.amount > 4800
  AND    s.eno = e.eno;


VALID 
SELECT * 
FROM   big_sal
WHERE  interval(valid(big_sal)) > interval '7' year;

/*
                    VALID     ename    amount
 ------------------------ --------- ---------
  [1991/05/15-1999/12/31)      Bill      4910
*/


drop table empl;
drop table sal;
drop table dept;
drop table exceptions;
drop view big_sal;
drop assertion emp_has_salary;
