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.
- intent_column_match_claim (
graphql_spellings against thesql_census) -
A field’s own name meets the columns of the table its site navigates to, case-insensitively, with no directive involved.
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).
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).
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").
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).
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).
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").
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").
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').
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.
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).
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').
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").
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").
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).
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).
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").
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").
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).
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").
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").
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").
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").
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').
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").
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").
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')).
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).
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).
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).
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).
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).
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).
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).
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').
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.
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).
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).
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).
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).
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).
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.
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').
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).
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').
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').
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).
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).
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