/**************************************************************************************/
/* File:        demo34                                                                */
/* Project:     ATSQL2 : Safely connected train stations (temporal)                   */
/* Author:      Andreas Steiner                                                       */
/* Date:        02-10-1995                                                            */
/* Results:                                                                           */
/**************************************************************************************/

SET CALENDRIC SYSTEM fiscal;

SET CLOCK TO TIMESTAMP '1995/09/18';

/******************/
/* train stations */
/******************/

CREATE TABLE station(name CHAR(6)) AS VALID AND TRANSACTION;

NONSEQUENCED VALID PERIOD '1996/1/1-forever'
  INSERT INTO station VALUES('a');
NONSEQUENCED VALID PERIOD '1996/6/15-forever'
  INSERT INTO station VALUES('b');
NONSEQUENCED VALID PERIOD '1996/1/1-1997/8/1'
  INSERT INTO station VALUES('c');
NONSEQUENCED VALID PERIOD '1996/1/1-1997/3/12'
  INSERT INTO station VALUES('d');

VALID SELECT * FROM station;

/*
                VALID name
 -------------------- ----
       [1996-forever)    a
 [1996/06/15-forever)    b
       [1996-1997/08)    c
    [1996-1997/03/12)    d
*/


/**********************/
/* direct connections */
/**********************/

CREATE TABLE link(from_station CHAR(10), to_station CHAR(10))
	AS VALID AND TRANSACTION;

NONSEQUENCED VALID PERIOD '1996/6/15-1998/9/22'
  INSERT INTO link VALUES('a','b');
NONSEQUENCED VALID PERIOD '1996/1/1-forever'
  INSERT INTO link VALUES('a','c');
NONSEQUENCED VALID PERIOD '1997/3/8-1998/1/1'
  INSERT INTO link VALUES('b','c');
NONSEQUENCED VALID PERIOD '1996/6/1-1998/3/1'
  INSERT INTO link VALUES('c','d');

VALID SELECT * FROM link;

/*
                   VALID from_station to_station
 ----------------------- ------------ ----------
 [1996/06/15-1998/09/22)            a          b
          [1996-forever)            a          c
       [1997/03/08-1998)            b          c
       [1996/06-1998/03)            c          d
*/

 
/***************/
/* connections */
/***************/

CREATE TABLE connected(from_station CHAR(10), to_station CHAR(10))
	AS VALID AND TRANSACTION;

VALID
  INSERT INTO connected
    SELECT A1.from_station, A1.to_station
    FROM   link A1, station A2, station A3
    WHERE  A1.from_station = A2.name
    AND    A1.to_station = A3.name;

VALID
  INSERT INTO connected
    SELECT A1.from_station, A2.to_station
    FROM   connected A1, connected A2
    WHERE  A1.to_station=A2.from_station
    EXCEPT
    SELECT * FROM connected A0;

VALID
  INSERT INTO connected
    SELECT A1.from_station, A2.to_station
    FROM   connected A1, connected A2
    WHERE  A1.to_station=A2.from_station
    EXCEPT
    SELECT * FROM connected A0;


VALID SELECT * FROM connected;

/*
                   VALID from_station to_station
 ----------------------- ------------ ----------
 [1996/06/15-1998/09/22)            a          b
          [1996-1997/08)            a          c
    [1997/03/08-1997/08)            b          c
    [1996/06-1997/03/12)            c          d
    [1996/06-1997/03/12)            a          d
 [1997/03/08-1997/03/12)            b          d
*/



/**************/
/* circumvent */
/**************/

CREATE TABLE circumvent(inter CHAR(10), from_station CHAR(10), to_station CHAR(10))
	AS VALID AND TRANSACTION;

VALID
  INSERT INTO circumvent
    SELECT A1.name, A2.from_station, A2.to_station
    FROM   station A1, link A2
    WHERE  A1.name<>A2.to_station AND A1.name<>A2.from_station;

VALID
  INSERT INTO circumvent
    SELECT a1.inter, A1.from_station, A2.to_station
    FROM   circumvent A1, circumvent A2
    WHERE  A1.inter=A2.inter AND A1.to_station=A2.from_station
  EXCEPT
    SELECT *
    FROM circumvent A0;

VALID
  INSERT INTO circumvent
    SELECT a1.inter, A1.from_station, A2.to_station
    FROM   circumvent A1, circumvent A2
    WHERE  A1.inter=A2.inter AND A1.to_station=A2.from_station
  EXCEPT
    SELECT * FROM circumvent A0;

VALID SELECT * FROM circumvent;

/*
                   VALID inter from_station to_station
 ----------------------- ----- ------------ ----------
       [1997/03/08-1998)     a            b          c
       [1996/06-1998/03)     a            c          d
    [1996/06/15-forever)     b            a          c
    [1996/06/15-1998/03)     b            c          d
    [1996/06/15-1997/08)     c            a          b
 [1996/06/15-1997/03/12)     d            a          b
       [1996-1997/03/12)     d            a          c
 [1997/03/08-1997/03/12)     d            b          c
       [1997/03/08-1998)     a            b          d
    [1996/06/15-1998/03)     b            a          d
*/



/**************/
/* DEMO STUFF */
/**************/

/* safely connected stations */
/* ------------------------- */

CREATE TABLE safe(from_station char(10), to_station CHAR(10)) 
	AS VALID AND TRANSACTION;

VALID 
  INSERT INTO safe 
    SELECT A1.from_station, A1.to_station 
    FROM   connected A1 
    WHERE  NOT EXISTS (SELECT * 
                       FROM   station A2 
                       WHERE  NOT EXISTS (SELECT * 
                                          FROM   circumvent A3 
                                          WHERE  A1.to_station = A3.to_station 
                                          AND    A1.from_station = A3.from_station 
                                          AND    A2.name = A3.inter)
                       AND    A2.name <> A1.to_station 
                       AND    A2.name <> A1.from_station) 
   EXCEPT 
    SELECT * FROM safe A0;

VALID AND TRANSACTION SELECT * FROM safe;

/*
          TRANSACTION                   VALID from_station to_station
 -------------------- ----------------------- ------------ ----------
 [1995/09/18-forever) [1996/06/15-1998/09/22)            a          b
 [1995/09/18-forever)          [1996-1997/08)            a          c
 [1995/09/18-forever)    [1997/03/08-1997/08)            b          c
 [1995/09/18-forever)    [1996/06-1997/03/12)            c          d
*/


VALID
  SELECT A1.to_station
  FROM   connected A1 
  WHERE  NOT EXISTS (SELECT * 
                     FROM   safe A2 
                     WHERE  A1.to_station = A2.to_station
                    AND    'a' = A2.from_station) 
  AND    'a' = A1.from_station;

/*
                VALID a1.to_station
 -------------------- -------------
 [1996/06-1997/03/12)             d
*/



DROP TABLE station;
DROP TABLE link;
DROP TABLE connected;
DROP TABLE circumvent;
DROP TABLE safe;
