-- 
-- Created by SQL::Translator::Producer::PostgreSQL
-- Created on Mon Jul  8 19:18:41 2013
-- 
--
-- Table: just_a_table.
--
DROP TABLE "just_a_table" CASCADE;
CREATE TABLE "just_a_table" (
  "id" serial NOT NULL,
  "name" character varying(255) NOT NULL,
  PRIMARY KEY ("id")
);

--
-- Table: mixin.
--
DROP TABLE "mixin" CASCADE;
CREATE TABLE "mixin" (
  "id" serial NOT NULL,
  "words" text NOT NULL,
  PRIMARY KEY ("id")
);

--
-- Table: _bar.
--
DROP TABLE "_bar" CASCADE;
CREATE TABLE "_bar" (
  "id" integer NOT NULL,
  "b" integer NOT NULL,
  PRIMARY KEY ("id")
);
CREATE INDEX "_bar_idx_b" on "_bar" ("b");

--
-- Table: _foo.
--
DROP TABLE "_foo" CASCADE;
CREATE TABLE "_foo" (
  "id" serial NOT NULL,
  "a" integer,
  PRIMARY KEY ("id")
);
CREATE INDEX "_foo_idx_a" on "_foo" ("a");

--
-- View: "foo"
--
DROP VIEW "foo";
CREATE VIEW "foo" ( "id", "a" ) AS
    SELECT _foo.id, a FROM _foo;

CREATE OR REPLACE FUNCTION foo_insert
  (_a INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    INSERT INTO _foo ( a) VALUES ( _a );
  END;
$function$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION foo_update
  (_id INTEGER, _a INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    UPDATE _foo SET a = _a WHERE ( id = _id );
  END;
$function$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION foo_delete
  (_id INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    DELETE FROM _foo WHERE ( id = _id );
  END;
$function$ LANGUAGE plpgsql;


CREATE RULE _foo_insert_rule AS
  ON INSERT TO foo
  DO INSTEAD (
    SELECT foo_insert(NEW.a)
  );


CREATE RULE _foo_update_rule AS
  ON UPDATE TO foo
  DO INSTEAD (
    SELECT foo_update(OLD.id, NEW.a)
  );


CREATE RULE _foo_delete_rule AS
  ON DELETE TO foo
  DO INSTEAD (
    SELECT foo_delete(OLD.id)
  );

;

--
-- View: "bar"
--
DROP VIEW "bar";
CREATE VIEW "bar" ( "id", "a", "words", "b" ) AS
    SELECT _bar.id, a, words, b FROM _bar _bar  JOIN mixin mixin ON mixin.id = _bar.id  JOIN foo foo ON foo.id = _bar.id;

CREATE OR REPLACE FUNCTION bar_insert
  (_a INTEGER, _words TEXT, _b INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    INSERT INTO foo ( a) VALUES ( _a );
    INSERT INTO _bar ( b, id) VALUES ( _b, currval('_foo_id_seq') );
    INSERT INTO mixin ( id, words) VALUES ( currval('_foo_id_seq'), _words );
  END;
$function$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION bar_update
  (_id INTEGER, _a INTEGER, _words TEXT, _b INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    UPDATE _bar SET b = _b WHERE ( id = _id );
    UPDATE mixin SET words = _words WHERE ( id = _id );
    UPDATE foo SET a = _a WHERE ( id = _id );
  END;
$function$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION bar_delete
  (_id INTEGER)
  RETURNS VOID AS $function$
  BEGIN
    DELETE FROM _bar WHERE ( id = _id );
    DELETE FROM mixin WHERE ( id = _id );
    DELETE FROM foo WHERE ( id = _id );
  END;
$function$ LANGUAGE plpgsql;


CREATE RULE _bar_insert_rule AS
  ON INSERT TO bar
  DO INSTEAD (
    SELECT bar_insert(NEW.a, NEW.words, NEW.b)
  );


CREATE RULE _bar_update_rule AS
  ON UPDATE TO bar
  DO INSTEAD (
    SELECT bar_update(OLD.id, NEW.a, NEW.words, NEW.b)
  );


CREATE RULE _bar_delete_rule AS
  ON DELETE TO bar
  DO INSTEAD (
    SELECT bar_delete(OLD.id)
  );

;

--
-- Foreign Key Definitions
--

ALTER TABLE "_bar" ADD CONSTRAINT "_bar_fk_b" FOREIGN KEY ("b")
  REFERENCES "just_a_table" ("id") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;

ALTER TABLE "_foo" ADD CONSTRAINT "_foo_fk_a" FOREIGN KEY ("a")
  REFERENCES "_bar" ("id") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;