UNPKG

@deep-foundation/deeplinks

Version:

[![npm](https://img.shields.io/npm/v/@deep-foundation/deeplinks.svg)](https://www.npmjs.com/package/@deep-foundation/deeplinks) [![Gitpod](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/deep-fo

332 lines (322 loc) 18 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { generateApolloClient } from '@deep-foundation/hasura/client.js'; import { sql } from '@deep-foundation/hasura/sql.js'; import Debug from 'debug'; import { DeepClient } from '../imports/client.js'; import { api, SCHEMA } from './1616701513782-links.js'; const debug = Debug('deeplinks:migrations:selectors'); const log = debug.extend('log'); const error = debug.extend('error'); export const TABLE_NAME = 'selectors_cache'; export const LINKS_TABLE_NAME = 'links'; export const MP_TABLE_NAME = 'mp'; const client = generateApolloClient({ path: `${process.env.MIGRATIONS_HASURA_PATH}/v1/graphql`, ssl: !!+(process.env.MIGRATIONS_HASURA_SSL || 0), secret: process.env.MIGRATIONS_HASURA_SECRET, }); const deep = new DeepClient({ apolloClient: client, }); export const up = () => __awaiter(void 0, void 0, void 0, function* () { log('up'); log('selectors-cache table'); yield api.sql(sql ` CREATE TABLE ${SCHEMA}."${TABLE_NAME}" ( id bigint PRIMARY KEY, link_id bigint DEFAULT 0, tree_id bigint DEFAULT 0, selector_include_id bigint DEFAULT 0, selector_exclude_id bigint DEFAULT 0, selector_tree_id bigint DEFAULT 0, selector_filter_bool_exp_id bigint DEFAULT 0, selector_id bigint DEFAULT 0, rule_id bigint DEFAULT 0, rule_object_id bigint DEFAULT 0, rule_subject_id bigint DEFAULT 0, rule_action_id bigint DEFAULT 0 ); CREATE SEQUENCE ${TABLE_NAME}_id_seq AS bigint START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE ${TABLE_NAME}_id_seq OWNED BY ${SCHEMA}."${TABLE_NAME}".id; ALTER TABLE ONLY ${SCHEMA}."${TABLE_NAME}" ALTER COLUMN id SET DEFAULT nextval('${TABLE_NAME}_id_seq'::regclass); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__id_hash ON ${TABLE_NAME} USING hash (id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__link_id_hash ON ${TABLE_NAME} USING hash (link_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__link_id_btree ON ${TABLE_NAME} USING btree (link_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__tree_id_hash ON ${TABLE_NAME} USING hash (tree_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__tree_id_btree ON ${TABLE_NAME} USING btree (tree_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_include_id_hash ON ${TABLE_NAME} USING hash (selector_include_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_include_id_btree ON ${TABLE_NAME} USING btree (selector_include_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_exclude_id_hash ON ${TABLE_NAME} USING hash (selector_exclude_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_exclude_id_btree ON ${TABLE_NAME} USING btree (selector_exclude_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_tree_id_hash ON ${TABLE_NAME} USING hash (selector_tree_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_tree_id_btree ON ${TABLE_NAME} USING btree (selector_tree_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_filter_bool_exp_id_hash ON ${TABLE_NAME} USING hash (selector_filter_bool_exp_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_filter_bool_exp_id_btree ON ${TABLE_NAME} USING btree (selector_filter_bool_exp_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_id_hash ON ${TABLE_NAME} USING hash (selector_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__selector_id_btree ON ${TABLE_NAME} USING btree (selector_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_id_hash ON ${TABLE_NAME} USING hash (rule_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_id_btree ON ${TABLE_NAME} USING btree (rule_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_object_id_hash ON ${TABLE_NAME} USING hash (rule_object_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_object_id_btree ON ${TABLE_NAME} USING btree (rule_object_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_subject_id_hash ON ${TABLE_NAME} USING hash (rule_subject_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_subject_id_btree ON ${TABLE_NAME} USING btree (rule_subject_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_action_id_hash ON ${TABLE_NAME} USING hash (rule_action_id); CREATE INDEX IF NOT EXISTS ${TABLE_NAME}__rule_action_id_btree ON ${TABLE_NAME} USING btree (rule_action_id); `); yield api.query({ type: 'track_table', args: { schema: SCHEMA, name: `${TABLE_NAME}`, }, }); log('selectors-cache trigger'); yield api.sql(sql `CREATE OR REPLACE FUNCTION ${TABLE_NAME}__insert__function() RETURNS TRIGGER AS $trigger$ DECLARE selectorTree RECORD; selectorCursor RECORD; selectorFilter RECORD; boolExpId bigint = 0; selectorId bigint; ruleAction RECORD; ruleObject RECORD; caches RECORD; ruleSubject RECORD; insertedIncludeId bigint = 0; insertedExcludeId bigint = 0; BEGIN IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorTree')}) THEN selectorTree := NEW; SELECT t.* into selectorCursor FROM "${LINKS_TABLE_NAME}" as t WHERE ( t."id" = selectorTree."from_id" ); IF (selectorCursor IS NOT NULL) THEN SELECT t.* into selectorFilter FROM "${LINKS_TABLE_NAME}" as t WHERE ( t."from_id" = selectorCursor."from_id" AND t."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorFilter')} ); IF selectorFilter IS NOT NULL THEN boolExpId := selectorFilter."to_id"; END IF; SELECT t.* into ruleAction FROM "${LINKS_TABLE_NAME}" as t WHERE ( t."to_id" = selectorCursor."from_id" AND t."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleAction')} ); SELECT t.* into ruleObject FROM "${LINKS_TABLE_NAME}" as t WHERE ( t."to_id" = selectorCursor."from_id" AND t."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleObject')} ); SELECT t.* into ruleSubject FROM "${LINKS_TABLE_NAME}" as t WHERE ( t."to_id" = selectorCursor."from_id" AND t."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleSubject')} ); IF (selectorCursor."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorInclude')}) THEN INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id") VALUES (selectorCursor."to_id", selectorTree."to_id", selectorCursor."id", selectorTree."id", selectorCursor."from_id", boolExpId) RETURNING "id" into insertedIncludeId; END IF; IF (selectorCursor."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorExclude')}) THEN INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id") VALUES (selectorCursor."to_id", selectorTree."to_id", selectorCursor."id", selectorTree."id", selectorCursor."from_id", boolExpId) RETURNING "id" into insertedExcludeId; END IF; IF (ruleAction IS NOT NULL) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."id" IN (insertedIncludeId, insertedExcludeId) AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_action_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", ruleAction."from_id", ruleAction."id"); END LOOP; END IF; IF (ruleObject IS NOT NULL) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."id" IN (insertedIncludeId, insertedExcludeId) AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_object_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", ruleObject."from_id", ruleObject."id"); END LOOP; END IF; IF (ruleSubject IS NOT NULL) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."id" IN (insertedIncludeId, insertedExcludeId) AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_subject_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", ruleSubject."from_id", ruleSubject."id"); END LOOP; END IF; END IF; END IF; IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorFilter')}) THEN UPDATE "${TABLE_NAME}" SET "selector_filter_bool_exp_id" = NEW."to_id" WHERE "selector_id" = NEW."from_id"; END IF; IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorInclude')}) THEN FOR caches IN ( SELECT DISTINCT ON(cache."selector_tree_id", cache."selector_id", cache."rule_id", cache."rule_object_id", cache."rule_subject_id", cache."rule_action_id") cache.* FROM "${TABLE_NAME}" as cache WHERE cache."selector_id" = NEW."from_id" ) LOOP INSERT INTO "${TABLE_NAME}" ( "link_id", "selector_include_id", "selector_filter_bool_exp_id", "selector_tree_id", "selector_id", "rule_id", "rule_object_id", "rule_subject_id", "rule_action_id" ) VALUES ( NEW."to_id", NEW."id", caches."selector_filter_bool_exp_id", caches."selector_tree_id", caches."selector_id", caches."rule_id", caches."rule_object_id", caches."rule_subject_id", caches."rule_action_id" ); END LOOP; -- TODO: Insert selector include cache row if nothing to multiply (first creation of selector and selector include) END IF; IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleAction')}) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."selector_id" = NEW."to_id" AND cache."rule_id" = 0 AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_action_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", NEW."from_id", NEW."id"); END LOOP; END IF; IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleObject')}) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."selector_id" = NEW."to_id" AND cache."rule_id" = 0 AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_object_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", NEW."from_id", NEW."id"); END LOOP; END IF; IF (NEW."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleSubject')}) THEN FOR caches IN ( SELECT cache.* FROM "${TABLE_NAME}" as cache WHERE cache."selector_id" = NEW."to_id" AND cache."rule_id" = 0 AND ( cache."selector_include_id" != 0 OR cache."selector_exclude_id" != 0 ) ) LOOP INSERT INTO "${TABLE_NAME}" ("link_id", "tree_id", "selector_include_id", "selector_exclude_id", "selector_tree_id", "selector_id", "selector_filter_bool_exp_id", "rule_id", "rule_subject_id") VALUES (caches."link_id", caches."tree_id", caches."selector_include_id", caches."selector_exclude_id", caches."selector_tree_id", caches."selector_id", caches."selector_filter_bool_exp_id", NEW."from_id", NEW."id"); END LOOP; END IF; RETURN NEW; END; $trigger$ LANGUAGE plpgsql;`); yield api.sql(sql `CREATE TRIGGER ${TABLE_NAME}__insert__trigger AFTER INSERT ON "${LINKS_TABLE_NAME}" FOR EACH ROW EXECUTE PROCEDURE ${TABLE_NAME}__insert__function();`); yield api.sql(sql `CREATE OR REPLACE FUNCTION ${TABLE_NAME}__delete__function() RETURNS TRIGGER AS $trigger$ BEGIN IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'Selector')}) THEN DELETE FROM ${TABLE_NAME} WHERE "selector_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorInclude')}) THEN DELETE FROM ${TABLE_NAME} WHERE "selector_include_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorExclude')}) THEN DELETE FROM ${TABLE_NAME} WHERE "selector_exclude_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorTree')}) THEN DELETE FROM ${TABLE_NAME} WHERE "selector_tree_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'Tree')}) THEN DELETE FROM ${TABLE_NAME} WHERE "tree_id" = OLD."id"; END IF; DELETE FROM ${TABLE_NAME} WHERE "link_id" = OLD."id"; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'SelectorFilter')}) THEN UPDATE "${TABLE_NAME}" SET "selector_filter_bool_exp_id" = 0 WHERE "selector_id" = OLD."from_id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'Query')}) THEN UPDATE "${TABLE_NAME}" SET "selector_filter_bool_exp_id" = 0 WHERE "selector_filter_bool_exp_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'Rule')}) THEN DELETE FROM ${TABLE_NAME} WHERE "rule_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleAction')}) THEN DELETE FROM ${TABLE_NAME} WHERE "rule_action_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleObject')}) THEN DELETE FROM ${TABLE_NAME} WHERE "rule_object_id" = OLD."id"; END IF; IF (OLD."type_id" = ${deep.idLocal('@deep-foundation/core', 'RuleSubject')}) THEN DELETE FROM ${TABLE_NAME} WHERE "rule_subject_id" = OLD."id"; END IF; RETURN OLD; END; $trigger$ LANGUAGE plpgsql;`); yield api.sql(sql `CREATE TRIGGER ${TABLE_NAME}__delete__trigger AFTER DELETE ON "${LINKS_TABLE_NAME}" FOR EACH ROW EXECUTE PROCEDURE ${TABLE_NAME}__delete__function();`); }); export const down = () => __awaiter(void 0, void 0, void 0, function* () { log('down'); log('selectors-cache trigger'); yield api.sql(sql ` DROP TRIGGER IF EXISTS ${TABLE_NAME}__insert__trigger ON ${LINKS_TABLE_NAME} CASCADE; DROP FUNCTION IF EXISTS ${TABLE_NAME}__insert__function() CASCADE; `); yield api.sql(sql ` DROP TRIGGER IF EXISTS ${TABLE_NAME}__delete__trigger ON ${LINKS_TABLE_NAME} CASCADE; DROP FUNCTION IF EXISTS ${TABLE_NAME}__delete__function() CASCADE; `); log('selectors-cache table'); yield api.query({ type: 'untrack_table', args: { table: { schema: SCHEMA, name: TABLE_NAME, }, cascade: true, }, }); yield api.sql(sql ` DROP TABLE ${TABLE_NAME} CASCADE; `); }); //# sourceMappingURL=1616701513790-selectors-cache.js.map