Documentation May 3, 2020

Abstract Schema Graph

The MetaMate community progressively models the abstract schema graph around real-world data. Following, a high-level perspective on how the asg emerges, and how it propagates through the stack.

graph TD entities[entities] --> expansion[expansion] actions[actions] --> expansion[expansion] expansion[expansion] --> asg[asg] asg[asg] --> |powers| metactl[metactl] metactl[metactl aaaa] --> |generates| clientsdks[client sdks] metactl[metactl aaaa] --> |generates| servicesdks[service sdks] clientsdks[client sdks] --> |power| services[services] clientsdks[client sdks] --> |power| clients[clients] servicesdks[service sdks] --> |power| services[services] asg[asg] --> |powers| metamate[MetaMate aaa] clients[clients] --> |read/write| metamate[MetaMate aaa] services[services] --> |read/write| metamate[MetaMate aaa] metamate[MetaMate aaa] --> |reads/writes| services[services] class metactl metactl-icon; class metamate metamate-icon;


This stage defines core and domain-specific entity types, how they relate to one another and which ones are going to be exposed by endpoints. Core entity types are ClientAccount, ServiceAccount, and Service, to name a few. Domain-specific entities are HackerNewsActivity, Post, or PostFeed, for example. Currently, these entities are defined as code but are going to be served by MetaMates soon (see Roadmap).


The action stage defines endpoints that are hard to model in a CRUD fashion. Examples of this are the LookupService, AuthenticateClientAccount or VerifyToken endpoints.


graph TD entities[entities] --> expansion[expansion] actions[actions] --> expansion[expansion] expansion[expansion] --> asg[asg]

This stage processes the previously defined entity types, adds further fields to types, generates relation and relationship types, and composes generic types like SocialAccountFilter, SocialAccountSort, and SocialAccountSelect entities. The expansion stage further generates the communication bits of the asg on top of that. It adds generic types like GetSocialAccountsRequest, PostSocialAccountsRequest, PutSocialAccountsRequest, DeleteSocialAccountsRequest and the according Response counterparts for all exposed types, and connects them to endpoints.


graph TD metactl[metactl aaaa] --> |generates| servicesdks[service sdks] metactl[metactl aaaa] --> |generates| clientsdks[client sdks] asg[asg] --> |powers| metactl[metactl] class metactl metactl-icon;

metactl is MetaMate’s CLI. It relies on the asg to query MetaMate instances, to inspect nodes in the asg, and most importantly, to generate project tailored and typed SDKs.


graph TD asg[asg] --> |powers| metamate[MetaMate aaa] clients[clients] --> |read/write| metamate[MetaMate aaa] services[services] --> |read/write| metamate[MetaMate aaa] metamate[MetaMate aaa] --> |reads/writes| services[services] class metamate metamate-icon;

The asg powers MetaMate’s internal and generic type representation system. MetaMate uses it to boot the communication stack, like composing the graphql schema and exposing a generic http/json based API. MetaMate furthermore enforces validation rules, defined by the asg.


graph TD root[root] basictype[basictype] endpoint[endpoint] enum[enum] type[type] field[field] path[path] relation[relation]

The asg is composed of 8 different kinds of nodes. Nodes carry binary flags and are interconnected via edges.


The Root node holds a reference to all other nodes. It’s the starting point when retrieving nodes or traversing the graph.


BasicType nodes hold low-level types. They are predefined and constrained by the typing capabilities of various serialization formats. They currently consist of bool, int32, float64, and string.

graph TD basictype[basictype]


Enum nodes represent a predefined set of string values.

graph TD enum[enum]


Type nodes define custom data structures.

graph LR Type[Type] --> | For | Type0[Type] Type[Type] --> | FilteredBy | Type0[Type] Type[Type] --> | SortedBy | Type0[Type] Type[Type] --> | SelectedBy | Type0[Type] Type[Type] --> | Collection | Type0[Type] Type[Type] --> | Request | Type0[Type] Type[Type] --> | Response | Type0[Type] Type[Type] --> | GetRequest | Type0[Type] Type[Type] --> | GetCollection | Type0[Type] Type[Type] --> | GetRelations | Type0[Type] Type[Type] --> | GetResponse | Type0[Type] Type[Type] --> | PipeRequest | Type0[Type] Type[Type] --> | PipeResponse | Type0[Type] Type[Type] --> | GetEndpoint | Type0[Type] Type[Type] --> | PipeEndpoint | Type0[Type] Type[Type] --> | For | Enum[Enum] Type[Type] --> | ListKind | Enum[Enum] Type[Type] --> | BelongsTo | Enum[Enum] Type[Type] --> | Get | Endpoint[Endpoint] Type[Type] --> | Pipe | Endpoint[Endpoint] Type[Type] --> | Holds | Fields[Fields] Type[Type] --> | EdgedByFields | Fields[Fields] Type[Type] --> | EdgedByListFields | Fields[Fields] Type[Type] --> | Holds | Relations[Relations] Type[Type] --> | ToOneRelations | Types[Types] Type[Type] --> | ToManyRelations | Types[Types] Type[Type] --> | Misses | Types[Types] Type[Type] --> | Dependencies | Types[Types] Type[Type] --> | Dependencies | Enums[Enums]


Field nodes are referenced by Type nodes and either hold BasicType, Enum or Type nodes.

graph TD Field[Field] --> |Holds| BasicType[BasicType] Field[Field] --> |Holds| Enum[Enum] Field[Field] --> |For| Field[Field] Field[Field] --> |RelatedTo| Field[Field] Field[Field] --> |RelatedThrough| Relation[Relation] Field[Field] --> |Holds| Type[Type] Field[Field] --> |HeldBy| Type[Type] Field[Field] --> |BelongsTo| Path[Path]


Relation nodes hold an active and a passive Path node.

graph TD Relation[Relation] --> |NodeA| Type[Type] Relation[Relation] --> |NodeB| Type[Type] Relation[Relation] --> |Active| Path[Path] Relation[Relation] --> |Passive| Path[Path]


Path nodes are attached to Relation nodes and model either an active or passive relation path between Type nodes and specify a cardinality. Post mentions many SocialAccounts is an active, HackerNewsActivity mentioned by many Posts is it’s passive counterpart Path.

graph TD Path[Path] --> |From| Type[Type] Path[Path] --> |To| Type[Type] Path[Path] --> |BelongsTo| Relation[Relation]


Endpoint nodes

graph TD Endpoint[Endpoint] --> |For| Type[Type] Endpoint[Endpoint] --> |Request| Type[Type] Endpoint[Endpoint] --> |Response| Type[Type] Endpoint[Endpoint] --> |Dependencies| Types[Types] Endpoint[Endpoint] --> |Dependencies| Enums[Enums]
comments powered by Disqus