[open-ils-commits] r15044 - in trunk/Open-ILS: examples src/sql/Pg src/sql/Pg/upgrade (scottmk)
svn at svn.open-ils.org
svn at svn.open-ils.org
Mon Nov 30 12:51:08 EST 2009
Author: scottmk
Date: 2009-11-30 12:51:05 -0500 (Mon, 30 Nov 2009)
New Revision: 15044
Added:
trunk/Open-ILS/src/sql/Pg/008.schema.sql.sql
trunk/Open-ILS/src/sql/Pg/upgrade/0097.schema.sql-datatype.sql
Modified:
trunk/Open-ILS/examples/fm_IDL.xml
trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
Log:
Create a new schema "sql" to represent stored queries.
Note: the 008.schema.sql.sql file defines the entire schema,
except for updatable views (which will be defined later).
However the upgrade file 0097.schema.sql-datatype.sql
only adds four tables; likewise for the update to fm_IDL.xml.
The other tables will be added in due course, but in the
meanwhile there will be some tables defined in the schema
file that haven't been added yet by the upgrades.
M Open-ILS/src/sql/Pg/002.schema.config.sql
A Open-ILS/src/sql/Pg/upgrade/0097.schema.sql-datatype.sql
A Open-ILS/src/sql/Pg/008.schema.sql.sql
M Open-ILS/examples/fm_IDL.xml
Modified: trunk/Open-ILS/examples/fm_IDL.xml
===================================================================
--- trunk/Open-ILS/examples/fm_IDL.xml 2009-11-30 16:31:21 UTC (rev 15043)
+++ trunk/Open-ILS/examples/fm_IDL.xml 2009-11-30 17:51:05 UTC (rev 15044)
@@ -5333,7 +5333,63 @@
</links>
</class>
+ <class id="qdt" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="sql::datatype" oils_persist:tablename="sql.datatype" reporter:label="Datatype">
+ <fields oils_persist:primary="id" oils_persist:sequence="sql.datatype_id_seq">
+ <field reporter:label="Datatype ID" name="id" reporter:datatype="id"/>
+ <field reporter:label="Datatype Name" name="datatype_name" reporter:datatype="text"/>
+ <field reporter:label="Is Numeric" name="is_numeric" reporter:datatype="bool"/>
+ <field reporter:label="Is Composite" name="is_composite" reporter:datatype="bool"/>
+ </fields>
+ <links>
+ </links>
+ <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+ </permacrud>
+ </class>
+ <class id="qsf" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="sql::subfield" oils_persist:tablename="sql.subfield" reporter:label="Subfield">
+ <fields oils_persist:primary="id" oils_persist:sequence="sql.subfield_id_seq">
+ <field reporter:label="Subfield ID" name="id" reporter:datatype="id"/>
+ <field reporter:label="Composite Type" name="composite_type" reporter:datatype="link"/>
+ <field reporter:label="Sequence Number" name="seq_no" reporter:datatype="int"/>
+ <field reporter:label="Subfield Type" name="subfield_type" reporter:datatype="link"/>
+ </fields>
+ <links>
+ <link field="composite_type" reltype="has_a" key="id" map="" class="qdt"/>
+ <link field="subfield_type" reltype="has_a" key="id" map="" class="qdt"/>
+ </links>
+ <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+ </permacrud>
+ </class>
+
+ <class id="qfs" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="sql::function_sig" oils_persist:tablename="sql.function_sig" reporter:label="Function Signature">
+ <fields oils_persist:primary="id" oils_persist:sequence="sql.function_sig_id_seq">
+ <field reporter:label="Function Signature ID" name="id" reporter:datatype="id"/>
+ <field reporter:label="Function Name" name="function_name" reporter:datatype="text"/>
+ <field reporter:label="Return Type" name="return_type" reporter:datatype="link"/>
+ <field reporter:label="Is Aggregate" name="is_aggregate" reporter:datatype="bool"/>
+ </fields>
+ <links>
+ <link field="return_type" reltype="might_have" key="id" map="" class="qdt"/>
+ </links>
+ <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+ </permacrud>
+ </class>
+
+ <class id="qfpd" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="sql::function_param_def" oils_persist:tablename="sql.function_param_def" reporter:label="Function Parameter Definition">
+ <fields oils_persist:primary="id" oils_persist:sequence="sql.function_param_def_id_seq">
+ <field reporter:label="Function Param Def ID" name="id" reporter:datatype="id"/>
+ <field reporter:label="Function ID" name="function_id" reporter:datatype="link"/>
+ <field reporter:label="Sequence Number" name="seq_no" reporter:datatype="int"/>
+ <field reporter:label="Datatype" name="datatype" reporter:datatype="link"/>
+ </fields>
+ <links>
+ <link field="function_id" reltype="has_a" key="id" map="" class="qfs"/>
+ <link field="datatype" reltype="has_a" key="id" map="" class="qdt"/>
+ </links>
+ <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+ </permacrud>
+ </class>
+
<!-- ********************************************************************************************************************* -->
<!-- What follows is a set of example extensions that are useful for PINES. Comment out or remove if you don't want them. -->
<!-- ********************************************************************************************************************* -->
Modified: trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/002.schema.config.sql 2009-11-30 16:31:21 UTC (rev 15043)
+++ trunk/Open-ILS/src/sql/Pg/002.schema.config.sql 2009-11-30 17:51:05 UTC (rev 15044)
@@ -51,7 +51,7 @@
install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-INSERT INTO config.upgrade_log (version) VALUES ('0096'); -- berick
+INSERT INTO config.upgrade_log (version) VALUES ('0097'); -- Scott McKellar
CREATE TABLE config.bib_source (
id SERIAL PRIMARY KEY,
Added: trunk/Open-ILS/src/sql/Pg/008.schema.sql.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/008.schema.sql.sql (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/008.schema.sql.sql 2009-11-30 17:51:05 UTC (rev 15044)
@@ -0,0 +1,261 @@
+-- Script to create the sql schema and the tables therein
+
+BEGIN;
+
+DROP SCHEMA IF EXISTS sql CASCADE;
+CREATE SCHEMA sql;
+COMMENT ON SCHEMA sql is $$
+/*
+ * Copyright (C) 2009 Equinox Software, Inc. / Georgia Public Library Service
+ * Scott McKellar <scott at esilibrary.com>
+ *
+ * Schema: sql
+ *
+ * Contains tables designed to represent SQL queries for use in
+ * reports and the like.
+ *
+ * ****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+$$;
+
+CREATE TABLE sql.stored_query (
+ id SERIAL PRIMARY KEY,
+ type TEXT NOT NULL CONSTRAINT query_type CHECK
+ ( type IN ( 'SELECT', 'UNION', 'INTERSECT', 'EXCEPT' ) ),
+ use_all BOOLEAN NOT NULL DEFAULT FALSE,
+ use_distinct BOOLEAN NOT NULL DEFAULT FALSE,
+ from_clause INT NOT NULL , --REFERENCES sql.from_clause
+ where_clause INT , --REFERENCES sql.expression
+ --DEFERRABLE INITIALLY DEFERRED,
+ having_clause INT --REFERENCES sql.expression
+ --DEFERRABLE INITIALLY DEFERRED
+);
+
+-- (Foreign keys to be defined later after other tables are created)
+
+CREATE TABLE sql.query_sequence (
+ id SERIAL PRIMARY KEY,
+ parent_query INT NOT NULL
+ REFERENCES sql.stored_query
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL,
+ child_query INT NOT NULL
+ REFERENCES sql.stored_query
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT sql_query_seq UNIQUE( parent_query, seq_no )
+);
+
+CREATE TABLE sql.datatype (
+ id SERIAL PRIMARY KEY,
+ datatype_name TEXT NOT NULL UNIQUE,
+ is_numeric BOOL NOT NULL DEFAULT FALSE,
+ is_composite BOOL NOT NULL DEFAULT FALSE,
+ CONSTRAINT qdt_comp_not_num CHECK
+ ( is_numeric IS FALSE OR is_composite IS FALSE )
+);
+
+CREATE TABLE sql.subfield (
+ id SERIAL PRIMARY KEY,
+ composite_type INT NOT NULL
+ REFERENCES sql.datatype(id)
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL
+ CONSTRAINT qsf_pos_seq_no
+ CHECK( seq_no > 0 ),
+ subfield_type INT NOT NULL
+ REFERENCES sql.datatype(id)
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
+);
+
+CREATE TABLE sql.function_sig (
+ id SERIAL PRIMARY KEY,
+ function_name TEXT NOT NULL,
+ return_type INT REFERENCES sql.datatype(id)
+ DEFERRABLE INITIALLY DEFERRED,
+ is_aggregate BOOL NOT NULL DEFAULT FALSE,
+ CONSTRAINT qfd_rtn_or_aggr CHECK
+ ( return_type IS NULL OR is_aggregate = FALSE )
+);
+
+CREATE INDEX sql_function_sig_name_idx
+ ON sql.function_sig (function_name);
+
+CREATE TABLE sql.function_param_def (
+ id SERIAL PRIMARY KEY,
+ function_id INT NOT NULL
+ REFERENCES sql.function_sig( id )
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL
+ CONSTRAINT qfpd_pos_seq_no CHECK
+ ( seq_no > 0 ),
+ datatype INT NOT NULL
+ REFERENCES sql.datatype( id )
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
+);
+
+CREATE TABLE sql.expression (
+ id SERIAL PRIMARY KEY,
+ type TEXT NOT NULL CONSTRAINT predicate_type CHECK
+ ( type IN (
+ 'xbet', -- between
+ 'xbool', -- boolean
+ 'xcase', -- case
+ 'xcast', -- cast
+ 'xcol', -- column
+ 'xex', -- exists
+ 'xfld', -- field
+ 'xfunc', -- function
+ 'xin', -- in
+ 'xnbet', -- not between
+ 'xnex', -- not exists
+ 'xnin', -- not in
+ 'xnull', -- null
+ 'xnum', -- number
+ 'xop', -- operator
+ 'xstr', -- string
+ 'xsubq' -- subquery
+ ) ),
+ parenthesize BOOL NOT NULL DEFAULT FALSE,
+ parent_expr INT REFERENCES sql.expression
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL DEFAULT 1,
+ literal TEXT,
+ table_alias TEXT,
+ column_name TEXT,
+ left_operand INT REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ operator TEXT,
+ right_operand INT REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ function_id INT REFERENCES sql.function_sig
+ DEFERRABLE INITIALLY DEFERRED,
+ subquery INT REFERENCES sql.stored_query
+ DEFERRABLE INITIALLY DEFERRED,
+ cast_type INT REFERENCES sql.datatype
+ DEFERRABLE INITIALLY DEFERRED
+);
+
+CREATE UNIQUE INDEX sql_expr_parent_seq
+ ON sql.expression( parent_expr, seq_no )
+ WHERE parent_expr IS NOT NULL;
+
+-- Due to some circular references, the following foreign key definitions
+-- had to be deferred until sql.expression existed:
+
+ALTER TABLE sql.stored_query
+ ADD FOREIGN KEY ( where_clause )
+ REFERENCES sql.expression( id )
+ DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE sql.stored_query
+ ADD FOREIGN KEY ( having_clause )
+ REFERENCES sql.expression( id )
+ DEFERRABLE INITIALLY DEFERRED;
+
+CREATE TABLE sql.case_branch (
+ id SERIAL PRIMARY KEY,
+ parent_expr INT NOT NULL REFERENCES sql.expression
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL,
+ condition INT REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ result INT NOT NULL REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
+);
+
+CREATE TABLE sql.from_relation (
+ id SERIAL PRIMARY KEY,
+ type TEXT NOT NULL CONSTRAINT relation_type CHECK (
+ type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
+ table_name TEXT,
+ class_name TEXT,
+ subquery INT REFERENCES sql.stored_query,
+ function_call INT REFERENCES sql.expression,
+ table_alias TEXT NOT NULL,
+ parent_relation INT REFERENCES sql.from_relation
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL DEFAULT 1,
+ join_type TEXT CONSTRAINT good_join_type CHECK (
+ join_type IS NULL OR join_type IN
+ ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
+ ),
+ on_clause INT REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT join_or_core CHECK (
+ ( parent_relation IS NULL AND join_type IS NULL
+ AND on_clause IS NULL and table_alias IS NULL )
+ OR
+ ( parent_relation IS NOT NULL AND join_type IS NOT NULL
+ AND on_clause IS NOT NULL )
+ )
+);
+
+CREATE UNIQUE INDEX from_parent_seq
+ ON sql.from_relation( parent_relation, seq_no )
+ WHERE parent_relation IS NOT NULL;
+
+-- The following foreign key had to be deferred until
+-- sql.from_relation existed
+
+ALTER TABLE sql.stored_query
+ ADD FOREIGN KEY (from_clause)
+ REFERENCES sql.from_relation
+ DEFERRABLE INITIALLY DEFERRED;
+
+CREATE TABLE sql.record_column (
+ id SERIAL PRIMARY KEY,
+ from_relation INT NOT NULL REFERENCES sql.from_relation
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL,
+ column_name TEXT NOT NULL,
+ column_type TEXT NOT NULL,
+ CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
+);
+
+CREATE TABLE sql.select_item (
+ id SERIAL PRIMARY KEY,
+ stored_query INT NOT NULL REFERENCES sql.stored_query
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL,
+ expression INT NOT NULL REFERENCES sql.expression
+ DEFERRABLE INITIALLY DEFERRED,
+ column_alias TEXT,
+ grouped_by BOOL NOT NULL DEFAULT FALSE,
+ CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
+);
+
+CREATE TABLE sql.order_by_item (
+ id SERIAL PRIMARY KEY,
+ stored_query INT NOT NULL REFERENCES sql.stored_query
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL,
+ expression INT NOT NULL REFERENCES sql.expression
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
+);
+
+COMMIT;
Added: trunk/Open-ILS/src/sql/Pg/upgrade/0097.schema.sql-datatype.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0097.schema.sql-datatype.sql (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0097.schema.sql-datatype.sql 2009-11-30 17:51:05 UTC (rev 15044)
@@ -0,0 +1,63 @@
+-- Script to create the sql schema and the tables therein
+
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0097'); -- Scott McKellar
+
+DROP SCHEMA IF EXISTS sql CASCADE;
+
+CREATE SCHEMA sql;
+
+CREATE TABLE sql.datatype (
+ id SERIAL PRIMARY KEY,
+ datatype_name TEXT NOT NULL UNIQUE,
+ is_numeric BOOL NOT NULL DEFAULT FALSE,
+ is_composite BOOL NOT NULL DEFAULT FALSE,
+ CONSTRAINT qdt_comp_not_num CHECK
+ ( is_numeric IS FALSE OR is_composite IS FALSE )
+);
+
+CREATE TABLE sql.subfield (
+ id SERIAL PRIMARY KEY,
+ composite_type INT NOT NULL
+ REFERENCES sql.datatype(id)
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL
+ CONSTRAINT qsf_pos_seq_no
+ CHECK( seq_no > 0 ),
+ subfield_type INT NOT NULL
+ REFERENCES sql.datatype(id)
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
+);
+
+CREATE TABLE sql.function_sig (
+ id SERIAL PRIMARY KEY,
+ function_name TEXT NOT NULL,
+ return_type INT REFERENCES sql.datatype(id)
+ DEFERRABLE INITIALLY DEFERRED,
+ is_aggregate BOOL NOT NULL DEFAULT FALSE,
+ CONSTRAINT qfd_rtn_or_aggr CHECK
+ ( return_type IS NULL OR is_aggregate = FALSE )
+);
+
+CREATE INDEX sql_function_sig_name_idx
+ ON sql.function_sig (function_name);
+
+CREATE TABLE sql.function_param_def (
+ id SERIAL PRIMARY KEY,
+ function_id INT NOT NULL
+ REFERENCES sql.function_sig( id )
+ ON DELETE CASCADE
+ DEFERRABLE INITIALLY DEFERRED,
+ seq_no INT NOT NULL
+ CONSTRAINT qfpd_pos_seq_no CHECK
+ ( seq_no > 0 ),
+ datatype INT NOT NULL
+ REFERENCES sql.datatype( id )
+ DEFERRABLE INITIALLY DEFERRED,
+ CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
+);
+
+COMMIT;
More information about the open-ils-commits
mailing list