diff --git a/scripts/generate_fixtures.py b/scripts/generate_fixtures.py index 66dc9e5..da14bfe 100644 --- a/scripts/generate_fixtures.py +++ b/scripts/generate_fixtures.py @@ -93,95 +93,115 @@ with open('src/pg/test/fixtures/load_fixtures.sql', 'w') as outfile: outfile.write(''' - CREATE TABLE observatory.obs_meta AS - SELECT numer_c.id numer_id, - denom_c.id denom_id, - geom_c.id geom_id, - MAX(numer_c.name) numer_name, - MAX(denom_c.name) denom_name, - MAX(geom_c.name) geom_name, - MAX(numer_c.description) numer_description, - MAX(denom_c.description) denom_description, - MAX(geom_c.description) geom_description, - MAX(numer_c.aggregate) numer_aggregate, - MAX(denom_c.aggregate) denom_aggregate, - MAX(geom_c.aggregate) geom_aggregate, - MAX(numer_c.type) numer_type, - MAX(denom_c.type) denom_type, - MAX(geom_c.type) geom_type, - MAX(numer_data_ct.colname) numer_colname, - MAX(denom_data_ct.colname) denom_colname, - MAX(geom_geom_ct.colname) geom_colname, - MAX(numer_geomref_ct.colname) numer_geomref_colname, - MAX(denom_geomref_ct.colname) denom_geomref_colname, - MAX(geom_geomref_ct.colname) geom_geomref_colname, - MAX(numer_t.tablename) numer_tablename, - MAX(denom_t.tablename) denom_tablename, - MAX(geom_t.tablename) geom_tablename, - MAX(numer_t.timespan) numer_timespan, - MAX(denom_t.timespan) denom_timespan, - MAX(numer_c.weight) numer_weight, - MAX(denom_c.weight) denom_weight, - MAX(geom_c.weight) geom_weight, - MAX(geom_t.timespan) geom_timespan, - MAX(geom_t.the_geom_webmercator)::geometry AS the_geom_webmercator, - ARRAY_AGG(DISTINCT s_tag.id) section_tags, - ARRAY_AGG(DISTINCT ss_tag.id) subsection_tags, - ARRAY_AGG(DISTINCT unit_tag.id) unit_tags - FROM observatory.obs_column_table numer_data_ct, - observatory.obs_table numer_t, - observatory.obs_column_table numer_geomref_ct, - observatory.obs_column geomref_c, - observatory.obs_column_to_column geomref_c2c, - observatory.obs_column geom_c, - observatory.obs_column_table geom_geom_ct, - observatory.obs_column_table geom_geomref_ct, - observatory.obs_table geom_t, - observatory.obs_column_tag ss_ctag, - observatory.obs_tag ss_tag, - observatory.obs_column_tag s_ctag, - observatory.obs_tag s_tag, - observatory.obs_column_tag unit_ctag, - observatory.obs_tag unit_tag, - observatory.obs_column numer_c - LEFT JOIN ( - observatory.obs_column_to_column denom_c2c - JOIN observatory.obs_column denom_c ON denom_c2c.target_id = denom_c.id - JOIN observatory.obs_column_table denom_data_ct ON denom_data_ct.column_id = denom_c.id - JOIN observatory.obs_table denom_t ON denom_data_ct.table_id = denom_t.id - JOIN observatory.obs_column_table denom_geomref_ct ON denom_geomref_ct.table_id = denom_t.id - ) ON denom_c2c.source_id = numer_c.id - WHERE numer_c.id = numer_data_ct.column_id - AND numer_data_ct.table_id = numer_t.id - AND numer_t.id = numer_geomref_ct.table_id - AND numer_geomref_ct.column_id = geomref_c.id - AND geomref_c2c.reltype = 'geom_ref' - AND geomref_c.id = geomref_c2c.source_id - AND geom_c.id = geomref_c2c.target_id - AND geom_geomref_ct.column_id = geomref_c.id - AND geom_geomref_ct.table_id = geom_t.id - AND geom_geom_ct.column_id = geom_c.id - AND geom_geom_ct.table_id = geom_t.id - AND geom_c.type ILIKE 'geometry' - AND numer_c.type NOT ILIKE 'geometry' - AND numer_t.id != geom_t.id - AND numer_c.id != geomref_c.id - AND unit_tag.type = 'unit' - AND ss_tag.type = 'subsection' - AND s_tag.type = 'section' - AND unit_ctag.column_id = numer_c.id - AND unit_ctag.tag_id = unit_tag.id - AND ss_ctag.column_id = numer_c.id - AND ss_ctag.tag_id = ss_tag.id - AND s_ctag.column_id = numer_c.id - AND s_ctag.tag_id = s_tag.id - AND (denom_c2c.reltype = 'denominator' OR denom_c2c.reltype IS NULL) - AND (denom_geomref_ct.column_id = geomref_c.id OR denom_geomref_ct.column_id IS NULL) - AND (denom_t.timespan = numer_t.timespan OR denom_t.timespan IS NULL) - GROUP BY numer_c.id, denom_c.id, geom_c.id, - numer_t.id, denom_t.id, geom_t.id; +ALTER TABLE observatory.obs_table + ADD PRIMARY KEY (id); +ALTER TABLE observatory.obs_column_table + ADD PRIMARY KEY (column_id, table_id), + ADD FOREIGN KEY (column_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (table_id) REFERENCES observatory.obs_table(id) ON DELETE CASCADE; +CREATE UNIQUE INDEX ON observatory.obs_column_table (table_id, colname); +ALTER TABLE observatory.obs_column + ADD PRIMARY KEY (id); +ALTER TABLE observatory.obs_column_to_column + ADD PRIMARY KEY (source_id, target_id, reltype), + ADD FOREIGN KEY (source_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (target_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE; +ALTER TABLE observatory.obs_column_tag + ADD PRIMARY KEY (column_id, tag_id), + ADD FOREIGN KEY (column_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (tag_id) REFERENCES observatory.obs_tag(id) ON DELETE CASCADE; +ALTER TABLE observatory.obs_tag + ADD PRIMARY KEY (id); + +CREATE TABLE observatory.obs_meta AS +SELECT numer_c.id numer_id, + denom_c.id denom_id, + geom_c.id geom_id, + MAX(numer_c.name) numer_name, + MAX(denom_c.name) denom_name, + MAX(geom_c.name) geom_name, + MAX(numer_c.description) numer_description, + MAX(denom_c.description) denom_description, + MAX(geom_c.description) geom_description, + MAX(numer_c.aggregate) numer_aggregate, + MAX(denom_c.aggregate) denom_aggregate, + MAX(geom_c.aggregate) geom_aggregate, + MAX(numer_c.type) numer_type, + MAX(denom_c.type) denom_type, + MAX(geom_c.type) geom_type, + MAX(numer_data_ct.colname) numer_colname, + MAX(denom_data_ct.colname) denom_colname, + MAX(geom_geom_ct.colname) geom_colname, + MAX(numer_geomref_ct.colname) numer_geomref_colname, + MAX(denom_geomref_ct.colname) denom_geomref_colname, + MAX(geom_geomref_ct.colname) geom_geomref_colname, + MAX(numer_t.tablename) numer_tablename, + MAX(denom_t.tablename) denom_tablename, + MAX(geom_t.tablename) geom_tablename, + MAX(numer_t.timespan) numer_timespan, + MAX(denom_t.timespan) denom_timespan, + MAX(numer_c.weight) numer_weight, + MAX(denom_c.weight) denom_weight, + MAX(geom_c.weight) geom_weight, + MAX(geom_t.timespan) geom_timespan, + MAX(geom_t.the_geom_webmercator)::geometry AS the_geom_webmercator, + ARRAY_AGG(DISTINCT s_tag.id) section_tags, + ARRAY_AGG(DISTINCT ss_tag.id) subsection_tags, + ARRAY_AGG(DISTINCT unit_tag.id) unit_tags +FROM observatory.obs_column_table numer_data_ct, + observatory.obs_table numer_t, + observatory.obs_column_table numer_geomref_ct, + observatory.obs_column geomref_c, + observatory.obs_column_to_column geomref_c2c, + observatory.obs_column geom_c, + observatory.obs_column_table geom_geom_ct, + observatory.obs_column_table geom_geomref_ct, + observatory.obs_table geom_t, + observatory.obs_column_tag ss_ctag, + observatory.obs_tag ss_tag, + observatory.obs_column_tag s_ctag, + observatory.obs_tag s_tag, + observatory.obs_column_tag unit_ctag, + observatory.obs_tag unit_tag, + observatory.obs_column numer_c + LEFT JOIN ( + observatory.obs_column_to_column denom_c2c + JOIN observatory.obs_column denom_c ON denom_c2c.target_id = denom_c.id + JOIN observatory.obs_column_table denom_data_ct ON denom_data_ct.column_id = denom_c.id + JOIN observatory.obs_table denom_t ON denom_data_ct.table_id = denom_t.id + JOIN observatory.obs_column_table denom_geomref_ct ON denom_geomref_ct.table_id = denom_t.id + ) ON denom_c2c.source_id = numer_c.id +WHERE numer_c.id = numer_data_ct.column_id + AND numer_data_ct.table_id = numer_t.id + AND numer_t.id = numer_geomref_ct.table_id + AND numer_geomref_ct.column_id = geomref_c.id + AND geomref_c2c.reltype = 'geom_ref' + AND geomref_c.id = geomref_c2c.source_id + AND geom_c.id = geomref_c2c.target_id + AND geom_geomref_ct.column_id = geomref_c.id + AND geom_geomref_ct.table_id = geom_t.id + AND geom_geom_ct.column_id = geom_c.id + AND geom_geom_ct.table_id = geom_t.id + AND geom_c.type ILIKE 'geometry' + AND numer_c.type NOT ILIKE 'geometry' + AND numer_t.id != geom_t.id + AND numer_c.id != geomref_c.id + AND unit_tag.type = 'unit' + AND ss_tag.type = 'subsection' + AND s_tag.type = 'section' + AND unit_ctag.column_id = numer_c.id + AND unit_ctag.tag_id = unit_tag.id + AND ss_ctag.column_id = numer_c.id + AND ss_ctag.tag_id = ss_tag.id + AND s_ctag.column_id = numer_c.id + AND s_ctag.tag_id = s_tag.id + AND (denom_c2c.reltype = 'denominator' OR denom_c2c.reltype IS NULL) + AND (denom_geomref_ct.column_id = geomref_c.id OR denom_geomref_ct.column_id IS NULL) + AND (denom_t.timespan = numer_t.timespan OR denom_t.timespan IS NULL) +GROUP BY numer_c.id, denom_c.id, geom_c.id, + numer_t.id, denom_t.id, geom_t.id; ''') dropfiles.write(''' - DROP TABLE IF EXISTS observatory.obs_meta +DROP TABLE IF EXISTS observatory.obs_meta; ''') diff --git a/src/pg/test/fixtures/drop_fixtures.sql b/src/pg/test/fixtures/drop_fixtures.sql index 50ffc6f..418661b 100644 --- a/src/pg/test/fixtures/drop_fixtures.sql +++ b/src/pg/test/fixtures/drop_fixtures.sql @@ -21,5 +21,4 @@ DROP TABLE IF EXISTS observatory.obs_d39f7fe5959891c8296490d83c22ded31c54af13; DROP TABLE IF EXISTS observatory.obs_144e8b4f906885b2e057ac4842644a553ae49c6e; DROP TABLE IF EXISTS observatory.obs_c6fb99c47d61289fbb8e561ff7773799d3fcc308; - DROP TABLE IF EXISTS observatory.obs_meta - \ No newline at end of file +DROP TABLE IF EXISTS observatory.obs_meta; diff --git a/src/pg/test/fixtures/load_fixtures.sql b/src/pg/test/fixtures/load_fixtures.sql index 395fdad..93a288f 100644 --- a/src/pg/test/fixtures/load_fixtures.sql +++ b/src/pg/test/fixtures/load_fixtures.sql @@ -25205,93 +25205,112 @@ cartodb_id,the_geom,the_geom_webmercator,geoid,aland,awater 140587,0106000020E610000001000000010300000001000000090000005187156EF98052C0594B0169FF4D44406B459BE3DC8052C07F4E417E364E4440213EB0E3BF8052C0AA0EB9196E4E44402DCF83BBB38052C0DBDD03745F4E44401570CFF3A78052C0D07AF832514E44404835ECF7C48052C0A5BA8097194E4440FDF2C98AE18052C0C1A6CEA3E24D44405D18E945ED8052C08B1A4CC3F04D44405187156EF98052C0594B0169FF4D4440,0106000020110F00000100000001030000000100000009000000BDFCFB423A6E5FC1405BF4E2C2E652415E6A32C8096E5FC17238A38200E7524104CEEC85D86D5FC1AADFE0B83EE752412BC595DFC36D5FC16588C5552EE75241627B1BDDAF6D5FC1FEE34F631EE7524187F38026E16D5FC1760D482DE0E65241753D8AAF116E5FC1BF2D58B3A2E65241E3F3A49C256E5FC1DA4D0F80B2E65241BDFCFB423A6E5FC1405BF4E2C2E65241,360470170002,75411,0 \. - CREATE SCHEMA IF NOT EXISTS "observatory"; - ALTER TABLE "obs_c6fb99c47d61289fbb8e561ff7773799d3fcc308" SET SCHEMA "observatory"; - CREATE TABLE observatory.obs_meta AS - SELECT numer_c.id numer_id, - denom_c.id denom_id, - geom_c.id geom_id, - MAX(numer_c.name) numer_name, - MAX(denom_c.name) denom_name, - MAX(geom_c.name) geom_name, - MAX(numer_c.description) numer_description, - MAX(denom_c.description) denom_description, - MAX(geom_c.description) geom_description, - MAX(numer_c.aggregate) numer_aggregate, - MAX(denom_c.aggregate) denom_aggregate, - MAX(geom_c.aggregate) geom_aggregate, - MAX(numer_c.type) numer_type, - MAX(denom_c.type) denom_type, - MAX(geom_c.type) geom_type, - MAX(numer_data_ct.colname) numer_colname, - MAX(denom_data_ct.colname) denom_colname, - MAX(geom_geom_ct.colname) geom_colname, - MAX(numer_geomref_ct.colname) numer_geomref_colname, - MAX(denom_geomref_ct.colname) denom_geomref_colname, - MAX(geom_geomref_ct.colname) geom_geomref_colname, - MAX(numer_t.tablename) numer_tablename, - MAX(denom_t.tablename) denom_tablename, - MAX(geom_t.tablename) geom_tablename, - MAX(numer_t.timespan) numer_timespan, - MAX(denom_t.timespan) denom_timespan, - MAX(numer_c.weight) numer_weight, - MAX(denom_c.weight) denom_weight, - MAX(geom_c.weight) geom_weight, - MAX(geom_t.timespan) geom_timespan, - MAX(geom_t.the_geom_webmercator)::geometry AS the_geom_webmercator, - ARRAY_AGG(DISTINCT s_tag.id) section_tags, - ARRAY_AGG(DISTINCT ss_tag.id) subsection_tags, - ARRAY_AGG(DISTINCT unit_tag.id) unit_tags - FROM observatory.obs_column_table numer_data_ct, - observatory.obs_table numer_t, - observatory.obs_column_table numer_geomref_ct, - observatory.obs_column geomref_c, - observatory.obs_column_to_column geomref_c2c, - observatory.obs_column geom_c, - observatory.obs_column_table geom_geom_ct, - observatory.obs_column_table geom_geomref_ct, - observatory.obs_table geom_t, - observatory.obs_column_tag ss_ctag, - observatory.obs_tag ss_tag, - observatory.obs_column_tag s_ctag, - observatory.obs_tag s_tag, - observatory.obs_column_tag unit_ctag, - observatory.obs_tag unit_tag, - observatory.obs_column numer_c - LEFT JOIN ( - observatory.obs_column_to_column denom_c2c - JOIN observatory.obs_column denom_c ON denom_c2c.target_id = denom_c.id - JOIN observatory.obs_column_table denom_data_ct ON denom_data_ct.column_id = denom_c.id - JOIN observatory.obs_table denom_t ON denom_data_ct.table_id = denom_t.id - JOIN observatory.obs_column_table denom_geomref_ct ON denom_geomref_ct.table_id = denom_t.id - ) ON denom_c2c.source_id = numer_c.id - WHERE numer_c.id = numer_data_ct.column_id - AND numer_data_ct.table_id = numer_t.id - AND numer_t.id = numer_geomref_ct.table_id - AND numer_geomref_ct.column_id = geomref_c.id - AND geomref_c2c.reltype = 'geom_ref' - AND geomref_c.id = geomref_c2c.source_id - AND geom_c.id = geomref_c2c.target_id - AND geom_geomref_ct.column_id = geomref_c.id - AND geom_geomref_ct.table_id = geom_t.id - AND geom_geom_ct.column_id = geom_c.id - AND geom_geom_ct.table_id = geom_t.id - AND geom_c.type ILIKE 'geometry' - AND numer_c.type NOT ILIKE 'geometry' - AND numer_t.id != geom_t.id - AND numer_c.id != geomref_c.id - AND unit_tag.type = 'unit' - AND ss_tag.type = 'subsection' - AND s_tag.type = 'section' - AND unit_ctag.column_id = numer_c.id - AND unit_ctag.tag_id = unit_tag.id - AND ss_ctag.column_id = numer_c.id - AND ss_ctag.tag_id = ss_tag.id - AND s_ctag.column_id = numer_c.id - AND s_ctag.tag_id = s_tag.id - AND (denom_c2c.reltype = 'denominator' OR denom_c2c.reltype IS NULL) - AND (denom_geomref_ct.column_id = geomref_c.id OR denom_geomref_ct.column_id IS NULL) - AND (denom_t.timespan = numer_t.timespan OR denom_t.timespan IS NULL) - GROUP BY numer_c.id, denom_c.id, geom_c.id, - numer_t.id, denom_t.id, geom_t.id; - \ No newline at end of file +ALTER TABLE observatory.obs_table + ADD PRIMARY KEY (id); +ALTER TABLE observatory.obs_column_table + ADD PRIMARY KEY (column_id, table_id), + ADD FOREIGN KEY (column_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (table_id) REFERENCES observatory.obs_table(id) ON DELETE CASCADE; +CREATE UNIQUE INDEX ON observatory.obs_column_table (table_id, colname); +ALTER TABLE observatory.obs_column + ADD PRIMARY KEY (id); +ALTER TABLE observatory.obs_column_to_column + ADD PRIMARY KEY (source_id, target_id, reltype), + ADD FOREIGN KEY (source_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (target_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE; +ALTER TABLE observatory.obs_column_tag + ADD PRIMARY KEY (column_id, tag_id), + ADD FOREIGN KEY (column_id) REFERENCES observatory.obs_column(id) ON DELETE CASCADE, + ADD FOREIGN KEY (tag_id) REFERENCES observatory.obs_tag(id) ON DELETE CASCADE; +ALTER TABLE observatory.obs_tag + ADD PRIMARY KEY (id); + +CREATE SCHEMA IF NOT EXISTS "observatory"; +ALTER TABLE "obs_c6fb99c47d61289fbb8e561ff7773799d3fcc308" SET SCHEMA "observatory"; +CREATE TABLE observatory.obs_meta AS +SELECT numer_c.id numer_id, + denom_c.id denom_id, + geom_c.id geom_id, + MAX(numer_c.name) numer_name, + MAX(denom_c.name) denom_name, + MAX(geom_c.name) geom_name, + MAX(numer_c.description) numer_description, + MAX(denom_c.description) denom_description, + MAX(geom_c.description) geom_description, + MAX(numer_c.aggregate) numer_aggregate, + MAX(denom_c.aggregate) denom_aggregate, + MAX(geom_c.aggregate) geom_aggregate, + MAX(numer_c.type) numer_type, + MAX(denom_c.type) denom_type, + MAX(geom_c.type) geom_type, + MAX(numer_data_ct.colname) numer_colname, + MAX(denom_data_ct.colname) denom_colname, + MAX(geom_geom_ct.colname) geom_colname, + MAX(numer_geomref_ct.colname) numer_geomref_colname, + MAX(denom_geomref_ct.colname) denom_geomref_colname, + MAX(geom_geomref_ct.colname) geom_geomref_colname, + MAX(numer_t.tablename) numer_tablename, + MAX(denom_t.tablename) denom_tablename, + MAX(geom_t.tablename) geom_tablename, + MAX(numer_t.timespan) numer_timespan, + MAX(denom_t.timespan) denom_timespan, + MAX(numer_c.weight) numer_weight, + MAX(denom_c.weight) denom_weight, + MAX(geom_c.weight) geom_weight, + MAX(geom_t.timespan) geom_timespan, + MAX(geom_t.the_geom_webmercator)::geometry AS the_geom_webmercator, + ARRAY_AGG(DISTINCT s_tag.id) section_tags, + ARRAY_AGG(DISTINCT ss_tag.id) subsection_tags, + ARRAY_AGG(DISTINCT unit_tag.id) unit_tags +FROM observatory.obs_column_table numer_data_ct, + observatory.obs_table numer_t, + observatory.obs_column_table numer_geomref_ct, + observatory.obs_column geomref_c, + observatory.obs_column_to_column geomref_c2c, + observatory.obs_column geom_c, + observatory.obs_column_table geom_geom_ct, + observatory.obs_column_table geom_geomref_ct, + observatory.obs_table geom_t, + observatory.obs_column_tag ss_ctag, + observatory.obs_tag ss_tag, + observatory.obs_column_tag s_ctag, + observatory.obs_tag s_tag, + observatory.obs_column_tag unit_ctag, + observatory.obs_tag unit_tag, + observatory.obs_column numer_c + LEFT JOIN ( + observatory.obs_column_to_column denom_c2c + JOIN observatory.obs_column denom_c ON denom_c2c.target_id = denom_c.id + JOIN observatory.obs_column_table denom_data_ct ON denom_data_ct.column_id = denom_c.id + JOIN observatory.obs_table denom_t ON denom_data_ct.table_id = denom_t.id + JOIN observatory.obs_column_table denom_geomref_ct ON denom_geomref_ct.table_id = denom_t.id + ) ON denom_c2c.source_id = numer_c.id +WHERE numer_c.id = numer_data_ct.column_id + AND numer_data_ct.table_id = numer_t.id + AND numer_t.id = numer_geomref_ct.table_id + AND numer_geomref_ct.column_id = geomref_c.id + AND geomref_c2c.reltype = 'geom_ref' + AND geomref_c.id = geomref_c2c.source_id + AND geom_c.id = geomref_c2c.target_id + AND geom_geomref_ct.column_id = geomref_c.id + AND geom_geomref_ct.table_id = geom_t.id + AND geom_geom_ct.column_id = geom_c.id + AND geom_geom_ct.table_id = geom_t.id + AND geom_c.type ILIKE 'geometry' + AND numer_c.type NOT ILIKE 'geometry' + AND numer_t.id != geom_t.id + AND numer_c.id != geomref_c.id + AND unit_tag.type = 'unit' + AND ss_tag.type = 'subsection' + AND s_tag.type = 'section' + AND unit_ctag.column_id = numer_c.id + AND unit_ctag.tag_id = unit_tag.id + AND ss_ctag.column_id = numer_c.id + AND ss_ctag.tag_id = ss_tag.id + AND s_ctag.column_id = numer_c.id + AND s_ctag.tag_id = s_tag.id + AND (denom_c2c.reltype = 'denominator' OR denom_c2c.reltype IS NULL) + AND (denom_geomref_ct.column_id = geomref_c.id OR denom_geomref_ct.column_id IS NULL) + AND (denom_t.timespan = numer_t.timespan OR denom_t.timespan IS NULL) +GROUP BY numer_c.id, denom_c.id, geom_c.id, + numer_t.id, denom_t.id, geom_t.id;