From 3e434b9b6b80e63c080d15a5649e1597165c594c Mon Sep 17 00:00:00 2001
From: Joris van Zwieten <zwieten@astron.nl>
Date: Mon, 22 Jan 2007 17:47:36 +0000
Subject: [PATCH] BugID: 987 - API change: added get_next_step() that gets the
 next work order that is also a step. It   returns both the work order id and
 the attributes of the step (iface_step).

---
 .../sql/create_blackboard_functions.sql       | 95 +++++++++++++++----
 .../sql/create_blackboard_tables.sql          |  2 +-
 .../sql/create_blackboard_triggers.sql        |  2 +-
 3 files changed, 80 insertions(+), 19 deletions(-)

diff --git a/CEP/BB/BBSControl/sql/create_blackboard_functions.sql b/CEP/BB/BBSControl/sql/create_blackboard_functions.sql
index 7d8d0f6b38c..570a18c9d8a 100644
--- a/CEP/BB/BBSControl/sql/create_blackboard_functions.sql
+++ b/CEP/BB/BBSControl/sql/create_blackboard_functions.sql
@@ -1,24 +1,23 @@
 -- -------- --
 -- STRATEGY --
 -- -------- --
--- Function: blackboard.set_strategy
--- Full signature:
--- blackboard.set_strategy("DataSet" TEXT, "ParmDB.LocalSky" TEXT, "ParmDB.Instrument" TEXT, "ParmDB.History" TEXT, "Stations" TEXT[], "InputData" TEXT, "WorkDomainSize.Freq" DOUBLE PRECISION, "WorkDomainSize.Time" DOUBLE PRECISION, "Correlation.Selection" TEXT, "Correlation.Type" TEXT[])
-CREATE OR REPLACE FUNCTION blackboard.set_strategy(TEXT, TEXT, TEXT, TEXT, TEXT[], TEXT, DOUBLE PRECISION, DOUBLE PRECISION, TEXT, TEXT[])
+CREATE OR REPLACE FUNCTION blackboard.set_strategy(strategy blackboard.strategy)
 RETURNS VOID AS
 $$
-    INSERT INTO blackboard.strategy("DataSet", "ParmDB.LocalSky", "ParmDB.Instrument", "ParmDB.History", "Stations", "InputData", "WorkDomainSize.Freq", "WorkDomainSize.Time", "Correlation.Selection", "Correlation.Type")
-        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
+    BEGIN
+        INSERT
+            INTO blackboard.strategy
+            VALUES (strategy);
+    END;
 $$
-LANGUAGE SQL;
+LANGUAGE plpgsql;
 
 
 CREATE OR REPLACE FUNCTION blackboard.get_strategy()
 RETURNS blackboard.strategy AS
 $$
     SELECT *
-        FROM blackboard.strategy
-        LIMIT 1;
+        FROM blackboard.strategy;
 $$
 LANGUAGE SQL;
 
@@ -33,7 +32,8 @@ $$
         _id INTEGER;
     BEGIN
         _id := nextval('blackboard.work_order_id_seq');
-        INSERT INTO blackboard.work_order(id)
+        INSERT
+            INTO blackboard.work_order(id)
             VALUES (_id);
 
         RETURN _id;
@@ -48,7 +48,7 @@ $$
     SELECT *
         FROM blackboard.work_order
         WHERE id > $1
-        ORDER BY id LIMIT 1;
+        ORDER BY id;
 $$
 LANGUAGE SQL;
 
@@ -82,13 +82,46 @@ CREATE TYPE blackboard.iface_solve_arguments AS
 );
 
 
+-- Function: blackboard.get_next_step
+-- Full signature:
+-- blackboard.get_next_step(_current_work_order_id INTEGER)
+--
+-- This function is a 'combination' of get_next_work_order and
+-- get_next_step. Therefore, it has to return a combination of
+-- a work_order_id and an iface_step. We could define a separate
+-- iface composite type for this, but then we would have two
+-- interface definitions for a step. Instead, we just return a
+-- row from the step table. Of course, this is not very clean.
+-- Therefore, it is recommended to use get_next_work_order and
+-- get_step sequentially.
+CREATE OR REPLACE FUNCTION blackboard.get_next_step(INTEGER)
+RETURNS blackboard.step AS
+$$
+    SELECT blackboard.step.*
+        FROM blackboard.work_order, blackboard.step
+        WHERE blackboard.work_order.id > $1
+        AND blackboard.work_order.id = blackboard.step.work_order_id
+        ORDER BY blackboard.work_order.id;
+$$
+LANGUAGE SQL;
+
+
 -- Function: blackboard.get_step
 -- Full signature:
 -- blackboard.get_step(_work_order_id INTEGER)
 CREATE OR REPLACE FUNCTION blackboard.get_step(INTEGER)
 RETURNS blackboard.iface_step AS
 $$
-    SELECT "Name", "Operation", "Baselines.Station1", "Baselines.Station2", "Correlation.Selection", "Correlation.Type", "Sources", "InstrumentModel", "OutputData"
+    SELECT
+        "Name",
+        "Operation",
+        "Baselines.Station1",
+        "Baselines.Station2",
+        "Correlation.Selection",
+        "Correlation.Type",
+        "Sources",
+        "InstrumentModel",
+        "OutputData"
         FROM blackboard.step
         WHERE blackboard.step.work_order_id = $1;
 $$
@@ -114,8 +147,14 @@ $$
             RAISE EXCEPTION 'Work order % either is not a solve step or it is not a step at all.', $1;
         END IF;
 
-
-        SELECT "MaxIter", "Epsilon", "MinConverged", "Parms", "ExclParms", "DomainSize.Freq", "DomainSize.Time"
+        SELECT
+            "MaxIter",
+            "Epsilon",
+            "MinConverged",
+            "Parms",
+                "ExclParms",
+            "DomainSize.Freq",
+            "DomainSize.Time"
             INTO arguments
             FROM blackboard.solve_arguments
             WHERE step_id = step.id;
@@ -138,9 +177,22 @@ $$
     BEGIN
         _work_order_id := blackboard.add_work_order();
         _id := nextval('blackboard.step_id_seq');
-        INSERT INTO blackboard.step(id, work_order_id, "Name", "Operation", "Baselines.Station1", "Baselines.Station2", "Correlation.Selection", "Correlation.Type", "Sources", "InstrumentModel", "OutputData")
+        
+         INSERT
+            INTO blackboard.step
+                (id,
+                work_order_id,
+                "Name",
+                "Operation",
+                "Baselines.Station1",
+                "Baselines.Station2",
+                "Correlation.Selection",
+                "Correlation.Type",
+                "Sources",
+                "InstrumentModel",
+                "OutputData")
             VALUES (_id, _work_order_id, $1, $2, $3, $4, $5, $6, $7, $8, $9);
-
+                
         RETURN _id;
     END;
 $$
@@ -190,7 +242,16 @@ $$
         _step_id INTEGER;
     BEGIN
         _step_id := blackboard.add_step($1, 'SOLVE', $2, $3, $4, $5, $6, $7, $8);
-        INSERT INTO blackboard.solve_arguments(step_id, "MaxIter", "Epsilon", "MinConverged", "Parms", "ExclParms", "DomainSize.Freq", "DomainSize.Time")
+        INSERT
+            INTO blackboard.solve_arguments
+                (step_id,
+                "MaxIter",
+                "Epsilon",
+                "MinConverged",
+                "Parms",
+                "ExclParms",
+                "DomainSize.Freq",
+                "DomainSize.Time")
             VALUES (_step_id, $9, $10, $11, $12, $13, $14, $15);
     END;
 $$
diff --git a/CEP/BB/BBSControl/sql/create_blackboard_tables.sql b/CEP/BB/BBSControl/sql/create_blackboard_tables.sql
index ce8105a7a84..2a462b2bd93 100644
--- a/CEP/BB/BBSControl/sql/create_blackboard_tables.sql
+++ b/CEP/BB/BBSControl/sql/create_blackboard_tables.sql
@@ -16,7 +16,7 @@ CREATE TABLE blackboard.strategy
 );
 
 
--- A work_order contains all the attributes needed for job control,
+-- A work_order contains all the attributes needed for control,
 -- so the structure of 'step' is not polluted. In the future, it may also
 -- be used as a generalisation for different types of commands (i.e. if
 -- we define commands besides executing steps, e.g. explicit data caching).
diff --git a/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql b/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql
index a6430b69f02..f3a6c1104a8 100644
--- a/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql
+++ b/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql
@@ -8,4 +8,4 @@ $$
 LANGUAGE plpgsql;
 
 
-CREATE TRIGGER trigger_work_order AFTER INSERT ON blackboard.work_order FOR EACH STATEMENT EXECUTE PROCEDURE blackboard.notify_client();
+CREATE TRIGGER insert_work_order AFTER INSERT ON blackboard.work_order FOR EACH STATEMENT EXECUTE PROCEDURE blackboard.notify_client();
-- 
GitLab