Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions graphile.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { makePgSmartTagsFromFilePlugin } from "postgraphile/utils";
import { PostGraphileConnectionFilterPreset } from "postgraphile-plugin-connection-filter";
import { PgAggregatesPreset } from "@graphile/pg-aggregates";
import { PgManyToManyPreset } from "@graphile-contrib/pg-many-to-many";
// import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection";
import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection";
import PersistedPlugin from "@grafserv/persisted";
import { PgOmitArchivedPlugin } from "@graphile-contrib/pg-omit-archived";
import { dirname } from "path";
Expand All @@ -27,11 +27,15 @@ const preset: GraphileConfig.Preset = {
/* Enter your V4 options here */
graphiql: true,
graphiqlRoute: "/",
simpleCollections: "only",
graphileBuildOptions: {
pgOmitListSuffix: true,
},
}),
PostGraphileConnectionFilterPreset,
PgManyToManyPreset,
PgAggregatesPreset,
// PgSimplifyInflectionPreset
PgSimplifyInflectionPreset,
],
plugins: [PersistedPlugin.default, PgOmitArchivedPlugin, TagsFilePlugin],
pgServices: [
Expand Down
93 changes: 92 additions & 1 deletion schema.sql
Original file line number Diff line number Diff line change
@@ -1 +1,92 @@
-- Create your database schema here
DROP SCHEMA IF EXISTS app_data CASCADE;

CREATE SCHEMA app_data;

CREATE TABLE app_data.versions (
id INTEGER NOT NULL
);

CREATE SEQUENCE app_data.versions_id_seq;

CREATE TABLE app_data.objects (
id INTEGER NOT NULL,
version_id INTEGER NOT NULL,
name TEXT NOT NULL DEFAULT ''
);

CREATE TABLE app_data.object_states (
id INTEGER NOT NULL,
version_id INTEGER NOT NULL,
object_id INTEGER NOT NULL,
value INTEGER NULL DEFAULT NULL
);

ALTER TABLE ONLY app_data.versions
ADD CONSTRAINT "pkey_versions" PRIMARY KEY (id);
ALTER TABLE ONLY app_data.objects
ADD CONSTRAINT "pkey_objects" PRIMARY KEY (id, version_id);
CREATE INDEX "idx_objects_version_id" ON app_data.objects (version_id, id);
ALTER TABLE ONLY app_data.object_states
ADD CONSTRAINT "pkey_object_states" PRIMARY KEY (id, version_id);
CREATE INDEX "idx_object_states_version_id" ON app_data.object_states (version_id, id);

ALTER TABLE ONLY app_data.objects
ADD CONSTRAINT "fkey_objects_version_id" FOREIGN KEY (version_id) REFERENCES app_data.versions (id) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE ONLY app_data.object_states
ADD CONSTRAINT "fkey_object_states_version_id" FOREIGN KEY (version_id) REFERENCES app_data.versions (id) DEFERRABLE INITIALLY DEFERRED;

-- Default schema for Postgraphile follows

CREATE VIEW objects AS
WITH results AS MATERIALIZED (
SELECT
*
FROM (
SELECT DISTINCT ON (r.id)
r.*
FROM
app_data.objects r
WHERE
r.version_id > 0
ORDER BY
r.id,
r.version_id DESC
) v
) SELECT * FROM results;
COMMENT ON VIEW objects IS $$
@primaryKey id
$$;

CREATE VIEW object_states AS
WITH results AS MATERIALIZED (
SELECT
*
FROM (
SELECT DISTINCT ON (r.id)
r.*
FROM
app_data.object_states r
WHERE
r.version_id > 0
ORDER BY
r.id,
r.version_id DESC
) v
) SELECT * FROM results;
COMMENT ON VIEW object_states IS $$
@primaryKey id
@foreignKey (object_id) references objects (id)|@notNull|@fieldName object|@foreignFieldName states|The associated object.|
$$;

-- Generate sample data

DO $$
DECLARE
v_i INTEGER;
BEGIN
FOR v_i IN 1..10000 LOOP
INSERT INTO app_data.versions (id) VALUES (v_i);
INSERT INTO app_data.objects (id, version_id) VALUES (v_i, v_i);
INSERT INTO app_data.object_states (id, version_id, object_id, value) VALUES (v_i, v_i, v_i, v_i);
END LOOP;
END $$;