Prefix: graphql_.

A complete transcription of the GraphQL schema documents, as any SDL reader would see them. Every type, field, argument and directive application lands here exactly as written, with no judgment about what any of it means. The judgment it does hold is the verdict of the toolchain this graph is built with on whether the documents parse and make a schema at all.

Where to start

graphql_type_element

A type name exists in this graph: the anchor every SDL fact, every directive decode and every type-keyed derivation hangs off.

graphql_field

What a field at a coordinate is: its type expression, its description, its default and the site that contributed it, hanging off graphql_field_element.

graphql_directive_application

One directive an author applied, at the coordinate they applied it to: one row per application, however many sites the corpus writes them at.

How this family meets the others

The normalization crossings declared for this family: rules by which a name written in one family’s vocabulary is matched against another’s census. Declared rows rather than a closed set, so a crossing nobody has declared does not appear here.

Declared crossings
intent_column_match_claim (graphql_ spellings against the sql_ census)

A field’s own name meets the columns of the table its site navigates to, case-insensitively, with no directive involved.

Declared key edges
store_

45 foreign keys from this family’s rows into that one.

graphitron_

93 foreign keys from that family’s rows into this one.

intent_

3 foreign keys from that family’s rows into this one.

Why the name is right

Generic GraphQL: a row any SDL reader could produce from the document without knowing graphitron exists, which is every declaration, every directive definition, and every directive application including graphitron’s own. The family is a total transcription, with no hole where graphitron’s namespace was: whether an application survives into the emitted schema is a namespace query over graphql_directive at emission time, not something capture decides by choosing a table, and a directive that is both re-emitted and decoded (federation’s @key) is simply a row in each family rather than a special case. The reader-neutrality test binds the transcription. One resident is a verdict rather than a declaration (graphql_schema_problem: what the toolchain concluded about whether the documents are a schema at all, at whichever of its four reading stages concluded it), which makes this the one family holding both a transcription and a judgement of the same artifact. The verdict is not reader-neutral and does not claim to be: it is that of the toolchain this graph is built with, graphql-java plus the federation link processor and the configured loading rewrites, because a reader-neutral verdict is one that reports a federation @link’s imports as undeclared directives the build never sees, and a verdict that disagrees with the build is wrong about this graph rather than neutral about it. It stays beside the transcription it judges, the alternative being a second family aliasing this one’s subject.

graphql_argument

What an argument on a field is, hanging off graphql_argument_element. Net-new coordinate: today arguments are classified per-field and mostly projected away, with no location kept. Nothing references this relation, on graphql_type’s terms.

Primary key: (graph_name, type_name, field_name, argument_name). Foreign key: (graph_name, type_name, field_name, argument_name) references graphql_argument_element (graph_name, type_name, field_name, argument_name). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

owning type of the field the argument sits on

field_name (CHARACTER VARYING, not null)

the field name within the owning type

argument_name (CHARACTER VARYING, not null)

the argument name within the owning field

ordinal (INTEGER, not null)

declaration order within the field

type_sdl (CHARACTER VARYING, not null)

rendered type expression, as on graphql_field

named_type (CHARACTER VARYING, not null)

the named type the expression bottoms out in; author-spelled, no FK

non_null (BOOLEAN, not null)

outermost non-null wrapper present

is_list (BOOLEAN, not null)

a list wrapper is present

item_non_null (BOOLEAN, nullable)

item-level non-null when is_list; NULL otherwise

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Carried from the entry rather than left behind by the anchoring, because the four columns beside it describe a type expression exactly when this is 0 or 1 and a reader that must tell those from a deeper one has nothing else to ask. A reader without it parses type_sdl, which is what the macro expansion did to find the carriers it may expand

default_value_sdl (CHARACTER VARYING, nullable)

rendered default value, when declared

description (CHARACTER VARYING, nullable)

SDL description string, when the author wrote one

source_name (CHARACTER VARYING, nullable)

the SDL file the row was captured from

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

argument_name_upper (CHARACTER VARYING, nullable)

the upper-cased form of the column beside it, for the case-insensitive match against sql_column’s column_name_upper and jooq_name_upper where @field(name:) was omitted and the argument name stands in as a column spelling. Generated, so nothing writes it and nothing can. The argument-site counterpart of graphql_field.field_name_upper, folded for the same one crossing and for no other: nothing compares one argument name to another case-insensitively

graphql_argument_element

An argument coordinate exists on a field: the anchor for the argument-keyed decode relations, on graphql_type_element’s terms and for its reason.

Primary key: (graph_name, type_name, field_name, argument_name). Foreign key: (graph_name, type_name, field_name) references graphql_field_element (graph_name, type_name, field_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

owning type of the field the argument sits on

field_name (CHARACTER VARYING, not null)

the field the argument sits on, anchored by graphql_field_element

argument_name (CHARACTER VARYING, not null)

the argument name within the owning field

coordinate (CHARACTER VARYING, not null)

this row as graphql_element spells it, Type.field(argument:) in the specification’s grammar, the trailing colon included because the specification writes it; the join down from the supertype, on graphql_type_element.coordinate’s terms and written the same way

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms. Swept per graph and after its children, a key-to-coordinate row being what a reader joins through and so outliving nothing that still points at it. NOT NULL on graphql_element’s reasoning: a sweep that skipped unstamped rows would not be a sweep

graphql_ast_applied_argument_entry

An argument of a directive application as one document wrote it: this position in this file passes a value of this name to the application it was written inside. For example the fields: "id" inside @key(fields: "id") is one row, carrying the value as it was written.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside. No foreign key defends it: the parent is a row of whichever relation holds that kind, and picking the relation is a resolution

parent_column (INTEGER, not null)

source column of the same. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

value_sdl (CHARACTER VARYING, not null)

the value exactly as written, in SDL. The decomposition of it is in graphql_ast_value_entry, one row per node of the expression, which is what a reader wanting the parts reads; this column is the whole literal in one string and is owed a removal once nothing reads it

graphql_ast_directive_application_entry

This written position applies a directive, and this is the name it applies: the five entry kinds that are an application, under the nineteen that need not be. For example the @key on type Widget @key(fields: "id") is one row here, and the declaration it was written on is one row of graphql_ast_element_entry beside it.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, carried from the entry this describes

source_name (CHARACTER VARYING, not null)

the file the application was written in

source_line (INTEGER, not null)

line of the application, which is the entry’s own position

source_column (INTEGER, not null)

column of the same. Keyed by the position because a position is what an application has: a directive applied twice in one file is two rows here, and the name is what they share rather than what tells them apart

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. The one column the five sites share, which is why this relation exists: a reader asking where a named directive was written joins this once instead of unioning five relations that differ only in what the application was written inside. What it was written inside is the parent hop graphql_ast_entry already carries, so the site is a join away and not a column here

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran, carried from the entry this describes. The reading finishes by deleting its file’s rows carrying an older instant, and this relation is swept beside the arms that write it so a position the author removed leaves the hierarchy whole

graphql_ast_directive_argument_entry

An argument a directive definition declares, as one document wrote it: this position in this file declares an argument of this name on the definition it was written inside. For example the fields: String! inside directive @key(fields: String!) on OBJECT.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_directive_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_directive_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

type_sdl (CHARACTER VARYING, not null)

the type expression exactly as written, wrappers and all, so nothing about what the author typed is lost to the four columns beside it

named_type (CHARACTER VARYING, not null)

the type name at the bottom of the expression, the wrappers stripped. Unwrapped here because it is the graphql-java Type node read down its own spine, which is three lines in Java and a parser in SQL; nothing about the corpus is consulted, so this stays a transcription

non_null (BOOLEAN, not null)

whether the outermost wrapper is a non-null, which for a list is about the list and not its items

is_list (BOOLEAN, not null)

whether the expression is a list at its outermost non-null

item_non_null (BOOLEAN, nullable)

whether the outermost list’s items are non-null, NULL when the expression is not a list at all. At list_depth 1 that is the named type’s own nullability; deeper, it is the nullability of the list one level in

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Here so the four columns beside it are complete rather than nearly: they describe a type expression exactly when this is 0 or 1, and a reader that needs to tell those cases from a deeper one asks this column instead of parsing type_sdl. Recording the depth rather than refusing the document, because a transcription records what the author wrote; that graphitron’s own wrapper algebra stops at one list is a fact about the generator and belongs in a detection over this column

default_value_sdl (CHARACTER VARYING, nullable)

the default value exactly as written, or NULL where none was

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_directive_definition_entry

A DirectiveDefinition as one document wrote it: this position in this file defines a directive of this name. For example directive @key(fields: String!) repeatable on OBJECT is one row, its argument and its two locations being rows of their own that name this position.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

repeatable (BOOLEAN, not null)

whether the definition carried the repeatable keyword

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_directive_location_entry

A DirectiveLocation as one document wrote it: this position in this file names a place the directive defined above it may be applied. For example the OBJECT and the INTERFACE of directive @key on OBJECT | INTERFACE are two rows.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_directive_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_directive_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

location (CHARACTER VARYING, not null)

the location name written here, kept as written and not checked against the specification’s list, which is graphql-java’s to police and the schema problems' to report

graphql_ast_element_declaration

The declaration one element-declaring position was written inside, which is itself where the position is a declaration. For example the lang: of Film.title(lang:) reaches the type declaration Film in two hops, through the field it is an argument of, and that type declaration reaches itself in nought.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Check: "DECLARATION_KIND" IN('TYPE_DECLARATION', 'SCHEMA_DEFINITION', 'DIRECTIVE_DEFINITION').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, carried from the element entry this is about

source_name (CHARACTER VARYING, not null)

the file the element was declared in, the first of the three columns naming its position. The declaration is in the same file by construction, a node being written inside the file that holds it, so the position below names both

source_line (INTEGER, not null)

line of the element’s own position, the second

source_column (INTEGER, not null)

column of the same, the third; with the two columns above, a reference into graphql_ast_element_entry, and the whole grain. A position sits inside exactly one declaration, so this answers once per element and never twice

declaration_kind (CHARACTER VARYING, not null)

which of the three kinds of declaration was reached: a type declaration, the schema block, or a directive definition. Carried rather than left to be joined because the three are told apart in the entry supertype and a reader stopping here should not have to go back for it

declaration_line (INTEGER, not null)

line of the declaration reached, the first of the two columns naming it within the file above

declaration_column (INTEGER, not null)

column of the same. With the file name above, the key of graphql_type_declaration for a type, which is where the merge order that numbers a repeated directive application comes from. Stated here rather than at each consumer because the hop count differs by what the element is, nought for a declaration, one for a field or an enum value, two for a field’s argument, and a consumer that unioned an arm per depth would be re-deriving the parent chain the entries already hold

graphql_ast_element_declaration_rule (view)

One row the walk up the entry parent chain computes, in the shape graphql_ast_element_declaration stores: the rule itself, evaluated on demand rather than read off disk. For example capture inserts this view’s rows for one graph into graphql_ast_element_declaration before numbering the directive applications, which is the name the reader spells.

Columns
graph_name (CHARACTER VARYING, nullable)

the graph_name of a row of this rule, which capture writes into graphql_ast_element_declaration.graph_name

source_name (CHARACTER VARYING, nullable)

the source_name of a row of this rule, which capture writes into graphql_ast_element_declaration.source_name

source_line (INTEGER, nullable)

the source_line of a row of this rule, which capture writes into graphql_ast_element_declaration.source_line

source_column (INTEGER, nullable)

the source_column of a row of this rule, which capture writes into graphql_ast_element_declaration.source_column

declaration_kind (CHARACTER VARYING, nullable)

the declaration_kind of a row of this rule, which capture writes into graphql_ast_element_declaration.declaration_kind

declaration_line (INTEGER, nullable)

the declaration_line of a row of this rule, which capture writes into graphql_ast_element_declaration.declaration_line

declaration_column (INTEGER, nullable)

the declaration_column of a row of this rule, which capture writes into graphql_ast_element_declaration.declaration_column

graphql_ast_element_entry

This written position declares a schema element, and this is the coordinate it declares: the eight entry kinds that name one, under the nineteen that need not. For example type Widget declares Widget, the field under it declares Widget.name, and a directive definition declares @widget and @widget(arg:), while the directive applied to that field declares nothing and has no row here. A schema block declares $schema, which is ours.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, carried from the entry this describes

source_name (CHARACTER VARYING, not null)

the file the declaration was written in

source_line (INTEGER, not null)

line of the declaration, which is the entry’s own position

source_column (INTEGER, not null)

column of the same. Keyed by the position and not by the coordinate, two documents declaring one type being two rows here and one row in graphql_element, which is the whole difference between what a document wrote and what the corpus settled on

coordinate (CHARACTER VARYING, not null)

the coordinate this declaration names, in the specification’s grammar. A string the document’s own names compose and nothing else: no key into graphql_element, which does not exist when this is written and which is this relation’s composed counterpart rather than its parent. The subtypes each generate the same expression from their own columns, and this is where that spelling is stated once for a reader who wants the coordinate without knowing which kind declared it. The schema block’s $schema is the one spelling composed from no name at all, a schema block having none, and a dollar sign being illegal in a GraphQL name is what makes a constant safe here

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran, carried from the entry this describes. The reading finishes by deleting its file’s rows carrying an older instant, and this relation is swept beside the arms that write it so a position the author removed leaves the hierarchy whole

graphql_ast_entry

A written position exists in this document: the supertype of the nineteen entry relations, keyed by the position the parse read it at, and carrying which of them holds the rest of it. For example the @field on name: String @field(name: "title") is one row of kind FIELD_DIRECTIVE, written inside the field declaration whose position it names as its parent.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Check: ("PARENT_LINE" IS NULL) = ("PARENT_COLUMN" IS NULL). Check: "ENTRY_KIND" IN('TYPE_DECLARATION', 'DIRECTIVE_DEFINITION', 'SCHEMA_DEFINITION', 'FIELD_DEFINITION', 'ENUM_VALUE_DEFINITION', 'IMPLEMENTS', 'UNION_MEMBER', 'DIRECTIVE_LOCATION', 'OPERATION_TYPE_DEFINITION', 'FIELD_ARGUMENT', 'INPUT_FIELD', 'DIRECTIVE_ARGUMENT', 'TYPE_DIRECTIVE', 'FIELD_DIRECTIVE', 'INPUT_VALUE_DIRECTIVE', 'ENUM_VALUE_DIRECTIVE', 'SCHEMA_DIRECTIVE', 'APPLIED_ARGUMENT', 'VALUE').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file the entry was written in; half of the position that is this relation’s whole key

source_line (INTEGER, not null)

line of the entry, 1-based per the graphql-java convention every entry relation follows

source_column (INTEGER, not null)

column of the entry, on the same convention. A position identifies a written thing, which is what lets one relation hold nineteen populations without a discriminator in its key, and what every subtype hangs its own foreign key on

entry_kind (CHARACTER VARYING, not null)

which entry relation holds the rest of this row, named for the relation rather than for the grammar so a reader wanting more than the position and the tree joins the relation this names. Stored rather than derived from which subtype happens to hold a matching row, on graphql_element.element_kind’s reasoning: the writer knows it, and deciding it once at the write keeps every reader from asking

parent_line (INTEGER, nullable)

line of the entry this one was written inside, null at a root: a type declaration, a directive definition, the schema definition. This is where the entry stratum’s tree lives, and it lives here rather than on the subtypes because three of them have a parent whose relation is not fixed and could reference nothing at all

parent_column (INTEGER, nullable)

column of the same, null with its sibling exactly at a root

touched_at (TIMESTAMP, not null)

when the reading that wrote this row ran. Swept per file with the subtypes that key into it, a document’s reading being what claims its positions, and the subtypes swept first, a parent position outliving nothing that still points at it

graphql_ast_enum_value_definition_entry

An EnumValueDefinition as one document wrote it: this position in this file declares an enum value of this name on the declaration it was written inside. For example the G inside enum Rating { G PG } is one row, at ordinal 0 of that declaration’s values.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name of the declaration this node was written inside, held here as well as on that row so the coordinate beside it is a function of this row alone. Named for what it holds rather than for the hop, which is how the anchors spell it too. Not a second key: the key is the parent’s position, and one method writes both rows out of one parse of one file, which is what holds the two spellings equal. Not to be read as named_type beside it, which is the type this field returns where this is the type it belongs to

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_enum_value_directive_entry

A directive applied to an enum value, as one document wrote it: this position in this file applies a directive of this name to the value it was written on. For example the @index on enum Rating { G @index }.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_directive_application_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_enum_value_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_enum_value_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. Nothing says a directive of this name was defined anywhere: applying an undefined directive is a state this row holds and a schema problem reports

graphql_ast_field_argument_entry

An argument of a field, as one document wrote it: this position in this file declares an argument of this name on the field it was written inside. For example the lang: Lang = NB inside title(lang: Lang = NB): String.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_field_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_field_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name of the declaration the field was written inside, two hops up rather than one. Held here for the reason type_name is held one hop down on the relations that need only one: the coordinate names both ancestors, and a generated column reads no row but its own

field_name (CHARACTER VARYING, not null)

the name of the field this argument was written inside, which is the parent this row’s position keys into. The pair with type_name is what the coordinate spells

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

type_sdl (CHARACTER VARYING, not null)

the type expression exactly as written, wrappers and all, so nothing about what the author typed is lost to the four columns beside it

named_type (CHARACTER VARYING, not null)

the type name at the bottom of the expression, the wrappers stripped. Unwrapped here because it is the graphql-java Type node read down its own spine, which is three lines in Java and a parser in SQL; nothing about the corpus is consulted, so this stays a transcription

non_null (BOOLEAN, not null)

whether the outermost wrapper is a non-null, which for a list is about the list and not its items

is_list (BOOLEAN, not null)

whether the expression is a list at its outermost non-null

item_non_null (BOOLEAN, nullable)

whether the outermost list’s items are non-null, NULL when the expression is not a list at all. At list_depth 1 that is the named type’s own nullability; deeper, it is the nullability of the list one level in

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Here so the four columns beside it are complete rather than nearly: they describe a type expression exactly when this is 0 or 1, and a reader that needs to tell those cases from a deeper one asks this column instead of parsing type_sdl. Recording the depth rather than refusing the document, because a transcription records what the author wrote; that graphitron’s own wrapper algebra stops at one list is a fact about the generator and belongs in a detection over this column

default_value_sdl (CHARACTER VARYING, nullable)

the default value exactly as written, or NULL where none was

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_field_definition_entry

A FieldDefinition as one document wrote it: this position in this file declares a field of this name on the declaration it was written inside. For example the title: String inside type Film { title: String } is one row, naming the position that type declaration was written at.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name of the declaration this node was written inside, held here as well as on that row so the coordinate beside it is a function of this row alone. Named for what it holds rather than for the hop, which is how the anchors spell it too. Not a second key: the key is the parent’s position, and one method writes both rows out of one parse of one file, which is what holds the two spellings equal. Not to be read as named_type beside it, which is the type this field returns where this is the type it belongs to

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

type_sdl (CHARACTER VARYING, not null)

the type expression exactly as written, wrappers and all, so nothing about what the author typed is lost to the four columns beside it

named_type (CHARACTER VARYING, not null)

the type name at the bottom of the expression, the wrappers stripped. Unwrapped here because it is the graphql-java Type node read down its own spine, which is three lines in Java and a parser in SQL; nothing about the corpus is consulted, so this stays a transcription

non_null (BOOLEAN, not null)

whether the outermost wrapper is a non-null, which for a list is about the list and not its items

is_list (BOOLEAN, not null)

whether the expression is a list at its outermost non-null

item_non_null (BOOLEAN, nullable)

whether the outermost list’s items are non-null, NULL when the expression is not a list at all. At list_depth 1 that is the named type’s own nullability; deeper, it is the nullability of the list one level in

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Here so the four columns beside it are complete rather than nearly: they describe a type expression exactly when this is 0 or 1, and a reader that needs to tell those cases from a deeper one asks this column instead of parsing type_sdl. Recording the depth rather than refusing the document, because a transcription records what the author wrote; that graphitron’s own wrapper algebra stops at one list is a fact about the generator and belongs in a detection over this column

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_field_directive_entry

A directive applied to a field, as one document wrote it: this position in this file applies a directive of this name to the field it was written on. For example the @field on title: String @field(name: "title").

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_directive_application_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_field_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_field_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. Nothing says a directive of this name was defined anywhere: applying an undefined directive is a state this row holds and a schema problem reports

graphql_ast_implements_entry

An interface named in an implements clause as one document wrote it: this position in this file says the declaration it was written inside implements an interface of this name. For example type Film implements Node & Aged draws two rows, Node at ordinal 0 and Aged at ordinal 1.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name the declaration this node was written inside gives itself, held here as well as on that row so the anchor keyed by it needs no join to spell. Named for what it holds rather than for the hop, which is how the anchors spell it too. Not a second key: the key is the parent’s position, and one method writes both rows out of one parse of one file

interface_name (CHARACTER VARYING, not null)

the interface name written here. Nothing says a type of this name was declared anywhere: an implements clause naming an absent interface is exactly the state this row exists to hold

graphql_ast_input_field_entry

A field of an input object, as one document wrote it: this position in this file declares an input field of this name on the declaration it was written inside. For example the q: String inside input Filter { q: String }.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name of the declaration this node was written inside, held here as well as on that row so the coordinate beside it is a function of this row alone. Named for what it holds rather than for the hop, which is how the anchors spell it too. Not a second key: the key is the parent’s position, and one method writes both rows out of one parse of one file, which is what holds the two spellings equal. Not to be read as named_type beside it, which is the type this field returns where this is the type it belongs to

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

type_sdl (CHARACTER VARYING, not null)

the type expression exactly as written, wrappers and all, so nothing about what the author typed is lost to the four columns beside it

named_type (CHARACTER VARYING, not null)

the type name at the bottom of the expression, the wrappers stripped. Unwrapped here because it is the graphql-java Type node read down its own spine, which is three lines in Java and a parser in SQL; nothing about the corpus is consulted, so this stays a transcription

non_null (BOOLEAN, not null)

whether the outermost wrapper is a non-null, which for a list is about the list and not its items

is_list (BOOLEAN, not null)

whether the expression is a list at its outermost non-null

item_non_null (BOOLEAN, nullable)

whether the outermost list’s items are non-null, NULL when the expression is not a list at all. At list_depth 1 that is the named type’s own nullability; deeper, it is the nullability of the list one level in

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Here so the four columns beside it are complete rather than nearly: they describe a type expression exactly when this is 0 or 1, and a reader that needs to tell those cases from a deeper one asks this column instead of parsing type_sdl. Recording the depth rather than refusing the document, because a transcription records what the author wrote; that graphitron’s own wrapper algebra stops at one list is a fact about the generator and belongs in a detection over this column

default_value_sdl (CHARACTER VARYING, nullable)

the default value exactly as written, or NULL where none was

description (CHARACTER VARYING, nullable)

the description written here, which is the node’s own, or NULL where none was

graphql_ast_input_value_directive_entry

A directive applied to an input value, as one document wrote it: this position in this file applies a directive of this name to the field argument, input field or directive argument it was written on. For example the @lookupKey on title(lang: Lang @lookupKey): String.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_directive_application_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside. No foreign key defends it: the parent is a row of whichever relation holds that kind, and picking the relation is a resolution

parent_column (INTEGER, not null)

source column of the same. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. Nothing says a directive of this name was defined anywhere: applying an undefined directive is a state this row holds and a schema problem reports

graphql_ast_operation_type_definition_entry

An OperationTypeDefinition as one document wrote it: this position in this file binds one root operation to one type name. For example the query: Query inside schema { query: Query } is one row.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_schema_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_schema_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

operation (CHARACTER VARYING, not null)

the root operation named here, spelled as the author wrote it, which the grammar makes lower case. Not checked against the three the specification allows, on graphql_ast_directive_location_entry.location’s terms

type_name (CHARACTER VARYING, not null)

the type name bound to that operation. Nothing says a type of this name was declared anywhere

graphql_ast_schema_definition_entry

A SchemaDefinition as one document wrote it: this position in this file declares or extends the schema’s own node. For example schema { query: Query } is one row, and extend schema { subscription: Sub } is another marked an extension.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

is_extension (BOOLEAN, not null)

whether this position extends the schema node rather than declaring it

description (CHARACTER VARYING, nullable)

the description written here, or NULL where none was

graphql_ast_schema_directive_entry

A directive applied to a schema definition, as one document wrote it: this position in this file applies a directive of this name to the schema block it was written on. For example the @link on schema @link(as: "fed") { query: Query }.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_directive_application_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_schema_definition_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_schema_definition_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. Nothing says a directive of this name was defined anywhere: applying an undefined directive is a state this row holds and a schema problem reports

graphql_ast_type_declaration_entry

A type declaration as one document wrote it: this position in this file declares or extends a named type of this kind and this name. For example type Film { title: String } is one row saying OBJECT, and extend type Film { rating: Rating } is another saying OBJECT and an extension.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_element_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "KIND" IN('OBJECT', 'INTERFACE', 'UNION', 'ENUM', 'INPUT_OBJECT', 'SCALAR').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

kind (CHARACTER VARYING, not null)

which of the six declaration forms was written here, read off the node class the parser produced rather than off the text

is_extension (BOOLEAN, not null)

whether this position extends a type rather than defining it. TRUE and FALSE are both ordinary states of a well-formed corpus, and a name carrying only extensions is an author error some detection reports, never a refusal here

name (CHARACTER VARYING, not null)

the name written here, which is the node’s own getName(). Deliberately not unique: two positions naming one thing is the state this family exists to hold

description (CHARACTER VARYING, nullable)

the description written here, or NULL where none was. Always NULL on an extension, the grammar giving extensions nowhere to put one; stated in a comment rather than a CHECK, because a gatherer that refuses a row is a gatherer that stops gathering

graphql_ast_type_directive_entry

A directive applied to a type declaration, as one document wrote it: this position in this file applies a directive of this name to the declaration it was written on. For example the @table on type Film @table(name: "film").

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_directive_application_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

name (CHARACTER VARYING, not null)

the directive name written here, without the at sign. Nothing says a directive of this name was defined anywhere: applying an undefined directive is a state this row holds and a schema problem reports

graphql_ast_union_member_entry

A member named in a union as one document wrote it: this position in this file says the union it was written inside has a member of this name. For example union Media = Film | Show draws two rows, Film at ordinal 0 and Show at ordinal 1.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_type_declaration_entry (graph_name, source_name, source_line, source_column). Foreign key: (source_ref) references store_source (source_name). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME").

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

parent_line (INTEGER, not null)

source line of the node this one was written inside, and the first half of a key into graphql_ast_type_declaration_entry. Both are in this file and one reading writes both, so the reference is a constraint rather than a lookup a reader has to trust

parent_column (INTEGER, not null)

source column of the same, and the second half of that key. No ordinal sits beside these two: within one parent the nodes of a kind are ordered by the position they were written at, which is the key

type_name (CHARACTER VARYING, not null)

the name the declaration this node was written inside gives itself, held here as well as on that row so the anchor keyed by it needs no join to spell. Named for what it holds rather than for the hop, which is how the anchors spell it too. Not a second key: the key is the parent’s position, and one method writes both rows out of one parse of one file

member_name (CHARACTER VARYING, not null)

the member type name written here. Nothing says a type of this name was declared anywhere, on graphql_ast_implements_entry.interface_name’s terms

graphql_ast_value_entry

A value as one document wrote it: this position in this file wrote a value of this kind, inside the value that encloses it where one does, for the node that holds the whole expression. For example @reference(path: [{table: "film_actor"}]) writes three rows, the list, the object at index 0, and the string at the object field table, under the applied argument that holds them.

Primary key: (graph_name, source_name, source_line, source_column). Foreign key: (graph_name, source_name, source_line, source_column) references graphql_ast_entry (graph_name, source_name, source_line, source_column). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (source_ref) references store_source (source_name). Foreign key: (graph_name, source_name, parent_line, parent_column) references graphql_ast_value_entry (graph_name, source_name, source_line, source_column). Check: ("SOURCE_REF" IS NULL) OR ("SOURCE_REF" = "SOURCE_NAME"). Check: "KIND" IN('STRING', 'INT', 'FLOAT', 'BOOLEAN', 'NULL', 'ENUM', 'LIST', 'OBJECT', 'VARIABLE'). Check: ("PARENT_LINE" IS NULL) = ("PARENT_COLUMN" IS NULL). Check: ("PARENT_LINE" IS NULL) = ("POSITION" IS NULL). Check: ("OBJECT_FIELD_NAME" IS NULL) OR ("PARENT_LINE" IS NOT NULL). Check: ("WRITTEN_TEXT" IS NULL) = ("KIND" IN('LIST', 'OBJECT', 'NULL')).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

source_name (CHARACTER VARYING, not null)

the file this node was written in. No foreign key here, deliberately: source_ref beside it carries the reference. A node is in the file it was written in by definition, so the attribution holds whether or not the registry still vouches for the reading

source_line (INTEGER, not null)

source line of the node, 1-based per the graphql-java convention

source_column (INTEGER, not null)

source column of the node, 1-based per the graphql-java convention. In the key because a line does not identify a node: minified SDL puts many on one line

source_ref (CHARACTER VARYING, nullable)

a second copy of source_name, nullable, carrying the registry reference the key column cannot: one column cannot both refuse a delete and survive one. Deleting a registry row nulls this and deletes nothing, so a file that went away leaves this graph’s reading of it standing and flagged, and the owning graph reaps its own on its next refresh

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting its file’s rows carrying an older instant, which are the nodes the author removed and which an upsert alone cannot find. Not a modification time for the node, which is store_source.mtime’s

holder_line (INTEGER, not null)

source line of the node the whole written expression belongs to: an applied argument, or an argument, input field or directive definition argument carrying a default. Repeated on every node of the tree rather than held only at its root, so one predicate fetches a whole expression and no reader walks upward to find out which slot it was written at. No foreign key defends it: the holder is a row of whichever of the four relations holds that kind, and picking the relation is a resolution

holder_column (INTEGER, not null)

source column of the same

parent_line (INTEGER, nullable)

source line of the value this one was written inside, null at the root of an expression. Unlike holder_line this is a key back into this relation, because the enclosing node is a value and there is one relation for those

parent_column (INTEGER, nullable)

source column of the same

position (INTEGER, nullable)

where inside the enclosing value this one was written: the index in a list, or the ordinal among an object’s fields. Null exactly at a root, which sits inside no value. Ordered by the author and not by anything read here, so a reader reproducing the expression sorts on it

object_field_name (CHARACTER VARYING, nullable)

the object field this value was written at, null when the enclosing value is a list and at a root. The field node itself gets no row of its own: a field is a name and a value, and the name is this column

kind (CHARACTER VARYING, not null)

which of the nine forms the parser read here. An attribute of the value and not a different fact, which is why one relation holds all nine: every row says the same thing, that this slot was written with this literal

written_text (CHARACTER VARYING, nullable)

the leaf’s text as the author wrote it, with a string’s quotes removed and nothing else interpreted: an int stays the digits, an enum stays the name, a boolean stays true or false. Null exactly for a list, an object and the null literal, which carry no text of their own. Not coerced to a type, because what a number means is a question for whoever anchors it against the argument’s declared type

graphql_directive

A directive is defined.

Primary key: (graph_name, directive_name). Foreign key: (graph_name) references store_graph (graph_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

directive_name (CHARACTER VARYING, not null)

the applied or defined directive name, without the leading @

repeatable (BOOLEAN, not null)

whether the definition says 'repeatable'; governs the ordinal on applications

description (CHARACTER VARYING, nullable)

SDL description string, when the author wrote one

source_name (CHARACTER VARYING, nullable)

the SDL file the row was captured from

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_directive_application

One directive an author applied, at the coordinate they applied it to: one row per application, however many sites the corpus writes them at. For example type Film @key(fields: "id") is one row at coordinate Film, and the @external on Film.title is another at Film.title.

Primary key: (graph_name, coordinate, directive_name, ordinal). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph through the element below; the leading key dimension that keeps one workspace’s graphs apart

coordinate (CHARACTER VARYING, not null)

the schema coordinate the application was written on, in the specification’s grammar: a type is its own name, a field or an enum value or an input field is the parent’s name and a dot, an argument goes one deeper, and the schema block is $schema. A reference into graphql_element, which is a table and not a union so this foreign key can name it, and the whole reason five relations are one: the coordinate is what every site has and the decomposed key is what none of them shares

directive_name (CHARACTER VARYING, not null)

the applied directive name, without the leading @

ordinal (INTEGER, not null)

the repeat, numbered from zero within one coordinate and one directive name, in the order the declarations carrying them merge. A directive is not repeatable unless its definition says so, so on almost every application this is zero and the column exists for the ones that are

source_name (CHARACTER VARYING, nullable)

the file the application was written in, the first of the three columns naming its position. Nullable because a synthesised application has no position to name, an injector building a directive with no source location being a writer this relation admits rather than refuses

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total. The sweep is what collects an application an author deleted from a coordinate that still stands; a coordinate the author deleted takes its applications with it through the cascade above

graphql_directive_application_arg

One argument an author passed to an application: the application’s own key and the formal argument the value binds. For example the fields: "id" of type Film @key(fields: "id") is one row.

Primary key: (graph_name, coordinate, directive_name, ordinal, directive_argument_name). Foreign key: (graph_name, coordinate, directive_name, ordinal) references graphql_directive_application (graph_name, coordinate, directive_name, ordinal).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, carried from the application above; the leading key dimension that keeps one workspace’s graphs apart

coordinate (CHARACTER VARYING, not null)

the coordinate the owning application was written on, the second of the four columns naming it

directive_name (CHARACTER VARYING, not null)

the owning application’s directive name, the third

ordinal (INTEGER, not null)

the owning application’s ordinal, the fourth; with the three columns above, a reference into graphql_directive_application

directive_argument_name (CHARACTER VARYING, not null)

the definition’s formal argument this value binds, and the rest of the grain. An argument is named once inside one application, so nothing is ranked here; a document naming one twice is a schema problem and the upsert keeps the later of the two rather than refusing the row

value_sdl (CHARACTER VARYING, not null)

the value as written, rendered from the AST. The literal rather than a parse of it, so an application is legible without knowing what the directive means, and so a consumer that does know reads the same string the author typed

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_directive_argument

A directive definition declares a formal argument. Carries the same wrapping decode as graphql_field, so list-ness of a directive argument is a column read, not a string parse.

Primary key: (graph_name, directive_name, argument_name). Foreign key: (graph_name, directive_name) references graphql_directive (graph_name, directive_name). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

directive_name (CHARACTER VARYING, not null)

the applied or defined directive name, without the leading @

argument_name (CHARACTER VARYING, not null)

the argument name within the owning field

ordinal (INTEGER, not null)

declaration order in the definition

type_sdl (CHARACTER VARYING, not null)

rendered argument type, e.g. '[ReferenceElement!]!'

named_type (CHARACTER VARYING, not null)

the named type the expression bottoms out in; author-spelled, no FK

non_null (BOOLEAN, not null)

outermost non-null wrapper present

is_list (BOOLEAN, not null)

a list wrapper is present

item_non_null (BOOLEAN, nullable)

item-level non-null when is_list; NULL otherwise

default_value_sdl (CHARACTER VARYING, nullable)

rendered default; the value an application inherits when it omits the argument

description (CHARACTER VARYING, nullable)

SDL description string, when the author wrote one

source_name (CHARACTER VARYING, nullable)

position of the formal argument in the definition

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_directive_argument_element

A directive argument coordinate exists on a directive: the decomposition of the coordinate graphql_element holds for a formal argument of a directive definition. For example the pagedName of directive @paged(pagedName: String) is the row (paged, pagedName, @paged(pagedName:)).

Primary key: (graph_name, directive_name, argument_name). Foreign key: (graph_name, directive_name) references graphql_directive_element (graph_name, directive_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

directive_name (CHARACTER VARYING, not null)

the directive the argument is declared on, keyed into graphql_directive_element, which is what makes an argument row unable to outlive the directive it belongs to

argument_name (CHARACTER VARYING, not null)

the argument’s own name, the second half of the key a reader holding a directive argument arrives with

coordinate (CHARACTER VARYING, not null)

the coordinate the specification spells for this argument, which is the directive’s coordinate with the argument name and a colon in parentheses. Unique on its own, the two keys being two spellings of one thing, which is what lets a reader holding the coordinate join back to the parts instead of taking the string apart by hand

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran, swept on the same terms as the directive above it

graphql_directive_element

A directive coordinate exists in this graph: the decomposition of the coordinate graphql_element holds for a directive definition, which is the at sign and this name. For example directive @paged on FIELD_DEFINITION is the row (paged, @paged).

Primary key: (graph_name, directive_name). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

directive_name (CHARACTER VARYING, not null)

the directive’s name without the at sign, which is the key a reader holding a directive arrives with. graphql_directive carries what the definition says about itself; this carries only the coordinate, for the reason graphql_type_element is separate from graphql_type

coordinate (CHARACTER VARYING, not null)

the coordinate the specification spells for this directive, which is the at sign and the name. One row of graphql_element, and the foreign key says so: a directive is an element of the corpus in the same sense a type is, and this is the relation that decomposes its coordinate into the part a reader joins by

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran. The reading finishes by deleting this graph’s rows carrying an older instant, which are the directives the corpus stopped declaring

graphql_directive_location

A directive definition names a permitted location.

Primary key: (graph_name, directive_name, location). Foreign key: (graph_name, directive_name) references graphql_directive (graph_name, directive_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

directive_name (CHARACTER VARYING, not null)

the applied or defined directive name, without the leading @

location (CHARACTER VARYING, not null)

introspection location name, e.g. FIELD_DEFINITION, INPUT_FIELD_DEFINITION

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_element

A schema element exists in this graph: the supertype of the four element relations beside it, keyed by the schema coordinate the GraphQL specification spells for it. For example the input argument of Mutation.rentFilm is the row Mutation.rentFilm(input:), the field it sits on is Mutation.rentFilm, and the type declaring that field is Mutation.

Primary key: (graph_name, coordinate). Foreign key: (graph_name) references store_graph (graph_name). Check: "ELEMENT_KIND" IN('NAMED_TYPE', 'FIELD', 'INPUT_FIELD', 'ENUM_VALUE', 'FIELD_ARGUMENT', 'DIRECTIVE', 'DIRECTIVE_ARGUMENT', 'SCHEMA').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

coordinate (CHARACTER VARYING, not null)

the coordinate itself, in the specification’s own grammar: Type for a named type, Type.field for a field of one, for an input field of one and for an enum value of one, and Type.field(argument:) for an argument of a field. Total by construction, which is what lets one column stand for a coordinate of any kind where the decomposed keys beside it cannot, the parts being different parts at each of the four. A relation naming a coordinate carries this column and a foreign key, and joins the subtype relation for the kind it cares about when it wants the parts. One coordinate here is ours rather than the specification’s: the schema block is $schema, which the grammar has no spelling for and which a relation keyed at a coordinate needs if the schema block is not to be the one site it cannot reach. A dollar sign is illegal in a GraphQL name, so it can never collide with a type an author declares

element_kind (CHARACTER VARYING, not null)

which kind of schema element this row is, in the specification’s own vocabulary, and so which relation beside this one a reader joins to get the parts, FIELD and INPUT_FIELD sharing one. All seven of the specification’s kinds appear here, and SCHEMA beside them for the block the specification gives no coordinate: the two directive forms joined the other five when a relation needed to name a deprecated directive and found the coordinate unanchored, and the schema block joined them when directive applications collapsed onto the coordinate and it was the only site left out. Stored rather than read off the spelling because Type.field spells a field, an input field and an enum value alike, the three being told apart by the parent type’s kind and not by the text; deciding it at the write, where the walk already knows which it is, is what keeps every reader from asking that question again

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran. The derivation finishes by deleting this graph’s rows carrying a different instant, which are the coordinates the corpus stopped declaring. Swept per graph rather than per file because a coordinate is declared by the corpus and no one file’s reading can say it went away. NOT NULL, which is what makes the sweep total: a row with no instant would be a row no reading claims and no sweep reaches, so the column that decides what survives cannot be the one column a writer may forget

graphql_element_field (view)

The field a schema element sits on, for the element kinds whose coordinate names one: one row per field coordinate, output and input alike, and one per field-argument coordinate, carrying the parts the spelling is built from. For example Query.films draws a row naming the type and the field, and Query.films(filter:) draws another naming those and the argument, so a reader holding either spelling reaches the field with one join.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from whichever arm supplied the row

coordinate (CHARACTER VARYING, nullable)

the coordinate as the specification spells it, unique within the graph and therefore the whole of what a reader joins on; carried from the arm’s own column, which is the same spelling graphql_element anchors

type_name (CHARACTER VARYING, nullable)

the type declaring the field the coordinate sits on

field_name (CHARACTER VARYING, nullable)

the field itself, within that type

argument_name (CHARACTER VARYING, nullable)

the argument on an argument coordinate, NULL on a field coordinate. The discriminator between the two arms, and total against each of them rather than optional within either

graphql_enum_value

What a value an enum declares is, hanging off graphql_enum_value_element. Net-new coordinate; deprecation is not a column because @deprecated is an ordinary applied directive. Nothing references this relation, on graphql_type’s terms.

Primary key: (graph_name, type_name, value_name). Foreign key: (graph_name, type_name, value_name) references graphql_enum_value_element (graph_name, type_name, value_name). Foreign key: (graph_name, type_name, source_name, declaration_line, declaration_column) references graphql_type_declaration (graph_name, type_name, source_name, source_line, source_column).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the owning ENUM type

value_name (CHARACTER VARYING, not null)

the enum value name within the owning enum type

ordinal (INTEGER, not null)

order in the effective enum: base declaration, then extensions

declaration_line (INTEGER, not null)

the contributing site, as on graphql_field

declaration_column (INTEGER, not null)

column of the contributing declaration site, the site key’s fourth part

description (CHARACTER VARYING, nullable)

SDL description string, when the author wrote one

source_name (CHARACTER VARYING, not null)

NOT NULL for the same reason as on graphql_field: half of the site FK

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_enum_value_element

An enum value coordinate exists on a type: the anchor for the value-keyed decode relations, on graphql_type_element’s terms and for its reason.

Primary key: (graph_name, type_name, value_name). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the owning ENUM type, anchored by graphql_type_element

value_name (CHARACTER VARYING, not null)

the enum value name within the owning enum type

coordinate (CHARACTER VARYING, not null)

this row as graphql_element spells it, Type.value, which is the spelling a field of the same name would take; the parent type’s kind is what tells the two apart, and graphql_element.element_kind carries that decision so no reader repeats it. The join down from the supertype, on graphql_type_element.coordinate’s terms and written the same way

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms. Swept per graph and after its children, a key-to-coordinate row being what a reader joins through and so outliving nothing that still points at it. NOT NULL on graphql_element’s reasoning: a sweep that skipped unstamped rows would not be a sweep

graphql_field

What a field at a coordinate is: its type expression, its description, its default and the site that contributed it, hanging off graphql_field_element. OBJECT and INTERFACE parents make it an output field, INPUT_OBJECT parents an input field; the join decides. Nothing references this relation, on graphql_type’s terms: the field-keyed reference web anchors on the coordinate instead.

Primary key: (graph_name, type_name, field_name). Foreign key: (graph_name, type_name, field_name) references graphql_field_element (graph_name, type_name, field_name). Foreign key: (graph_name, type_name, source_name, declaration_line, declaration_column) references graphql_type_declaration (graph_name, type_name, source_name, source_line, source_column). Check: "IS_LIST" OR ("ITEM_NON_NULL" IS NULL). Check: "IS_LIST" = ("LIST_DEPTH" > 0).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

owning type

field_name (CHARACTER VARYING, not null)

the field name within the owning type

ordinal (INTEGER, not null)

order in the effective type: base declaration, then extensions in document order (capture merges them from the registry)

declaration_line (INTEGER, not null)

the contributing declaration site, keyed with this row’s own source_name (an authored row sits lexically inside its site; a synthesized row shares its synthesized site’s inherited position)

declaration_column (INTEGER, not null)

the site key’s fourth part, as on graphql_type_declaration

type_sdl (CHARACTER VARYING, not null)

the rendered type expression, e.g. '[Film!]!'; authoritative for wrapping fidelity

named_type (CHARACTER VARYING, not null)

the named type the expression bottoms out in; author-spelled, no FK, integrity is a detection

non_null (BOOLEAN, not null)

outermost non-null wrapper present

is_list (BOOLEAN, not null)

a list wrapper is present

item_non_null (BOOLEAN, nullable)

item-level non-null when is_list; NULL otherwise

list_depth (INTEGER, not null)

how many list wrappers the expression has: 0 for a named type, 1 for a list of one, 2 for a list of lists. Carried from the entry rather than left behind by the anchoring, because the four columns beside it describe a type expression exactly when this is 0 or 1 and a reader that must tell those from a deeper one has nothing else to ask. A reader without it parses type_sdl, which is what the macro expansion did to find the carriers it may expand

default_value_sdl (CHARACTER VARYING, nullable)

rendered default value; input-object fields only

description (CHARACTER VARYING, nullable)

SDL description string, when the author wrote one

source_name (CHARACTER VARYING, not null)

every field row comes from an SDL site (built-in scalars declare none), and a NULL here would silently disable the site FK under MATCH SIMPLE

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

field_name_upper (CHARACTER VARYING, nullable)

the upper-cased form of the column beside it, for the case-insensitive match against sql_column’s column_name_upper and jooq_name_upper where @field(name:) was omitted and the field name stands in as a column spelling. Generated, so nothing writes it and nothing can. A GraphQL field name is folded here for that crossing alone; nothing compares one to another case-insensitively

graphql_field_element

A field coordinate exists on a type: the anchor for the field-keyed half of the reference web, on graphql_type_element’s terms and for its reason. Written from the declaration sites, so the coordinate exists as soon as one site declares the field, and a coordinate two sites declare is one row (the losing declaration is the duplicate quarantine’s business, not this relation’s). OBJECT and INTERFACE parents make it an output field, INPUT_OBJECT parents an input field, which the specification counts as two kinds of schema element sharing one coordinate form. This relation asserts neither and holds both, the two differing in nothing it carries; the supertype settles it, graphql_element.element_kind saying FIELD or INPUT_FIELD from the parent’s kind at the moment the walk writes the row.

Primary key: (graph_name, type_name, field_name). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the owning type, anchored by graphql_type_element

field_name (CHARACTER VARYING, not null)

the field name within the owning type

coordinate (CHARACTER VARYING, not null)

this row as graphql_element spells it, Type.field in the specification’s grammar; the join down from the supertype, on graphql_type_element.coordinate’s terms and written the same way

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms. Swept per graph and after its children, a key-to-coordinate row being what a reader joins through and so outliving nothing that still points at it. NOT NULL on graphql_element’s reasoning: a sweep that skipped unstamped rows would not be a sweep

graphql_implements_interface

A type answers to an interface: one row per interface the type declares it implements. The declaring end is the type, which is why this keys on the type and graphql_union_member keys on the union; the interface may be one no document declares, which assembly refuses and this relation records rather than refusing itself.

Primary key: (graph_name, type_name, interface_name). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name). Foreign key: (graph_name, type_name, source_name, declaration_line, declaration_column) references graphql_type_declaration (graph_name, type_name, source_name, source_line, source_column).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the implementing type, which is the declaration this row hangs off

interface_name (CHARACTER VARYING, not null)

the interface named in the implements clause, author-spelled and unanchored

position (INTEGER, not null)

source order of this implementor among the interface’s implementors, numbered from one, which is what the merged relation counted and what a reader ordering them still expects. Not the interface’s position within this type’s implements clause: the split moved the key and left the numbering alone, renumbering being visible to a mapping-constant fingerprint. See graphql_union_member.position for why the two bases differ.

declaration_line (INTEGER, not null)

line of the declaration site that contributed this membership, as on graphql_field

declaration_column (INTEGER, not null)

column of the same, the site key’s fourth part

source_name (CHARACTER VARYING, not null)

the file the member or interface token itself was written in; NOT NULL as on graphql_field

source_line (INTEGER, nullable)

source line of that token, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column of that token, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_poly_member (view)

Union membership and interface implementation as one relation, for the readers that take either. Two relations hold the facts, because a union declares who it admits and a type declares which interfaces it answers to: the declaring end differs, and with it the key and every foreign key. What the two share is the shape a reader wants when it does not care which it has, a container and a member, and that is this view. declared_on is the declaring end, which the arms supply as the column that already is it rather than as a CHECK policing a copy: the union on one arm, the implementing type on the other.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

container_kind (CHARACTER VARYING, nullable)

which arm this row came from, UNION or INTERFACE, which is also which base relation holds it; a literal in each arm of the union rather than a stored column

container_name (CHARACTER VARYING, nullable)

the union or the interface holding the member, whichever arm this row is

member_type_name (CHARACTER VARYING, nullable)

the member type on the union arm, the implementing type on the interface arm

position (INTEGER, nullable)

source order within the container, as the arm that holds it recorded it

declared_on (CHARACTER VARYING, nullable)

the type that declared this membership: the container on a UNION row, the member on an INTERFACE row. The anchored end, and what the two arms disagree about, which is why they are two relations

declaration_line (INTEGER, nullable)

line of the declaration site that contributed this membership, as on graphql_field

declaration_column (INTEGER, nullable)

column of the same, the site key’s fourth part

source_name (CHARACTER VARYING, nullable)

the file the member or interface token itself was written in; NOT NULL as on graphql_field

source_line (INTEGER, nullable)

source line of that token, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column of that token, 1-based per the graphql-java convention

touched_at (TIMESTAMP, nullable)

when the reading that derived the underlying row ran, carried through from the arm that holds it

graphql_root_operation

The schema definition names a root operation type. These rows are the seeds the reachability derivation grows from. The binding is an author-spelled reference, so its dangling case mints a located diagnostic; the position columns are what it locates from. (A double binding cannot reach capture: a schema extension re-binding an operation throws at parse.)

Primary key: (graph_name, operation). Foreign key: (graph_name) references store_graph (graph_name). Check: "OPERATION" IN('QUERY', 'MUTATION', 'SUBSCRIPTION').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

operation (CHARACTER VARYING, not null)

which root slot

type_name (CHARACTER VARYING, not null)

the object type serving it

source_name (CHARACTER VARYING, nullable)

position of the binding inside the schema { } block; all three NULL exactly when the binding is the name-convention default no SDL line spells

source_line (INTEGER, nullable)

line of the binding; NULL with the siblings when the binding is the name-convention default

source_column (INTEGER, nullable)

column of the binding; NULL with the siblings when the binding is the name-convention default

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_schema_problem

Reading this graph’s documents and making a schema of them produced this problem: one of the refusals the toolchain this graph is built with raised, whichever of the four stages raised it. For example a file that will not parse is one row naming that file, a second file declaring a type an earlier file already declares is another, and a second federation @link is a third.

Primary key: (graph_name, stage, ordinal). Foreign key: (graph_name) references store_graph (graph_name). Check: "STAGE" IN('PARSE', 'REGISTRY', 'REWRITE', 'ASSEMBLY'). Check: ("STAGE" <> 'PARSE') OR ("SOURCE_NAME" IS NOT NULL). Check: ("SOURCE_LINE" IS NULL) = ("SOURCE_COLUMN" IS NULL).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

ordinal (INTEGER, not null)

this problem’s place in the order its stage raised them, numbered from zero there rather than across the four. Part of the key because a problem need not carry a position, so there is nothing else that tells two of them apart; numbered per stage so the stage that raised them is the only thing that has to have held them

touched_at (TIMESTAMP, not null)

when the reading that produced this row ran; the reading finishes by deleting this graph’s rows that still carry an older instant, which are the problems the corpus no longer has

stage (CHARACTER VARYING, not null)

which reading refused: PARSE judged one file alone, REGISTRY combined the files, REWRITE composed them with the loading rewrites the generator runs (the federation @link’s imports, the configured tags and notes), ASSEMBLY made a schema of the result. Rows are numbered within the stage and written in the order the stages ran. A column rather than four relations, all four being what happened when we tried to make a schema out of these documents

error_class (CHARACTER VARYING, not null)

the stage’s own name for the kind of problem, so a reader can group without parsing the sentence: graphql-java’s error class’s simple name at PARSE, REGISTRY and ASSEMBLY, and the refusal variant’s name at REWRITE (DeclarationCollision, MultipleFederationLinks and the like). Both are bare names, and the stage says which namespace a row is in

message (CHARACTER VARYING, not null)

the refusing stage’s own sentence, kept verbatim: graphql-java’s at PARSE, REGISTRY and ASSEMBLY, graphitron’s fix-it prose at REWRITE, which is the sentence the build fails with. Rewording either here would make the store the second author of an error the build reports

source_name (CHARACTER VARYING, nullable)

the file the problem is about, where the stage knows one: always at PARSE, and at the other three whatever site the stage pointed at. No reference to store_source, deliberately: a row here is a transcription, and declining to record one because its file is not in the registry would lose the verdict this relation exists to keep

source_line (INTEGER, nullable)

line of the site the problem points at, 1-based, or null where the stage reported none

source_column (INTEGER, nullable)

column of that site, null exactly when the line is; graphql-java locates at the enclosing declaration rather than the offending element, so this is where to start reading and not where the fault is

graphql_type

What a named type is: the two attributes of the type itself, hanging off graphql_type_element, which is where the name’s existence now lives and where everything else in the schema anchors. Read from whichever site capture meets first in merge order (macro-contributed sites included), which on a well-formed schema is the base definition; graphql_type_declaration carries every site and the kind each one wrote. Nothing references this relation, deliberately: the split exists so that what a later cadence owns cannot drag the reference web with it, and holding the reference web off the attribute relation is that split doing its job rather than an omission.

Primary key: (graph_name, type_name). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name). Check: "KIND" IN('OBJECT', 'INTERFACE', 'UNION', 'ENUM', 'INPUT_OBJECT', 'SCALAR').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the type these attributes describe, anchored by graphql_type_element

kind (CHARACTER VARYING, not null)

the first declaration site’s form in merge order (the base definition’s, on a well-formed schema)

description (CHARACTER VARYING, nullable)

SDL description string; net-new as a persisted fact (today read live off retained graphql-java objects). Extensions cannot carry descriptions, so this is the base definition’s when one exists

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_type_declaration

A declaration site of a type: the base definition or one extension. All five extension kinds are live today, so a type’s effective shape may be assembled from several files; this relation records who contributed what and indexes the incremental-refresh unit ("which types does this file touch"). Engine-provided types (built-in scalars) have no declaration rows.

Primary key: (graph_name, type_name, source_name, source_line, source_column). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name). Check: "KIND" IN('OBJECT', 'INTERFACE', 'UNION', 'ENUM', 'INPUT_OBJECT', 'SCALAR').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the type this site declares or extends

source_name (CHARACTER VARYING, not null)

the site’s file; a site is a syntactic occurrence, so its location is its identity

source_line (INTEGER, not null)

line of the site, 1-based

source_column (INTEGER, not null)

in the key because a line does not identify a site: two extensions of one type can share a line in minified SDL

merge_ordinal (INTEGER, not null)

capture-assigned position in merge order: the base definition, then extensions in document order; on a base-less chain the first extension holds 0. Dense per type (a gate), and the order behind every element ordinal

is_extension (BOOLEAN, not null)

FALSE exactly at merge_ordinal 0 on a well-formed schema; a base-less extension chain is an author error a detection reports, never a constraint

kind (CHARACTER VARYING, not null)

the declaration form written at this site; a mismatch against the type row’s kind is a detection

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total

graphql_type_element

A type name exists in this graph: the anchor every SDL fact, every directive decode and every type-keyed derivation hangs off. It carries the key and nothing else, which is what a coordinate relation is for: existence is the whole assertion, and every attribute of the type is a fact some other relation owns at that fact’s own cadence. Split out from graphql_type so the reference web anchors on the earliest cadence an SDL fact can have. A name exists because some declaration site declares or extends it, which the per-file parse settles before anything is composed and before assembly has judged anything; a relation on a later cadence can then be rewritten, withheld or emptied without the facts hanging off the coordinate following it. Anchoring on a composed relation instead makes every per-site fact’s existence conditional on the whole document assembling, and an author mid-edit is exactly the reader who has no assembled document and every per-site fact. The declared-or-extended reading is what makes the site rows' foreign keys structural (capture writes this row before any site row), and on a base-less extension chain (an author error a detection reports) the row still exists, anchored by the extension sites.

Primary key: (graph_name, type_name). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, coordinate) references graphql_element (graph_name, coordinate).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the GraphQL type name as some declaration site spells it; the coordinate every other SDL fact hangs off

coordinate (CHARACTER VARYING, not null)

this row as graphql_element spells it, which for a type is the type name beside it; the join down from the supertype, so a reader that has a coordinate and wants its parts reads them here rather than splitting the spelling. Written by the same call that writes the supertype row and from the same string, so the two cannot disagree, and the foreign key on it is what makes a coordinate with no anchor impossible

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms. Swept per graph and after its children, a key-to-coordinate row being what a reader joins through and so outliving nothing that still points at it. NOT NULL on graphql_element’s reasoning: a sweep that skipped unstamped rows would not be a sweep

graphql_union_member

A union names a member: one row per member the union declares, in the order it wrote them. Separate from graphql_implements_interface because the two are not one fact wearing two hats; a union declares who it admits and a type declares which interfaces it answers to, so the declaring end differs and with it the key, the position base and every foreign key. graphql_poly_member unions the two for the readers that genuinely take either.

Primary key: (graph_name, union_name, member_type_name). Foreign key: (graph_name, union_name) references graphql_type_element (graph_name, type_name). Foreign key: (graph_name, union_name, source_name, declaration_line, declaration_column) references graphql_type_declaration (graph_name, type_name, source_name, source_line, source_column).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

union_name (CHARACTER VARYING, not null)

the union declaring the membership, which is also the declaration this row hangs off

member_type_name (CHARACTER VARYING, not null)

the type the union admits, author-spelled and unanchored: a union may name a type no document declares, which assembly refuses and this relation records

position (INTEGER, not null)

source order within the union, numbered from zero. Inherited rather than intended, and it disagrees with graphql_implements_interface.position on the base; a mapping-constant fingerprint digests a list in this order, so rebasing is a change of its own.

declaration_line (INTEGER, not null)

line of the declaration site that contributed this membership, as on graphql_field

declaration_column (INTEGER, not null)

column of the same, the site key’s fourth part

source_name (CHARACTER VARYING, not null)

the file the member or interface token itself was written in; NOT NULL as on graphql_field

source_line (INTEGER, nullable)

source line of that token, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column of that token, 1-based per the graphql-java convention

touched_at (TIMESTAMP, not null)

when the reading that derived this row ran, on graphql_element.touched_at’s terms: swept per graph, and NOT NULL so the sweep is total