Documentation
¶
Index ¶
- Constants
- func AllowsResolutionKind(edge EdgeKind, kind NodeKind) bool
- func EdgeID(factID, toID string) string
- func FactID(owner, from string, kind EdgeKind, target string, line, ordinal int) string
- func IsDataResourceKind(kind NodeKind) bool
- func IsDeclarationMember(kind NodeKind) bool
- func IsTestSupportNode(node Node) bool
- func LooseMatch(level NodeMatchLevel, selector string, node Node) bool
- func MarshalProperties(properties map[string]string) string
- func NodeID(kind NodeKind, qualifiedName string, discriminator ...string) string
- func NowUTC() string
- func SimpleName(name string) string
- func SortNodeMatches(level NodeMatchLevel, selector string, nodes []Node)
- func SortedPropertyKeys(properties map[string]string) []string
- func StableID(prefix string, parts ...string) string
- func StrictMatch(level NodeMatchLevel, selector string, node Node) bool
- func UnmarshalProperties(raw string) map[string]string
- type CanonicalMessagePage
- type CanonicalMessageQuery
- type CanonicalMessageRepository
- type CatalogRepository
- type Counts
- type Diagnostic
- type Edge
- type EdgeKind
- type ExternalEdgeRepository
- type ExternalNodeRepository
- type ExternalRequestEdge
- type ExternalRequestEdgePage
- type ExternalRequestEdgeRepository
- type Fact
- type FileCatalog
- type FileRecord
- type HydratedRelationEdge
- type IndexRepository
- type InstrumentedIndexRepository
- type InstrumentedWriteRepository
- type Location
- type Node
- type NodeKind
- type NodeListQuery
- type NodeListRepository
- type NodeMatchGroup
- type NodeMatchLevel
- type NodeMatchQuery
- type NodeVisibility
- type ParseResult
- type QueryRepository
- type ReadRepository
- type ReconciliationObserver
- type ReconciliationStats
- type ReconciliationStatusRepository
- type RelationDirection
- type RelationEdgePage
- type RelationEdgeQuery
- type RelationEdgeRepository
- type Repository
- type ScopedNode
- type StatusRepository
- type TopologyRepository
- type WriteBatchStats
- type WriteStats
Constants ¶
const ( ProducerGDScript = "gdscript" ProducerGodot = "godot" ProducerIndexer = "indexer" )
Stable extraction producers identify the authority that created a fact. Producer is deliberately separate from source language: one fact can point across languages, while its producer remains the parser or indexer that extracted the evidence.
const SchemaVersion = 12
Variables ¶
This section is empty.
Functions ¶
func AllowsResolutionKind ¶
AllowsResolutionKind reports whether a kind-less fact may resolve to kind. Parsers that provide TargetKind have stronger evidence and bypass this fallback filter. Keeping the policy in graph prevents storage adapters from silently producing different edges as the node and edge vocabularies grow.
func IsDataResourceKind ¶
IsDataResourceKind reports whether kind names a stored data resource.
func IsDeclarationMember ¶
IsDeclarationMember reports whether kind is one a parser uses for a sub-part of a declaration. It is a necessary condition for suppressing a candidate during resolution, never a sufficient one; see the suppression invariant above memberKinds.
func IsTestSupportNode ¶
IsTestSupportNode reports whether a declaration belongs to test support code rather than production code. Parsers set test_role on helpers and lifecycle hooks; storage and query use the same predicate so direct and derived structural coverage cannot disagree about what is production.
func LooseMatch ¶
func LooseMatch(level NodeMatchLevel, selector string, node Node) bool
LooseMatch reports whether node matches selector at level ignoring ASCII case. It mirrors the SQL predicates behind MatchNodes so in-memory adapters and fakes can implement the same contract.
func MarshalProperties ¶
func SimpleName ¶
func SortNodeMatches ¶
func SortNodeMatches(level NodeMatchLevel, selector string, nodes []Node)
SortNodeMatches applies the ordering NodeMatchGroup documents: strict matches first, then local nodes before external boundary nodes, then shortest qualified name, then qualified name and ID for stability.
func SortedPropertyKeys ¶
func StrictMatch ¶
func StrictMatch(level NodeMatchLevel, selector string, node Node) bool
StrictMatch reports whether node matches selector case-sensitively at level. Adapters compare case-insensitively so a caller can see near misses; this predicate is the single definition of the stronger, case-sensitive form, and every adapter and use case must agree on it.
func UnmarshalProperties ¶
Types ¶
type CanonicalMessagePage ¶
type CanonicalMessagePage struct {
Items []ScopedNode
Truncated bool
}
CanonicalMessagePage reports whether more matching canonical messages exist beyond the requested bound.
type CanonicalMessageQuery ¶
type CanonicalMessageQuery struct {
Repository string
Package string
Message string
PathPrefixes []string
Limit int
}
CanonicalMessageQuery selects locally declared protocol-message types before applying its bound. Package and Message are exact semantic filters rather than post-enumeration presentation filters.
func (CanonicalMessageQuery) Validate ¶
func (q CanonicalMessageQuery) Validate() error
type CanonicalMessageRepository ¶
type CanonicalMessageRepository interface {
CanonicalMessages(context.Context, CanonicalMessageQuery) (CanonicalMessagePage, error)
}
CanonicalMessageRepository is the narrow bounded enumeration port used by message coverage. Implementations filter authoritative message declarations before sorting and limiting.
type CatalogRepository ¶
type CatalogRepository interface {
Node(context.Context, string) (Node, error)
NodeListRepository
RelationEdgeRepository
}
CatalogRepository is the read port the data, configuration, and event catalogs depend on.
type Diagnostic ¶
type Edge ¶
type Edge struct {
ID string `json:"id"`
FromID string `json:"from_id"`
ToID string `json:"to_id"`
Kind EdgeKind `json:"kind"`
Producer string `json:"producer,omitempty"`
Location Location `json:"location,omitempty"`
Properties map[string]string `json:"properties,omitempty"`
FactID string `json:"fact_id,omitempty"`
}
func DirectTestEdge ¶
DirectTestEdge derives a persisted direct tests relation from one resolved call/reference edge. External, ambiguous, helper, lifecycle, and test targets are excluded: the original evidence edge remains the authority and unresolved evidence remains visible there without becoming coverage.
type EdgeKind ¶
type EdgeKind string
const ( EdgeContains EdgeKind = "contains" EdgeDeclares EdgeKind = "declares" EdgeImports EdgeKind = "imports" EdgeExports EdgeKind = "exports" EdgeCalls EdgeKind = "calls" // EdgeTests is direct, uniquely resolved structural test evidence. Helper // expansion stays query-time and never persists synthetic transitive edges. EdgeTests EdgeKind = "tests" EdgeEmbeds EdgeKind = "embeds" EdgeExtends EdgeKind = "extends" EdgeImplements EdgeKind = "implements" EdgeReadsConfig EdgeKind = "reads_config" EdgeDefines EdgeKind = "defines" EdgeExposes EdgeKind = "exposes" EdgeHandledBy EdgeKind = "handled_by" // uses_middleware connects an endpoint to one callable in its effective // outer-to-inner middleware chain. Order and framework form are edge // evidence, keeping the relation language-neutral. EdgeUsesMiddleware EdgeKind = "uses_middleware" EdgePublishes EdgeKind = "publishes" EdgeSubscribes EdgeKind = "subscribes" EdgeReferences EdgeKind = "references" EdgeReads EdgeKind = "reads" EdgeWrites EdgeKind = "writes" // encodes and decodes connect application code to a language-neutral // protocol declaration. Field-level protocol access continues to use the // shared reads and writes relations, distinguished by edge properties. EdgeEncodes EdgeKind = "encodes" EdgeDecodes EdgeKind = "decodes" // sends and receives connect application code to a stable transport // operation callsite. carries connects that operation to a canonical // protocol message only when payload provenance proves the relationship. EdgeSends EdgeKind = "sends" EdgeReceives EdgeKind = "receives" EdgeCarries EdgeKind = "carries" EdgeHasField EdgeKind = "has_field" EdgeAssigns EdgeKind = "assigns" EdgeReturns EdgeKind = "returns" EdgePasses EdgeKind = "passes" EdgeRequests EdgeKind = "requests" EdgeDependsOn EdgeKind = "depends_on" EdgeDocuments EdgeKind = "documents" // generated_from connects a language binding projection to the canonical // declaration that defines its wire/schema identity. Generated source is // evidence for a projection, never a second schema authority. EdgeGeneratedFrom EdgeKind = "generated_from" // Failure-flow relations are language-neutral even though Go is currently // their only producer. returns_error describes a callable's typed result // contract; propagates_error and wraps_error describe actual exits; // handles_error records a consuming conditional action. panics, recovers, // and defers keep abrupt exits and cleanup separate from ordinary calls. // Recognition details such as return, join, comparison, switch, or recovery // live in the edge's "form" property. EdgeReturnsError EdgeKind = "returns_error" EdgePropagatesError EdgeKind = "propagates_error" EdgeHandlesError EdgeKind = "handles_error" EdgeWrapsError EdgeKind = "wraps_error" EdgePanics EdgeKind = "panics" EdgeRecovers EdgeKind = "recovers" EdgeDefers EdgeKind = "defers" // Godot composition relations. instantiates records a scene instance // (nested or inherited) and is deliberately distinct from extends so // scene composition is never mislabeled as language class inheritance. // attaches_script records a script bound to a scene node, scene, or // resource. autoloads records the target a project.godot autoload // declaration exposes globally. EdgeInstantiates EdgeKind = "instantiates" EdgeAttachesScript EdgeKind = "attaches_script" EdgeAutoloads EdgeKind = "autoloads" // Godot gameplay-interaction relations. uses_input_action records a read of // a declared input action; in_group records that a node belongs to (or // leaves) a node group; uses_group records a lookup of, or a dispatch to, // the members of a group without asserting membership. // // The operation that produced each edge lives in its "form" property rather // than in a separate edge kind, because direction and meaning are shared // within each relation: a group lookup and a group call both read the // group's members, and add_to_group and remove_from_group both name a // membership between the same two nodes. A membership test (is_in_group) is // deliberately a uses_group lookup and never an in_group edge: asking // whether a node is in a group is not evidence that it is. EdgeUsesInputAction EdgeKind = "uses_input_action" EdgeInGroup EdgeKind = "in_group" EdgeUsesGroup EdgeKind = "uses_group" )
type ExternalEdgeRepository ¶
ExternalEdgeRepository exposes unresolved edge targets for cross-repository federation. It remains separate so traversal use cases do not require it.
type ExternalNodeRepository ¶
type ExternalNodeRepository interface {
ExternalNodesMatching(context.Context, Node) ([]Node, error)
}
ExternalNodeRepository enumerates unresolved boundary nodes that a declared node can replace during federation. It returns exact name equivalence only; relation evidence is still loaded exclusively through RelationEdgeRepository.
type ExternalRequestEdge ¶
ExternalRequestEdge is one persisted request boundary plus both endpoint and source nodes. Federation consumes these in bounded pages to build a symmetric route projection without per-endpoint adjacency queries.
type ExternalRequestEdgePage ¶
type ExternalRequestEdgePage struct {
Items []ExternalRequestEdge
Next string
}
type Fact ¶
type Fact struct {
ID string `json:"id"`
FromID string `json:"from_id"`
Source string `json:"source,omitempty"`
SourceKind NodeKind `json:"source_kind,omitempty"`
Kind EdgeKind `json:"kind"`
Producer string `json:"producer,omitempty"`
TargetID string `json:"target_id,omitempty"`
Target string `json:"target,omitempty"`
TargetKind NodeKind `json:"target_kind,omitempty"`
Location Location `json:"location,omitempty"`
Properties map[string]string `json:"properties,omitempty"`
OwnerFile string `json:"-"`
}
func (Fact) ValidateSourceLocator ¶
ValidateSourceLocator requires a fact to identify its source either by an exact node ID or by a symbolic name with an optional kind. Keeping this invariant on Fact makes every producer and persistence adapter share one contract instead of choosing precedence between conflicting evidence.
type FileCatalog ¶
type FileCatalog interface {
Files(context.Context) (map[string]FileRecord, error)
}
FileCatalog exposes the indexed file records of one repository index. It is the authority for search membership; search never walks the filesystem.
type FileRecord ¶
type HydratedRelationEdge ¶
type HydratedRelationEdge struct {
Edge Edge
Counterpart Node
// Repository identifies the indexed repository that owns Counterpart.
// Single-repository callers may leave it empty and provide their known scope.
Repository string
}
HydratedRelationEdge pairs an edge with the node opposite the request's subject. Adapters return the pair atomically so catalogs never perform an N+1 node lookup or silently omit a missing counterpart.
type IndexRepository ¶
type IndexRepository interface {
Meta(context.Context, string) (string, error)
SetMeta(context.Context, string, string) error
Files(context.Context) (map[string]FileRecord, error)
ReplaceFile(context.Context, FileRecord, ParseResult) error
ReplaceOwner(context.Context, string, ParseResult) error
RemoveFiles(context.Context, []string) error
Reconcile(context.Context) error
Counts(context.Context) (Counts, error)
}
IndexRepository is the narrow persistence port used by the indexing use case.
type InstrumentedIndexRepository ¶
type InstrumentedIndexRepository interface {
ReconcileWithStats(context.Context, ReconciliationObserver) (ReconciliationStats, error)
}
InstrumentedIndexRepository optionally exposes reconciliation progress. Indexers retain compatibility with repositories that implement only IndexRepository.
type InstrumentedWriteRepository ¶
type InstrumentedWriteRepository interface {
WriteStats() WriteStats
}
InstrumentedWriteRepository optionally exposes cumulative bounded-write metrics. Indexers take a per-run delta so a repository can be reused.
type Node ¶
type Node struct {
ID string `json:"id"`
Kind NodeKind `json:"kind"`
Name string `json:"name"`
QualifiedName string `json:"qualified_name"`
Language string `json:"language,omitempty"`
Location Location `json:"location,omitempty"`
Properties map[string]string `json:"properties,omitempty"`
OwnerFile string `json:"-"`
External bool `json:"external,omitempty"`
}
type NodeKind ¶
type NodeKind string
const ( KindRepository NodeKind = "repository" KindComponent NodeKind = "component" KindFile NodeKind = "file" KindPackage NodeKind = "package" KindModule NodeKind = "module" KindFunction NodeKind = "function" KindMethod NodeKind = "method" // KindTest is a statically recognized test declaration. Subtype and // framework details remain properties so one language-neutral kind covers // Go tests, benchmarks, fuzz tests, examples, and Godot test methods. KindTest NodeKind = "test" KindType NodeKind = "type" KindClass NodeKind = "class" KindInterface NodeKind = "interface" KindField NodeKind = "field" KindVariable NodeKind = "variable" KindParameter NodeKind = "parameter" KindTable NodeKind = "table" KindView NodeKind = "view" KindColumn NodeKind = "column" KindIndex NodeKind = "index" KindConfigKey NodeKind = "config_key" KindEndpoint NodeKind = "endpoint" KindEvent NodeKind = "event" KindDocSection NodeKind = "document_section" KindExternal NodeKind = "external" // Godot runtime composition vocabulary. Scenes and resources are the // engine's two text-resource forms, scene nodes are the tree a scene // declares, and an autoload is a globally available singleton declared in // project.godot. They are distinct kinds rather than generic modules and // variables so composition questions are answerable by kind and edge // instead of property inspection. KindGodotScene NodeKind = "godot_scene" KindGodotResource NodeKind = "godot_resource" KindGodotSceneNode NodeKind = "godot_scene_node" KindGodotAutoload NodeKind = "godot_autoload" // Godot gameplay-interaction vocabulary. An input action is a named action // declared in a project.godot [input] section and read back by Input and // InputMap calls; a node group is a named set of scene nodes declared in a // [global_group] section and joined, tested, and dispatched to by name. // Both are project-scoped declarations rather than generic config keys, so // "who uses this action" and "who is in this group" are answerable by kind // and edge instead of by matching a key-name prefix. KindGodotInputAction NodeKind = "godot_input_action" KindGodotNodeGroup NodeKind = "godot_node_group" // A transport operation is one evidence-backed send or receive callsite. // It is deliberately not a channel or peer node: equal channel values do // not establish communication between two endpoints. KindTransportOperation NodeKind = "transport_operation" )
func DataResourceKinds ¶
func DataResourceKinds() []NodeKind
DataResourceKinds lists the node kinds that represent stored data resources. Extending this list extends every data catalog without changing query or presentation code.
func NodeKinds ¶
func NodeKinds() []NodeKind
NodeKinds returns the node vocabulary. Callers must not mutate the result.
func ParseNodeKind ¶
ParseNodeKind validates a caller-supplied node kind. An empty value parses to the empty kind, which every filter treats as "any kind"; an unknown value is an error rather than a filter that can never match.
type NodeListQuery ¶
type NodeListQuery struct {
Kinds []NodeKind
Name string
Repository string
// PathPrefixes are normalized repository-relative segment prefixes. They
// filter canonical node locations before the per-kind Limit is applied.
PathPrefixes []string
// Visibility defaults to LocalNodes so a catalog never silently mixes
// declarations with unresolved external targets.
Visibility NodeVisibility
// Limit bounds the rows returned for each requested kind. Callers that
// merge several kinds apply their own total bound and report truncation.
Limit int
}
NodeListQuery selects nodes for catalog use cases. It expresses enumeration only: exact kinds, an optional name fragment, and explicit bounds.
type NodeListRepository ¶
type NodeListRepository interface {
Repositories(context.Context) ([]string, error)
ListNodesByKind(context.Context, NodeListQuery) ([]ScopedNode, error)
}
NodeListRepository enumerates nodes by exact kind and attributes them to an indexed repository. Adapters only enumerate; catalog semantics such as usage direction and orphan classification stay in the query use cases.
type NodeMatchGroup ¶
type NodeMatchGroup struct {
Level NodeMatchLevel `json:"level"`
// External marks a group that holds external boundary nodes because no local
// declaration matched at this level. It makes the group weaker evidence than a
// local group at the same level, which matters when merging federated members.
External bool `json:"external,omitempty"`
Nodes []Node `json:"nodes"`
Strict int `json:"strict"`
Total int `json:"total"`
}
NodeMatchGroup is the complete evidence for a selector at one level.
Adapters must honor three rules, because selector resolution is only sound if they hold:
- The group is the strongest evidence that matched anything, ranked by StrongerThan: a case-sensitive match outranks a case-insensitive-only one at any level, then a stronger level wins, then a local declaration beats an external boundary node. Weaker evidence is not reported, so a substring match never competes with an exact name match and an unresolved boundary node never competes with a real declaration.
- Total and Strict count every match at that level in the graph, whether or not it fits in Nodes. Truncation must therefore be observable, and a truncated list can never silently narrow a match set.
- Nodes lists case-sensitive ("strict") matches first and is otherwise deterministically ordered, so the first Strict entries of Nodes are exactly the strict matches whenever Strict <= len(Nodes).
func (NodeMatchGroup) StrongerThan ¶
func (g NodeMatchGroup) StrongerThan(other NodeMatchGroup) bool
StrongerThan reports whether g is better evidence than other. The ranking is, in order: a group holding at least one case-sensitive match beats one holding none, because a case-insensitive-only match is a weaker form of evidence and must not outrank a case-sensitive match at a weaker level - a folded qualified-name hit on "path" must not beat the nodes named exactly "Path"; then a stronger level wins; then a local group beats an external fallback. An empty group is never stronger than anything.
func (NodeMatchGroup) Truncated ¶
func (g NodeMatchGroup) Truncated() bool
Truncated reports whether the graph holds matches that Nodes omits.
type NodeMatchLevel ¶
type NodeMatchLevel string
NodeMatchLevel names one class of evidence that a selector matched a node. Levels are ordered: a qualified-name match is stronger evidence than a bare name match, which is stronger than a substring match. Resolution never mixes levels, so a weaker match can never make a stronger one ambiguous.
const ( // MatchNone is the zero level, reported when a selector matched nothing. MatchNone NodeMatchLevel = "" // MatchQualifiedName means qualified_name equals the selector. MatchQualifiedName NodeMatchLevel = "qualified_name" // MatchName means name equals the selector. MatchName NodeMatchLevel = "name" // MatchSubstring means name or qualified_name contains the selector. MatchSubstring NodeMatchLevel = "substring" )
func (NodeMatchLevel) Rank ¶
func (l NodeMatchLevel) Rank() int
Rank orders levels from strongest to weakest. MatchNone ranks last so an empty group never displaces a real one.
func (NodeMatchLevel) Stronger ¶
func (l NodeMatchLevel) Stronger(other NodeMatchLevel) bool
Stronger reports whether l is better evidence than other.
type NodeMatchQuery ¶
type NodeMatchQuery struct {
Selector string `json:"selector"`
Kind NodeKind `json:"kind,omitempty"`
Repository string `json:"repository,omitempty"`
Limit int `json:"limit,omitempty"`
}
NodeMatchQuery asks an adapter for the match evidence behind one selector. Kind is an optional filter: an empty kind matches any kind. Limit bounds only the returned node list, never the reported totals, so a caller can always tell that a list was truncated.
type NodeVisibility ¶
type NodeVisibility string
NodeVisibility selects whether an enumeration returns locally declared nodes, unresolved external nodes, or both.
const ( LocalNodes NodeVisibility = "local" ExternalNodes NodeVisibility = "external" AllNodes NodeVisibility = "all" )
type ParseResult ¶
type ParseResult struct {
Nodes []Node
Facts []Fact
Diagnostics []Diagnostic
}
type QueryRepository ¶
type QueryRepository interface {
SearchNodes(context.Context, string, int) ([]Node, error)
// MatchNodes returns the strongest non-empty match evidence for a selector.
// Selector resolution depends on its contract; see NodeMatchGroup.
MatchNodes(context.Context, NodeMatchQuery) (NodeMatchGroup, error)
Node(context.Context, string) (Node, error)
EdgesFrom(context.Context, string) ([]Edge, error)
EdgesTo(context.Context, string) ([]Edge, error)
}
QueryRepository is the read-only port used by graph traversal use cases.
type ReadRepository ¶
type ReadRepository interface {
QueryRepository
StatusRepository
}
type ReconciliationObserver ¶
type ReconciliationObserver func(ReconciliationStats) error
ReconciliationObserver runs after a reconciliation batch commits and before its WAL checkpoint. Returning an error stops at that durable boundary.
type ReconciliationStats ¶
type ReconciliationStats struct {
Batches int `json:"batches"`
Writes WriteStats `json:"writes"`
}
ReconciliationStats describes durable work completed during reconciliation.
type ReconciliationStatusRepository ¶
type ReconciliationStatusRepository interface {
ReconciliationPending(context.Context) (bool, error)
}
ReconciliationStatusRepository is the optional, narrow capability used by indexing to prove that no resolver work remains. Absence of this capability is deliberately treated as unknown, never as clean.
type RelationDirection ¶
type RelationDirection string
RelationDirection selects which side of a subject node a bounded catalog evidence lookup follows.
const ( IncomingRelations RelationDirection = "incoming" OutgoingRelations RelationDirection = "outgoing" )
type RelationEdgePage ¶
type RelationEdgePage struct {
Items []HydratedRelationEdge
Truncated bool
}
RelationEdgePage contains at most Limit edges per requested relation.
type RelationEdgeQuery ¶
type RelationEdgeQuery struct {
SubjectID string
Direction RelationDirection
Relations []EdgeKind
Limit int
}
RelationEdgeQuery requests exact relations adjacent to one subject. Limit is applied independently to each distinct relation.
func (RelationEdgeQuery) Validate ¶
func (q RelationEdgeQuery) Validate() error
type RelationEdgeRepository ¶
type RelationEdgeRepository interface {
RelationEdges(context.Context, RelationEdgeQuery) (RelationEdgePage, error)
}
RelationEdgeRepository is the bounded, relation-filtered evidence port used by catalogs. Traversal continues to use QueryRepository adjacency methods.
type Repository ¶
type Repository interface {
IndexRepository
QueryRepository
StatusRepository
Close() error
Path() string
}
Repository is the complete port implemented by a storage adapter. Services accept the smaller interfaces above so their dependencies stay explicit.
type ScopedNode ¶
ScopedNode pairs a node with the indexed repository that stores it.
type StatusRepository ¶
type StatusRepository interface {
Meta(context.Context, string) (string, error)
Counts(context.Context) (Counts, error)
}
StatusRepository exposes only metadata and aggregate counts.
type TopologyRepository ¶
type TopologyRepository interface {
CatalogRepository
QueryRepository
}
TopologyRepository adds traversal adjacency to the bounded catalog port. Catalog-only consumers do not inherit unbounded traversal methods.
type WriteBatchStats ¶
type WriteBatchStats struct {
Batches int64 `json:"batches"`
Rows int64 `json:"rows"`
Bytes int64 `json:"bytes"`
}
WriteBatchStats describes bounded adapter writes without exposing a storage dialect or its configured limits to indexing callers.
type WriteStats ¶
type WriteStats struct {
Nodes WriteBatchStats `json:"nodes"`
Facts WriteBatchStats `json:"facts"`
Edges WriteBatchStats `json:"edges"`
}
WriteStats reports rows and encoded payload bytes sent through bounded write batches. Adapters that do not batch writes may leave it empty.