Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use 64 bit IDs in concept table #1887

Merged
merged 1 commit into from
Jan 23, 2020
Merged

Use 64 bit IDs in concept table #1887

merged 1 commit into from
Jan 23, 2020

Conversation

tomka
Copy link
Contributor

@tomka tomka commented Jun 4, 2019

This branch should be merged only after the upcoming CATMAID release.

Like discussed in issue #1848, IDs in the concept table (and all tables inheriting from it) should use the bigint type rather than int. So far I couldn't find a problem with this migration---I applied it in my development environments and will continue testing. If anyone is willing to look through the migration that would be very nice!

While we still have some headroom for the datasets we work with at the moment, keeping the IDs of concept table based tables (inheritance) at 32 bit would have been a limit at some point. Already we see large segmentation datasets that make this headroom rather small. Therefore this migration will rewrite all concept based tables as well as tables that reference them through foreign keys so that 64 bit IDs are used.

This migration also updates the review table to use 64 bit IDs. It also fixes the history views of the catmaid_sampler table, which haven't been kept up to date with column changes.

In addition a lot of missing foreign key constraints have been added. They shouldn't have a big import on performance and in fact no real difference could be measured.

The column order of concept changed slightly to improve the column alignment and reduce padding. So far we wasted 4 Bytes per row, because project_id occupied 4 Bytes and required 4 Bytes of padding for alignment, because it was followed by a bigint. This is changed now and no more padding is needed. This also lowers the impact on storage of the change to 64 bit IDs.

@tomka
Copy link
Contributor Author

tomka commented Jun 22, 2019

I rebased these changes on current dev and updated the migration numbers and references. The plan is to merge this in the next days. My local development DB has been running these changes without problems over the past two weeks and I believe @schlegelp used it as well with actual 64 bit IDs without any problems as well (that I am aware of).

@tomka tomka force-pushed the features/64-bit-concept-ids branch from ac97500 to 27d52ff Compare June 22, 2019 03:04
@schlegelp
Copy link
Contributor

Haven't encountered any problems either!

@tomka tomka force-pushed the features/64-bit-concept-ids branch 3 times, most recently from c1985c9 to c0383ec Compare June 26, 2019 20:56
@tomka tomka force-pushed the features/64-bit-concept-ids branch 2 times, most recently from e96eea6 to 566f723 Compare August 22, 2019 14:35
@tomka tomka force-pushed the features/64-bit-concept-ids branch from 566f723 to 96c575e Compare October 30, 2019 13:58
@tomka
Copy link
Contributor Author

tomka commented Oct 30, 2019

Three migrations from this PR have already been merged separately into dev. They fixed some related 64 bit issues with the tables connector_geom, treenode_connector_edge and change_request. This branch now contains only the remaining big migration that changes all concept based tables to use 64 bit IDs. I will try to get this reviewed and merged within the next days.

@tomka tomka force-pushed the features/64-bit-concept-ids branch 14 times, most recently from 777c810 to 8ac20a0 Compare November 8, 2019 16:52
@unidesigner
Copy link
Contributor

I don't know if this is going to be an issue for current CATMAID instances, but I noticed that the max integer range for bigints on Postgres is larger than what Javascript can handle (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER). If a bigint in Postgres is larger than Number.MAX_SAFE_INTEGER, the CATMAID UI might have problems.

@aschampion
Copy link
Contributor

Chrome and Firefox both support BigInt64, so there won't be a need to homebrew types a la CATSOP, but they still do have to be explicitly constructed which is a hassle for things like JSON de/serialization.

@tomka
Copy link
Contributor Author

tomka commented Nov 11, 2019

While this is certainly true and a good point, it isn't a problem for the CATMAID instances I know. Even the large segmentation fit still into the 32 bit space (~2 billion treenodes was the maximum I have seen so far) . In fact, this migration only adds 64 bit support for concept related tables. All spatial tables (location derived) use 64 bit IDs already for quite some time without issues. Once our headroom gets smaller, we should look into better ID representations on the JavaScript side, e.g. BigInt64 like @aschampion mentioned.

After quite a few revisions and tests this branch is almost ready to be merged I believe. The only thing I want to finish exploring before is where some primary key covering indices might be useful (because this is a good opportunity to add them, we are recreating the tables anyway). The current version has more INCLUDE statements than needed though and I am currently running some tests on where this is actually useful (and not counterproductive).

@unidesigner
Copy link
Contributor

I did a few tests with predefined IDs for connectors and was running into the issue that the JSONs were note parsed correctly, as @aschampion mentioned. I work around by using smaller IDs, but its something to keep in mind for later. This does not relate to the concept tables, so wouldn't prevent merging this branch.

@tomka tomka force-pushed the features/64-bit-concept-ids branch from 8ac20a0 to 15198b4 Compare November 21, 2019 21:04
@tomka tomka force-pushed the features/64-bit-concept-ids branch 5 times, most recently from e5c1664 to 5a5f674 Compare January 18, 2020 00:10
@tomka tomka force-pushed the features/64-bit-concept-ids branch 2 times, most recently from 14b3531 to 2de4815 Compare January 22, 2020 06:25
While we still have some headroom for the datasets we work with at the
moment, keeping the IDs of concept table based tables (inheritance) at
32 bit would have been a limit at some point. Already we see large
segmentation datasets that make this headroom rather small. Therefore
this migration will rewrite all concept based tables as well as tables
that reference them through foreign keys so that 64 bit IDs are used.

This migration also updates the review table to use 64 bit IDs. It also
fixes the history views of the catmaid_sampler table, which haven't been
kept up to date with column changes.

In addition a lot of missing foreign key constraints have been added.
They shouldn't have a big import on performance and in fact only a very
small difference could be measured. Improved data security and
consistency is important and worth a small performance hit.

The column order of concept changed slightly to improve the column
alignment and reduce padding. So far we wasted 4 Bytes per row, because
project_id occupied 4 Bytes and required 4 Bytes of padding, because it
was followed by a bigint. This is changed now and no more padding is
needed. This also lowers the impact on storage of the change to 64 bit
IDs.

Also, the indices backing the primary keys of many semantic tables
include now additional data like the class_id for class instances and
the relation_id for some relation instance types. This Postgres 11
feature allows to use more index-only scans. This is especially useful
when traversing join tables likes class_instance_class_instancem, since
connections between them can now be found with index-only scans alone.

In addition many index names follow now a more consistent pattern.

I tested this migration by multiple reviews and analyzing the schema
diff generated by pgquarrel for both migration 98 vs 99 as well as 99 vs
(99 -> 98) (i.e. a rollback). These migrations look reasonable and the
effective migration (diff) from 98 to 99 is attached at the end of this
commit message. The actual migration is more complicated, because it
cares also about column ordering, which below schema changes don't.

Fixes catmaid/CATMAID#1848

---

Effective migration 99:

ALTER SEQUENCE public.catmaid_sampler_id_seq AS bigint MAXVALUE 9223372036854775807;

CREATE SEQUENCE public.skeleton_origin_id_seq1 NO MINVALUE NO MAXVALUE;

ALTER TABLE ONLY public.cardinality_restriction ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.cardinality_restriction ALTER COLUMN restricted_link_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.cardinality_restriction ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.cardinality_restriction
	ADD CONSTRAINT cardinality_restriction_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.cardinality_restriction__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.cardinality_restriction__history ALTER COLUMN restricted_link_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_sampler ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_sampler ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_sampler
	DROP CONSTRAINT catmaid_sampler_sampler_state_id_80e7961f_fk_catmaid_s;

ALTER TABLE ONLY public.catmaid_sampler
	ADD CONSTRAINT catmaid_sampler_sampler_state_id_fkey FOREIGN KEY (sampler_state_id) REFERENCES catmaid_samplerstate(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_sampler
	DROP CONSTRAINT catmaid_sampler_skeleton_id_dfc98008_fk_class_instance_id;

ALTER TABLE ONLY public.catmaid_sampler
	ADD CONSTRAINT catmaid_sampler_skeleton_id_fkey FOREIGN KEY (skeleton_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_sampler
	DROP CONSTRAINT catmaid_sampler_user_id_8d1c228f_fk_auth_user_id;

ALTER TABLE ONLY public.catmaid_sampler
	ADD CONSTRAINT catmaid_sampler_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_sampler__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_sampler__history ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_samplerdomain
	DROP CONSTRAINT catmaid_samplerdomain_sampler_id_ed4aa3f0_fk_catmaid_sampler_id;

ALTER TABLE ONLY public.catmaid_samplerdomain
	ADD CONSTRAINT catmaid_samplerdomain_sampler_id_fkey FOREIGN KEY (sampler_id) REFERENCES catmaid_sampler(id);

ALTER TABLE ONLY public.catmaid_samplerdomain
	DROP CONSTRAINT catmaid_samplerdomain_start_node_id_4ae2c16c_fk_treenode_id;

ALTER TABLE ONLY public.catmaid_samplerdomain
	ADD CONSTRAINT catmaid_samplerdomain_start_node_id_fkey FOREIGN KEY (start_node_id) REFERENCES treenode(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_samplerdomainend
	DROP CONSTRAINT catmaid_samplerdomainend_end_node_id_31859f80_fk_treenode_id;

ALTER TABLE ONLY public.catmaid_samplerdomainend
	ADD CONSTRAINT catmaid_samplerdomainend_end_node_id_fkey FOREIGN KEY (end_node_id) REFERENCES treenode(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_samplerinterval
	DROP CONSTRAINT catmaid_samplerinterval_end_node_id_c82f43df_fk_treenode_id;

ALTER TABLE ONLY public.catmaid_samplerinterval
	ADD CONSTRAINT catmaid_samplerinterval_end_node_id_fkey FOREIGN KEY (end_node_id) REFERENCES treenode(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_samplerinterval
	DROP CONSTRAINT catmaid_samplerinterval_start_node_id_ead5c637_fk_treenode_id;

ALTER TABLE ONLY public.catmaid_samplerinterval
	ADD CONSTRAINT catmaid_samplerinterval_start_node_id_fkey FOREIGN KEY (start_node_id) REFERENCES treenode(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_skeleton_summary ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	DROP CONSTRAINT catmaid_skeleton_summary_pkey;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	ADD CONSTRAINT catmaid_skeleton_id_pkey PRIMARY KEY (skeleton_id) INCLUDE (num_nodes);

ALTER TABLE ONLY public.catmaid_skeleton_summary
	DROP CONSTRAINT catmaid_skeleton_sum_skeleton_id_034079eb_fk_class_ins;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	DROP CONSTRAINT catmaid_skeleton_summary_skeleton_id_fk;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	ADD CONSTRAINT catmaid_skeleton_summary_skeleton_id_fkey FOREIGN KEY (skeleton_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	DROP CONSTRAINT last_editor_id_fkey;

ALTER TABLE ONLY public.catmaid_skeleton_summary
	ADD CONSTRAINT catmaid_skeleton_summary_last_editor_id_fkey FOREIGN KEY (last_editor_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.change_request ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.change_request ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.change_request
	DROP CONSTRAINT change_request_connector_id_fkey;

ALTER TABLE ONLY public.change_request
	ADD CONSTRAINT change_request_connector_id_fkey FOREIGN KEY (connector_id) REFERENCES connector(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.change_request
	DROP CONSTRAINT change_request_treenode_id_fkey;

ALTER TABLE ONLY public.change_request
	ADD CONSTRAINT change_request_treenode_id_fkey FOREIGN KEY (treenode_id) REFERENCES treenode(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.change_request
	DROP CONSTRAINT change_request_user_id_fkey;

ALTER TABLE ONLY public.change_request
	ADD CONSTRAINT change_request_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.change_request
	ADD CONSTRAINT change_request_recipient_id_fkey FOREIGN KEY (recipient_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.change_request
	DROP CONSTRAINT recipient_id_refs_id;

ALTER TABLE ONLY public.change_request__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class ALTER COLUMN class_name SET DATA TYPE text;

ALTER TABLE ONLY public.class ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.class
	DROP CONSTRAINT class_user_id_fkey;

ALTER TABLE ONLY public.class
	ADD CONSTRAINT class_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.class
	DROP CONSTRAINT class_pkey;

ALTER TABLE ONLY public.class
	ADD CONSTRAINT class_id_pkey PRIMARY KEY (id) INCLUDE (project_id, class_name);

ALTER TABLE ONLY public.class__history ALTER COLUMN class_name SET DATA TYPE text;

ALTER TABLE ONLY public.class__history ALTER COLUMN class_name DROP DEFAULT;

ALTER TABLE ONLY public.class__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class ALTER COLUMN class_a SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class ALTER COLUMN class_a SET NOT NULL;

ALTER TABLE ONLY public.class_class ALTER COLUMN class_b SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class ALTER COLUMN class_b SET NOT NULL;

ALTER TABLE ONLY public.class_class ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.class_class__history ALTER COLUMN class_a SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class__history ALTER COLUMN class_b SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_class__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance ALTER COLUMN class_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.class_instance
	ADD CONSTRAINT class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.class_instance
	DROP CONSTRAINT class_instance_pkey;

ALTER TABLE ONLY public.class_instance
	ADD CONSTRAINT class_instance_id_pkey PRIMARY KEY (id) INCLUDE (class_id, project_id);

ALTER TABLE ONLY public.class_instance__history ALTER COLUMN class_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN class_instance_a SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN class_instance_a SET NOT NULL;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN class_instance_b SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN class_instance_b SET NOT NULL;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.class_instance_class_instance
	ADD CONSTRAINT class_instance_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.class_instance_class_instance__history ALTER COLUMN class_instance_a SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance__history ALTER COLUMN class_instance_b SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.class_instance_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.concept ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.concept ALTER COLUMN id SET DEFAULT nextval('concept_id_seq'::regclass);

ALTER TABLE ONLY public.concept ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.concept
	ADD CONSTRAINT concept_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.concept
	ADD CONSTRAINT concept_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.concept__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.connector_class_instance
	DROP CONSTRAINT connector_class_instance_connector_id_fkey;

ALTER TABLE ONLY public.connector_class_instance
	ADD CONSTRAINT connector_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.connector_class_instance
	ADD CONSTRAINT connector_class_instance_connector_id_fkey FOREIGN KEY (connector_id) REFERENCES connector(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.connector_class_instance
	ADD CONSTRAINT connector_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.connector_class_instance
	ADD CONSTRAINT connector_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.connector_class_instance
	ADD CONSTRAINT connector_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.connector_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.connector_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.log ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.log ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.log
	ADD CONSTRAINT log_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.log
	ADD CONSTRAINT log_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.point_class_instance
	ADD CONSTRAINT point_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance
	ADD CONSTRAINT point_class_instance_point_id_fkey FOREIGN KEY (point_id) REFERENCES point(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance
	ADD CONSTRAINT point_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance
	ADD CONSTRAINT point_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance
	DROP CONSTRAINT point_class_instance_sa_id;

ALTER TABLE ONLY public.point_class_instance
	ADD CONSTRAINT point_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_class_instance
	DROP CONSTRAINT point_connector_class_instance_id_fkey;

ALTER TABLE ONLY public.point_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_connector ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_connector ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_connector ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.point_connector
	DROP CONSTRAINT point_connector_connector_id_fkey;

ALTER TABLE ONLY public.point_connector
	ADD CONSTRAINT point_connector_connector_id_fkey FOREIGN KEY (connector_id) REFERENCES connector(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_connector
	ADD CONSTRAINT point_connector_point_id_fkey FOREIGN KEY (point_id) REFERENCES point(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_connector
	ADD CONSTRAINT point_connector_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_connector
	ADD CONSTRAINT point_connector_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_connector
	DROP CONSTRAINT point_connector_sa_id;

ALTER TABLE ONLY public.point_connector
	ADD CONSTRAINT point_connector_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.point_connector__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.point_connector__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN class_instance_id SET NOT NULL;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN region_of_interest_id SET NOT NULL;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.region_of_interest_class_instance
	DROP CONSTRAINT region_of_interest_class_instance_class_instance_id_fkey;

ALTER TABLE ONLY public.region_of_interest_class_instance
	ADD CONSTRAINT region_of_interest_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.region_of_interest_class_instance
	ADD CONSTRAINT region_of_interest_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.region_of_interest_class_instance
	ADD CONSTRAINT region_of_interest_class_instance_region_of_interest_id_fkey FOREIGN KEY (region_of_interest_id) REFERENCES region_of_interest(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.region_of_interest_class_instance
	ADD CONSTRAINT region_of_interest_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.region_of_interest_class_instance
	ADD CONSTRAINT region_of_interest_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.region_of_interest_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.region_of_interest_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.relation
	ADD CONSTRAINT relation_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.relation
	ADD CONSTRAINT relation_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.relation
	DROP CONSTRAINT relation_pkey;

ALTER TABLE ONLY public.relation
	ADD CONSTRAINT relation_id_pkey PRIMARY KEY (id) INCLUDE (project_id, relation_name);

ALTER TABLE ONLY public.relation__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.relation_instance
	ADD CONSTRAINT relation_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.relation_instance
	ADD CONSTRAINT relation_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.relation_instance
	ADD CONSTRAINT relation_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.relation_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.relation_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.restriction ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.restriction ALTER COLUMN restricted_link_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.restriction ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.restriction
	DROP CONSTRAINT restricted_link_fkey;

ALTER TABLE ONLY public.restriction
	ADD CONSTRAINT restriction_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.restriction
	ADD CONSTRAINT restriction_restricted_link_id_fkey FOREIGN KEY (restricted_link_id) REFERENCES class_class(id);

ALTER TABLE ONLY public.restriction
	ADD CONSTRAINT restriction_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.restriction__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.restriction__history ALTER COLUMN restricted_link_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.review ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.review ALTER COLUMN review_time SET DEFAULT now();

ALTER TABLE ONLY public.review ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.review ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.review
	DROP CONSTRAINT review_reviewer_id_refs_id;

ALTER TABLE ONLY public.review
	ADD CONSTRAINT review_skeleton_id_fkey FOREIGN KEY (skeleton_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.review
	DROP CONSTRAINT review_skeleton_id_refs_id;

ALTER TABLE ONLY public.review
	ADD CONSTRAINT review_treenode_id_fkey FOREIGN KEY (treenode_id) REFERENCES treenode(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.review
	ADD CONSTRAINT review_user_id_fkey FOREIGN KEY (reviewer_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.review
	DROP CONSTRAINT treenode_id_fkey;

ALTER TABLE ONLY public.review__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.review__history ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.skeleton_origin ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.skeleton_origin
	DROP CONSTRAINT skeleton_origin_data_source_id_fkey;

ALTER TABLE ONLY public.skeleton_origin
	ADD CONSTRAINT skeleton_origin_data_source_id_fkey1 FOREIGN KEY (data_source_id) REFERENCES data_source(id) ON DELETE CASCADE;

ALTER TABLE ONLY public.skeleton_origin
	DROP CONSTRAINT skeleton_origin_project_id_fkey;

ALTER TABLE ONLY public.skeleton_origin
	ADD CONSTRAINT skeleton_origin_project_id_fkey1 FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE;

ALTER TABLE ONLY public.skeleton_origin
	DROP CONSTRAINT skeleton_origin_skeleton_id_fkey;

ALTER TABLE ONLY public.skeleton_origin
	ADD CONSTRAINT skeleton_origin_skeleton_id_fkey1 FOREIGN KEY (skeleton_id) REFERENCES class_instance(id) ON DELETE CASCADE;

ALTER TABLE ONLY public.skeleton_origin
	DROP CONSTRAINT skeleton_origin_user_id_fkey;

ALTER TABLE ONLY public.skeleton_origin
	ADD CONSTRAINT skeleton_origin_user_id_fkey1 FOREIGN KEY (user_id) REFERENCES auth_user(id);

ALTER TABLE ONLY public.skeleton_origin__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN class_instance_id SET NOT NULL;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN stack_id SET NOT NULL;

ALTER TABLE ONLY public.stack_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.stack_class_instance
	DROP CONSTRAINT stack_class_instance_class_instance_id_fkey;

ALTER TABLE ONLY public.stack_class_instance
	ADD CONSTRAINT stack_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_class_instance
	ADD CONSTRAINT stack_class_instance_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_class_instance
	ADD CONSTRAINT stack_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_class_instance
	DROP CONSTRAINT stack_class_instance_stack_id_fkey;

ALTER TABLE ONLY public.stack_class_instance
	ADD CONSTRAINT stack_class_instance_stack_id_fkey FOREIGN KEY (stack_id) REFERENCES stack(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_class_instance
	ADD CONSTRAINT stack_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN class_instance_id SET NOT NULL;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN stack_group_id SET NOT NULL;

ALTER TABLE ONLY public.stack_group_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.stack_group_class_instance
	DROP CONSTRAINT stack_group_class_instance_class_instance_id_fkey;

ALTER TABLE ONLY public.stack_group_class_instance
	ADD CONSTRAINT stack_group_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_group_class_instance
	ADD CONSTRAINT stack_group_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_group_class_instance
	ADD CONSTRAINT stack_group_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_group_class_instance
	DROP CONSTRAINT stack_group_class_instance_stack_group_id_fkey;

ALTER TABLE ONLY public.stack_group_class_instance
	ADD CONSTRAINT stack_group_class_instance_stack_group_id_fkey FOREIGN KEY (stack_group_id) REFERENCES stack_group(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_group_class_instance
	ADD CONSTRAINT stack_group_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.stack_group_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.stack_group_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.suppressed_virtual_treenode
	DROP CONSTRAINT suppressed_vnodes_child_id_refs_id;

ALTER TABLE ONLY public.suppressed_virtual_treenode
	ADD CONSTRAINT suppressed_virtual_treenode_child_id_fkey FOREIGN KEY (child_id) REFERENCES treenode(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode
	ADD CONSTRAINT treenode_editor_id_fkey FOREIGN KEY (editor_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode
	ADD CONSTRAINT treenode_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode
	ADD CONSTRAINT treenode_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode__history ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.treenode_class_instance
	ADD CONSTRAINT treenode_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_class_instance
	ADD CONSTRAINT treenode_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_class_instance
	ADD CONSTRAINT treenode_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_class_instance
	DROP CONSTRAINT treenode_class_instance_treenode_id_fkey;

ALTER TABLE ONLY public.treenode_class_instance
	ADD CONSTRAINT treenode_class_instance_treenode_id_fkey FOREIGN KEY (treenode_id) REFERENCES treenode(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_class_instance
	ADD CONSTRAINT treenode_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector ALTER COLUMN skeleton_id SET NOT NULL;

ALTER TABLE ONLY public.treenode_connector ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.treenode_connector
	ADD CONSTRAINT treenode_connector_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_connector
	ADD CONSTRAINT treenode_connector_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_connector
	ADD CONSTRAINT treenode_connector_skeleton_id_fkey FOREIGN KEY (skeleton_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_connector
	ADD CONSTRAINT treenode_connector_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.treenode_connector__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector__history ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.treenode_connector__history ALTER COLUMN skeleton_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance ALTER COLUMN relation_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance ALTER COLUMN txid SET NOT NULL;

ALTER TABLE ONLY public.volume_class_instance
	ADD CONSTRAINT volume_class_instance_class_instance_id_fkey FOREIGN KEY (class_instance_id) REFERENCES class_instance(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.volume_class_instance
	DROP CONSTRAINT volume_class_instance_id_fkey;

ALTER TABLE ONLY public.volume_class_instance
	ADD CONSTRAINT volume_class_instance_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.volume_class_instance
	ADD CONSTRAINT volume_class_instance_relation_id_fkey FOREIGN KEY (relation_id) REFERENCES relation(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.volume_class_instance
	DROP CONSTRAINT volume_class_instance_sa_id;

ALTER TABLE ONLY public.volume_class_instance
	ADD CONSTRAINT volume_class_instance_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.volume_class_instance
	ADD CONSTRAINT volume_class_instance_volume_id_fkey FOREIGN KEY (volume_id) REFERENCES catmaid_volume(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE ONLY public.volume_class_instance__history ALTER COLUMN class_instance_id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance__history ALTER COLUMN id SET DATA TYPE bigint;

ALTER TABLE ONLY public.volume_class_instance__history ALTER COLUMN relation_id SET DATA TYPE bigint;

CREATE INDEX catmaid_sampler_project_id_idx ON public.catmaid_sampler USING btree (project_id);

CREATE INDEX catmaid_sampler_sampler_state_id_idx ON public.catmaid_sampler USING btree (sampler_state_id);

CREATE INDEX catmaid_sampler_skeleton_id_idx ON public.catmaid_sampler USING btree (skeleton_id);

CREATE INDEX catmaid_sampler_user_id_idx ON public.catmaid_sampler USING btree (user_id);

CREATE INDEX catmaid_skeleton_summary_project_id_idx ON public.catmaid_skeleton_summary USING btree (project_id);

CREATE INDEX class_class_name_idx ON public.class USING btree (class_name) INCLUDE (id, project_id);

CREATE INDEX guardian_gr_content_ae6aec_idx ON public.guardian_groupobjectpermission USING btree (content_type_id, object_pk);

CREATE INDEX guardian_us_content_179ed2_idx ON public.guardian_userobjectpermission USING btree (content_type_id, object_pk);

CREATE UNIQUE INDEX point_connector_project_id_point_id_connector_id_relation_id_un ON public.point_connector USING btree (project_id, point_id, connector_id, relation_id);

CREATE INDEX review_project_id_idx ON public.review USING btree (project_id);

CREATE INDEX review_reviewer_id_idx ON public.review USING btree (reviewer_id);

CREATE INDEX review_skeleton_id_idx ON public.review USING btree (skeleton_id);

CREATE INDEX review_treenode_id_idx ON public.review USING btree (treenode_id);

CREATE INDEX treenode_class_instance_class_instance_id_idx ON public.treenode_class_instance USING btree (class_instance_id);

CREATE INDEX treenode_class_instance_project_id_idx ON public.treenode_class_instance USING btree (project_id);

CREATE INDEX treenode_class_instance_relation_id_idx ON public.treenode_class_instance USING btree (relation_id);

CREATE INDEX treenode_class_instance_treenode_id_idx ON public.treenode_class_instance USING btree (treenode_id);

CREATE INDEX treenode_class_instance_user_id_idx ON public.treenode_class_instance USING btree (user_id);

CREATE INDEX treenode_connector_connector_id_idx ON public.treenode_connector USING btree (connector_id);

CREATE INDEX treenode_connector_creation_time_idx_idx ON public.treenode_connector USING btree (creation_time);

CREATE INDEX treenode_connector_project_id_idx ON public.treenode_connector USING btree (project_id);

CREATE UNIQUE INDEX treenode_connector_project_id_treenode_id_connector_id_relation ON public.treenode_connector USING btree (project_id, treenode_id, connector_id, relation_id);

CREATE INDEX treenode_connector_relation_id_idx ON public.treenode_connector USING btree (relation_id);

CREATE INDEX treenode_connector_skeleton_id_idx ON public.treenode_connector USING btree (skeleton_id);

CREATE INDEX treenode_connector_treenode_id_idx ON public.treenode_connector USING btree (treenode_id);

CREATE INDEX treenode_connector_user_id_idx ON public.treenode_connector USING btree (user_id);

CREATE INDEX treenode_creation_time_idx ON public.treenode USING btree (creation_time);

CREATE INDEX treenode_edition_time_idx ON public.treenode USING btree (edition_time);

CREATE INDEX treenode_parent_id_idx ON public.treenode USING btree (parent_id);

CREATE INDEX treenode_project_id_location_x_idx ON public.treenode USING btree (project_id, location_x);

CREATE INDEX treenode_project_id_location_y_idx ON public.treenode USING btree (project_id, location_y);

CREATE INDEX treenode_project_id_location_z_idx ON public.treenode USING btree (project_id, location_z);

CREATE INDEX treenode_project_id_user_id_idx ON public.treenode USING btree (user_id, project_id);

CREATE INDEX treenode_skeleton_id_project_id_idx ON public.treenode USING btree (skeleton_id, project_id);

CREATE OR REPLACE FUNCTION public.check_treenode_connector_related_reviews(tc treenode_connector) RETURNS void
    LANGUAGE plpgsql VOLATILE
AS $$BEGIN
            -- Mark linked treenodes as unreviewed. If relation is postsynaptic,
            -- mark only one, otherwise mark all treenodes related to connector.
            IF EXISTS (SELECT 1
                         FROM relation
                         WHERE id = tc.relation_id
                           AND relation_name = 'postsynaptic_to') THEN
              DELETE FROM review WHERE treenode_id = tc.treenode_id;
            ELSE
              DELETE FROM review r
                USING treenode_connector tc2
                WHERE r.treenode_id = tc2.treenode_id
                  AND tc2.connector_id = tc.connector_id;
            END IF;
        END;
        $$;

CREATE OR REPLACE FUNCTION public.drop_history_table(live_table regclass) RETURNS void
    LANGUAGE plpgsql VOLATILE
AS $$
    DECLARE

        -- This will contain the name of the newly created history table. No
        -- regclass is used, because the implicit table existence check on variable
        -- assignment can fail if the table has already been removed by an
        -- cascaded table drop.
        history_table_name text;

    BEGIN

        PERFORM drop_history_table_keep_data(live_table);

        -- History tables will be named like the live table plus a '__history' suffix
        history_table_name = get_history_table_name(live_table);

        -- Cascading deleting is used to also delete child tables and triggers.
        EXECUTE format('DROP TABLE IF EXISTS %I CASCADE',
            get_tracking_table_name(live_table));
        EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', history_table_name);
    END;
    $$;

CREATE FUNCTION public.drop_history_table_keep_data(live_table regclass) RETURNS void
    LANGUAGE plpgsql VOLATILE
AS $$
    DECLARE

        -- This will contain the name of the newly created history table. No
        -- regclass is used, because the implicit table existence check on variable
        -- assignment can fail if the table has already been removed by an
        -- cascaded table drop.
        history_table_name text;

    BEGIN

        -- History tables will be named like the live table plus a '__history' suffix
        history_table_name = get_history_table_name(live_table);

        -- Cascading deleting is used to also delete child tables and triggers.
        EXECUTE format('DROP TRIGGER IF EXISTS %I ON %s',
            get_tracking_table_update_trigger_name(), live_table);
        EXECUTE format('DROP TRIGGER IF EXISTS %I ON %s',
            get_tracking_table_truncate_trigger_name(), live_table);

        EXECUTE format('DROP TRIGGER IF EXISTS %I ON %s',
            get_history_update_trigger_name_regular(), live_table);
        EXECUTE format('DROP TRIGGER IF EXISTS %I ON %s',
            get_history_update_trigger_name_tracking(), live_table);
        EXECUTE format('DROP FUNCTION IF EXISTS %s() CASCADE',
            get_history_update_fn_name_regular(live_table));
        EXECUTE format('DROP TRIGGER IF EXISTS %I ON %s',
            get_history_truncate_trigger_name(), live_table);

        EXECUTE format('DROP INDEX IF EXISTS %I',
            history_table_name || '_live_pk_index');
        EXECUTE format('DROP INDEX IF EXISTS %I',
            history_table_name || '_sys_period');
        EXECUTE format('DROP INDEX IF EXISTS %I',
            history_table_name || '_exec_transaction_id');

        -- Remove from created table log
        DELETE FROM catmaid_history_table cht WHERE cht.live_table = $1;
    END;
    $$;

CREATE OR REPLACE FUNCTION public.update_history_cardinality_restriction_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO cardinality_restriction__history (id,user_id,project_id,creation_time,edition_time,txid,enabled,restricted_link_id,cardinality_type,value,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.enabled,ot.restricted_link_id,ot.cardinality_type,ot.value, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_change_request_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO change_request__history (id,user_id,project_id,creation_time,edition_time,txid,type,description,status,recipient_id,location,treenode_id,connector_id,validate_action,approve_action,reject_action,completion_time,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.type,ot.description,ot.status,ot.recipient_id,ot.location,ot.treenode_id,ot.connector_id,ot.validate_action,ot.approve_action,ot.reject_action,ot.completion_time, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_class_class_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO class_class__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,class_a,class_b,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.class_a,ot.class_b, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_class_instance_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO class_instance_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,class_instance_a,class_instance_b,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.class_instance_a,ot.class_instance_b, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,class_id,name,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.class_id,ot.name, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_class_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO class__history (id,user_id,project_id,creation_time,edition_time,txid,class_name,description,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.class_name,ot.description, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_concept_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO concept__history (id,user_id,project_id,creation_time,edition_time,txid,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_connector_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO connector_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,connector_id,class_instance_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.connector_id,ot.class_instance_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_point_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO point_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,point_id,class_instance_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.point_id,ot.class_instance_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_point_connector_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO point_connector__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,point_id,connector_id,confidence,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.point_id,ot.connector_id,ot.confidence, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_region_of_interest_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO region_of_interest_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,region_of_interest_id,class_instance_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.region_of_interest_id,ot.class_instance_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_relation_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO relation_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_relation_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO relation__history (id,user_id,project_id,creation_time,edition_time,txid,relation_name,uri,description,isreciprocal,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_name,ot.uri,ot.description,ot.isreciprocal, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_restriction_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO restriction__history (id,user_id,project_id,creation_time,edition_time,txid,enabled,restricted_link_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.enabled,ot.restricted_link_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_stack_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO stack_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,class_instance_id,stack_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.class_instance_id,ot.stack_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_stack_group_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO stack_group_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,class_instance_id,stack_group_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.class_instance_id,ot.stack_group_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_treenode_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO treenode_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,treenode_id,class_instance_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.treenode_id,ot.class_instance_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_treenode_connector_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO treenode_connector__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,treenode_id,connector_id,skeleton_id,confidence,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.treenode_id,ot.connector_id,ot.skeleton_id,ot.confidence, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_treenode_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO treenode__history (id,project_id,location_x,location_y,location_z,editor_id,user_id,creation_time,edition_time,txid,skeleton_id,parent_id,radius,confidence,sys_period,exec_transaction_id)
                SELECT ot.id,ot.project_id,ot.location_x,ot.location_y,ot.location_z,ot.editor_id,ot.user_id,ot.creation_time,ot.edition_time,ot.txid,ot.skeleton_id,ot.parent_id,ot.radius,ot.confidence, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE OR REPLACE FUNCTION public.update_history_volume_class_instance_reg() RETURNS trigger
    LANGUAGE plpgsql VOLATILE
AS $$
            BEGIN

                -- Insert new historic data into history table, based on the
                -- currently available columns in the updated table.
                INSERT INTO volume_class_instance__history (id,user_id,project_id,creation_time,edition_time,txid,relation_id,volume_id,class_instance_id,sys_period,exec_transaction_id)
                SELECT ot.id,ot.user_id,ot.project_id,ot.creation_time,ot.edition_time,ot.txid,ot.relation_id,ot.volume_id,ot.class_instance_id, tstzrange(LEAST(ot.edition_time, current_timestamp), current_timestamp), txid_current()
                FROM old_treenode ot;

                RETURN NULL;
            END;
            $$;

CREATE TRIGGER on_edit_cardinality_restrictions BEFORE UPDATE ON public.cardinality_restriction FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_edit_point_class_instance BEFORE UPDATE ON public.point_class_instance FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_edit_point_connector BEFORE UPDATE ON public.point_connector FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_edit_region_of_interest_class_instance BEFORE UPDATE ON public.region_of_interest_class_instance FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_stack_class_instance BEFORE UPDATE ON public.stack_class_instance FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_stack_group_class_instance BEFORE UPDATE ON public.stack_group_class_instance FOR EACH ROW EXECUTE PROCEDURE on_edit();

CREATE TRIGGER on_edit_volume_class_instance BEFORE UPDATE ON public.volume_class_instance FOR EACH ROW EXECUTE PROCEDURE on_edit();

DROP SEQUENCE public.skeleton_origin_id_seq;

DROP INDEX public.catmaid_sampler_project_id_c93395a7;

DROP INDEX public.catmaid_sampler_sampler_state_id_80e7961f;

DROP INDEX public.catmaid_sampler_skeleton_id_dfc98008;

DROP INDEX public.catmaid_sampler_user_id_8d1c228f;

DROP INDEX public.catmaid_skeleton_summary_project_id_7340fa33;

DROP INDEX public.point_connector_project_id_uniq;

DROP INDEX public.review_project_id;

DROP INDEX public.review_reviewer_id;

DROP INDEX public.review_skeleton_id;

DROP INDEX public.review_treenode_id;

DROP INDEX public.treenode_class_instance_class_instance_id;

DROP INDEX public.treenode_class_instance_project_id;

DROP INDEX public.treenode_class_instance_relation_id;

DROP INDEX public.treenode_class_instance_treenode_id;

DROP INDEX public.treenode_class_instance_user_id;

DROP INDEX public.treenode_connector_connector_id;

DROP INDEX public.treenode_connector_creation_time_idx;

DROP INDEX public.treenode_connector_project_id;

DROP INDEX public.treenode_connector_project_id_uniq;

DROP INDEX public.treenode_connector_relation_id;

DROP INDEX public.treenode_connector_skeleton_id;

DROP INDEX public.treenode_connector_treenode_id;

DROP INDEX public.treenode_connector_user_id;

DROP INDEX public.treenode_creation_time_index;

DROP INDEX public.treenode_edition_time_index;

DROP INDEX public.treenode_location_x_index;

DROP INDEX public.treenode_location_y_index;

DROP INDEX public.treenode_location_z_index;

DROP INDEX public.treenode_parent_id;

DROP INDEX public.treenode_project_id_skeleton_id_index;

DROP INDEX public.treenode_project_id_user_id_index;

DROP INDEX public.treenode_skeleton_id_index;
@tomka tomka force-pushed the features/64-bit-concept-ids branch from 2de4815 to 90fb281 Compare January 22, 2020 21:20
@tomka
Copy link
Contributor Author

tomka commented Jan 23, 2020

After a few more iterations and review sessions I am now finally ready to merge this. I compared the schema before and after this migrations both manually and semi-automatically using pgquarrel (the generated effective schema diff is part of the commit message) and all changes seem correct and intended.

Of course I did also a bunch tests on performance and table/index size. With a larger ID data type and a few of covering indices (INCLUDE) the required space is now ~5% larger for most tables inheriting from concept. A few bigger tables now have some covering indices (e.g. class_instance or class_instance_class_instance) need about ~10% more space. This is compared to a fully vacuumed database (FAFBv14), so in practice the difference is smaller, because many tables have probably collected quite some dead tuples over time. In fact, after migration backups of actively used databases, the new tables were smaller due to the table rewrite (which, is basically a VACUUM FULL for those tables). Of course, this is only a temporary effect.

Performance-wise, the increased index sizes don't seem to contribute much during INSERT and UPDATE statements. Large updates like a split of a very big neuron, are slightly slower, but in all cases the increase in time was <10%. Some class_instance and class_instance_class_instance related queries can now run a bit faster du to index-only scans that are allowed by the covering indices (e.g. connectivity/path search). This is mainly helpful in large setups at the moment though.

As suggested before by @unidesigner and @aschampion, we should continue to improve 64 bit support on the front-end next and test generating BigInt64 from our JSON responses. I created #1963 to continue the discussion there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants