graph

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 20, 2016 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrQuadExists    = errors.New("quad exists")
	ErrQuadNotExist  = errors.New("quad does not exist")
	ErrInvalidAction = errors.New("invalid action")
)
View Source
var (
	// IgnoreDuplicates specifies whether duplicate quads
	// cause an error during loading or are ignored.
	IgnoreDuplicates = false

	// IgnoreMissing specifies whether missing quads
	// cause an error during deletion or are ignored.
	IgnoreMissing = false
)
View Source
var ErrCannotBulkLoad = errors.New("quadstore: cannot bulk load")
View Source
var ErrDatabaseExists = errors.New("quadstore: cannot init; database already exists")

Functions

func CanNext added in v0.6.0

func CanNext(it Iterator) bool

CanNext is a helper for checking if iterator can be Next()'ed.

func ContainsLogIn added in v0.3.1

func ContainsLogIn(it Iterator, val Value)

func ContainsLogOut added in v0.3.1

func ContainsLogOut(it Iterator, val Value, good bool) bool

func Height added in v0.4.0

func Height(it Iterator, until Type) int

Height is a convienence function to measure the height of an iterator tree.

func InitQuadStore added in v0.5.0

func InitQuadStore(name, dbpath string, opts Options) error

func IsInvalidAction added in v0.6.0

func IsInvalidAction(err error) bool

IsInvalidAction returns whether an error is a DeltaError with the Err field equal to ErrInvalidAction.

func IsPersistent added in v0.4.0

func IsPersistent(name string) bool

func IsQuadExist added in v0.6.0

func IsQuadExist(err error) bool

IsQuadExist returns whether an error is a DeltaError with the Err field equal to ErrQuadExists.

func IsQuadNotExist added in v0.6.0

func IsQuadNotExist(err error) bool

IsQuadNotExist returns whether an error is a DeltaError with the Err field equal to ErrQuadNotExist.

func NextLogIn

func NextLogIn(it Iterator)

func NextLogOut

func NextLogOut(it Iterator, ok bool) bool

func QuadStores added in v0.5.0

func QuadStores() []string

func RegisterQuadStore added in v0.5.0

func RegisterQuadStore(name string, register QuadStoreRegistration)

func RegisterWriter added in v0.4.0

func RegisterWriter(name string, newFunc NewQuadWriterFunc)

func UpgradeQuadStore added in v0.5.0

func UpgradeQuadStore(name, dbpath string, opts Options) error

func WriterMethods added in v0.4.0

func WriterMethods() []string

Types

type ApplyMorphism added in v0.5.0

type ApplyMorphism func(QuadStore, Iterator) Iterator

ApplyMorphism is a curried function that can generates a new iterator based on some prior iterator.

type BulkLoader added in v0.3.1

type BulkLoader interface {
	// BulkLoad loads Quads from a quad.Unmarshaler in bulk to the QuadStore.
	// It returns ErrCannotBulkLoad if bulk loading is not possible. For example if
	// you cannot load in bulk to a non-empty database, and the db is non-empty.
	BulkLoad(quad.Unmarshaler) error
}

type Delta added in v0.4.0

type Delta struct {
	ID        PrimaryKey
	Quad      quad.Quad
	Action    Procedure
	Timestamp time.Time
}

type DeltaError added in v0.6.0

type DeltaError struct {
	Delta Delta
	Err   error
}

DeltaError records an error and the delta that caused it.

func (*DeltaError) Error added in v0.6.0

func (e *DeltaError) Error() string

type Description added in v0.5.0

type Description struct {
	UID       uint64         `json:",omitempty"`
	Name      string         `json:",omitempty"`
	Type      Type           `json:",omitempty"`
	Tags      []string       `json:",omitempty"`
	Size      int64          `json:",omitempty"`
	Direction quad.Direction `json:",omitempty"`
	Iterator  *Description   `json:",omitempty"`
	Iterators []Description  `json:",omitempty"`
}

type FixedIterator

type FixedIterator interface {
	Iterator
	Add(Value)
}

FixedIterator wraps iterators that are modifiable by addition of fixed value sets.

type Handle added in v0.4.0

type Handle struct {
	QuadStore
	QuadWriter
}

func (*Handle) Close added in v0.4.0

func (h *Handle) Close()

type IgnoreOpts added in v0.5.0

type IgnoreOpts struct {
	IgnoreDup, IgnoreMissing bool
}

type InitStoreFunc added in v0.3.1

type InitStoreFunc func(string, Options) error

type IterateChain added in v0.6.0

type IterateChain struct {
	// contains filtered or unexported fields
}

IterateChain is a chain-enabled helper to setup iterator execution.

func Iterate added in v0.6.0

func Iterate(ctx context.Context, it Iterator) *IterateChain

Iterate is a set of helpers for iteration. Context may be used to cancel execution. Iterator will be optimized and closed after execution.

By default, iteration has no limit and includes sub-paths.

func (*IterateChain) All added in v0.6.0

func (c *IterateChain) All() ([]Value, error)

All will return all results of an iterator.

func (*IterateChain) AllValues added in v0.6.0

func (c *IterateChain) AllValues(qs QuadStore) ([]quad.Value, error)

AllValues is an analog of All, but it will additionally call NameOf for each graph.Value before returning the results slice.

func (*IterateChain) Each added in v0.6.0

func (c *IterateChain) Each(fnc func(Value)) error

Each will run a provided callback for each result of the iterator.

func (*IterateChain) EachValue added in v0.6.0

func (c *IterateChain) EachValue(qs QuadStore, fnc func(quad.Value)) error

EachValue is an analog of Each, but it will additionally call NameOf for each graph.Value before passing it to a callback.

func (*IterateChain) Limit added in v0.6.0

func (c *IterateChain) Limit(n int) *IterateChain

Limit limits a total number of results returned.

func (*IterateChain) On added in v0.6.0

func (c *IterateChain) On(qs QuadStore) *IterateChain

On sets a default quad store for iteration. If qs was set, it may be omitted in other functions.

func (*IterateChain) Paths added in v0.6.0

func (c *IterateChain) Paths(enable bool) *IterateChain

Paths switches iteration over sub-paths (with it.NextPath). Defaults to true.

func (*IterateChain) Send added in v0.6.0

func (c *IterateChain) Send(out chan<- Value) error

Send will send each result of the iterator to the provided channel.

Channel will NOT be closed when function returns.

func (*IterateChain) SendValues added in v0.6.0

func (c *IterateChain) SendValues(qs QuadStore, out chan<- quad.Value) error

SendValues is an analog of Send, but it will additionally call NameOf for each graph.Value before sending it to a channel.

func (*IterateChain) TagEach added in v0.6.0

func (c *IterateChain) TagEach(fnc func(map[string]Value)) error

TagEach will run a provided tag map callback for each result of the iterator.

func (*IterateChain) TagValues added in v0.6.0

func (c *IterateChain) TagValues(qs QuadStore, fnc func(map[string]quad.Value)) error

TagValues is an analog of TagEach, but it will additionally call NameOf for each graph.Value before passing the map to a callback.

func (*IterateChain) UnOptimized added in v0.6.0

func (c *IterateChain) UnOptimized() *IterateChain

UnOptimized disables iterator optimization.

type Iterator

type Iterator interface {
	Tagger() *Tagger

	// Fills a tag-to-result-value map.
	TagResults(map[string]Value)

	// Returns the current result.
	Result() Value

	// Next advances the iterator to the next value, which will then be available through
	// the Result method. It returns false if no further advancement is possible, or if an
	// error was encountered during iteration.  Err should be consulted to distinguish
	// between the two cases.
	Next() bool

	// These methods are the heart and soul of the iterator, as they constitute
	// the iteration interface.
	//
	// To get the full results of iteration, do the following:
	//
	//  for graph.Next(it) {
	//  	val := it.Result()
	//  	... do things with val.
	//  	for it.NextPath() {
	//  		... find other paths to iterate
	//  	}
	//  }
	//
	// All of them should set iterator.result to be the last returned value, to
	// make results work.
	//
	// NextPath() advances iterators that may have more than one valid result,
	// from the bottom up.
	NextPath() bool

	// Contains returns whether the value is within the set held by the iterator.
	Contains(Value) bool

	// Err returns any error that was encountered by the Iterator.
	Err() error

	// Start iteration from the beginning
	Reset()

	// Create a new iterator just like this one
	Clone() Iterator

	// These methods relate to choosing the right iterator, or optimizing an
	// iterator tree
	//
	// Stats() returns the relative costs of calling the iteration methods for
	// this iterator, as well as the size. Roughly, it will take NextCost * Size
	// "cost units" to get everything out of the iterator. This is a wibbly-wobbly
	// thing, and not exact, but a useful heuristic.
	Stats() IteratorStats

	// Helpful accessor for the number of things in the iterator. The first return
	// value is the size, and the second return value is whether that number is exact,
	// or a conservative estimate.
	Size() (int64, bool)

	// Returns a string relating to what the function of the iterator is. By
	// knowing the names of the iterators, we can devise optimization strategies.
	Type() Type

	// Optimizes an iterator. Can replace the iterator, or merely move things
	// around internally. if it chooses to replace it with a better iterator,
	// returns (the new iterator, true), if not, it returns (self, false).
	Optimize() (Iterator, bool)

	// Return a slice of the subiterators for this iterator.
	SubIterators() []Iterator

	// Return a string representation of the iterator.
	Describe() Description

	// Close the iterator and do internal cleanup.
	Close() error

	// UID returns the unique identifier of the iterator.
	UID() uint64
}

type IteratorStats

type IteratorStats struct {
	ContainsCost int64
	NextCost     int64
	Size         int64
	ExactSize    bool
	Next         int64
	Contains     int64
	ContainsNext int64
}

type Keyer added in v0.6.0

type Keyer interface {
	Key() interface{}
}

Keyer provides a method for comparing types that are not otherwise comparable. The Key method must return a dynamic type that is comparable according to the Go language specification. The returned value must be unique for each receiver value.

type Linkage added in v0.5.0

type Linkage struct {
	Dir   quad.Direction
	Value Value
}

Linkage is a union type representing a set of values established for a given quad direction.

type NewQuadWriterFunc added in v0.4.0

type NewQuadWriterFunc func(QuadStore, Options) (QuadWriter, error)

type NewStoreForRequestFunc added in v0.5.0

type NewStoreForRequestFunc func(QuadStore, Options) (QuadStore, error)

type NewStoreFunc added in v0.3.1

type NewStoreFunc func(string, Options) (QuadStore, error)

type NoNext added in v0.6.0

type NoNext interface {
	NoNext()
}

NoNext is an optional interface to signal that iterator should be Contain()'ed instead of Next()'ing if possible.

type Options added in v0.3.1

type Options map[string]interface{}

func (Options) BoolKey added in v0.4.0

func (d Options) BoolKey(key string) (bool, bool, error)

func (Options) IntKey added in v0.3.1

func (d Options) IntKey(key string) (int, bool, error)

func (Options) StringKey added in v0.3.1

func (d Options) StringKey(key string) (string, bool, error)

type PreFetchedValue added in v0.6.0

type PreFetchedValue interface {
	NameOf() quad.Value
}

PreFetchedValue is an optional interface for graph.Value to indicate that quadstore has already loaded a value into memory.

type PrimaryKey added in v0.5.0

type PrimaryKey struct {
	// contains filtered or unexported fields
}

func NewSequentialKey added in v0.5.0

func NewSequentialKey(horizon int64) PrimaryKey

func NewUniqueKey added in v0.5.0

func NewUniqueKey(horizon string) PrimaryKey

func (*PrimaryKey) Int added in v0.5.0

func (p *PrimaryKey) Int() int64

func (PrimaryKey) MarshalJSON added in v0.5.0

func (p PrimaryKey) MarshalJSON() ([]byte, error)

func (*PrimaryKey) Next added in v0.5.0

func (p *PrimaryKey) Next() PrimaryKey

func (*PrimaryKey) String added in v0.5.0

func (p *PrimaryKey) String() string

func (*PrimaryKey) UnmarshalJSON added in v0.5.0

func (p *PrimaryKey) UnmarshalJSON(bytes []byte) error

type Procedure added in v0.4.0

type Procedure int8
const (
	Add    Procedure = +1
	Delete Procedure = -1
)

The different types of actions a transaction can do.

func (Procedure) String added in v0.6.0

func (p Procedure) String() string

type QuadStore added in v0.5.0

type QuadStore interface {
	// The only way in is through building a transaction, which
	// is done by a replication strategy.
	ApplyDeltas([]Delta, IgnoreOpts) error

	// Given an opaque token, returns the quad for that token from the store.
	Quad(Value) quad.Quad

	// Given a direction and a token, creates an iterator of links which have
	// that node token in that directional field.
	QuadIterator(quad.Direction, Value) Iterator

	// Returns an iterator enumerating all nodes in the graph.
	NodesAllIterator() Iterator

	// Returns an iterator enumerating all links in the graph.
	QuadsAllIterator() Iterator

	// Given a node ID, return the opaque token used by the QuadStore
	// to represent that id.
	ValueOf(quad.Value) Value

	// Given an opaque token, return the node that it represents.
	NameOf(Value) quad.Value

	// Returns the number of quads currently stored.
	Size() int64

	// The last replicated transaction ID that this quadstore has verified.
	Horizon() PrimaryKey

	// Creates a fixed iterator which can compare Values
	FixedIterator() FixedIterator

	// Optimize an iterator in the context of the quad store.
	// Suppose we have a better index for the passed tree; this
	// gives the QuadStore the opportunity to replace it
	// with a more efficient iterator.
	OptimizeIterator(it Iterator) (Iterator, bool)

	// Close the quad store and clean up. (Flush to disk, cleanly
	// sever connections, etc)
	Close()

	// Convenience function for speed. Given a quad token and a direction
	// return the node token for that direction. Sometimes, a QuadStore
	// can do this without going all the way to the backing store, and
	// gives the QuadStore the opportunity to make this optimization.
	//
	// Iterators will call this. At worst, a valid implementation is
	//
	//  qs.ValueOf(qs.Quad(id).Get(dir))
	//
	QuadDirection(id Value, d quad.Direction) Value

	// Get the type of QuadStore
	//TODO replace this using reflection
	Type() string
}

func NewQuadStore added in v0.5.0

func NewQuadStore(name, dbpath string, opts Options) (QuadStore, error)

func NewQuadStoreForRequest added in v0.5.0

func NewQuadStoreForRequest(qs QuadStore, opts Options) (QuadStore, error)

type QuadStoreRegistration added in v0.5.0

type QuadStoreRegistration struct {
	NewFunc           NewStoreFunc
	NewForRequestFunc NewStoreForRequestFunc
	UpgradeFunc       UpgradeStoreFunc
	InitFunc          InitStoreFunc
	IsPersistent      bool
}

type QuadWriter added in v0.4.0

type QuadWriter interface {
	// AddQuad adds a quad to the store.
	AddQuad(quad.Quad) error

	// TODO(barakmich): Deprecate in favor of transaction.
	// AddQuadSet adds a set of quads to the store, atomically if possible.
	AddQuadSet([]quad.Quad) error

	// RemoveQuad removes a quad matching the given one  from the database,
	// if it exists. Does nothing otherwise.
	RemoveQuad(quad.Quad) error

	// ApplyTransaction applies a set of quad changes.
	ApplyTransaction(*Transaction) error

	// RemoveNode removes all quads which have the given node as subject, predicate, object, or label.
	RemoveNode(Value) error

	// Close cleans up replication and closes the writing aspect of the database.
	Close() error
}

func NewQuadWriter added in v0.4.0

func NewQuadWriter(name string, qs QuadStore, opts Options) (QuadWriter, error)

type StatsContainer added in v0.4.0

type StatsContainer struct {
	UID  uint64
	Type Type
	IteratorStats
	SubIts []StatsContainer
}

func DumpStats added in v0.4.0

func DumpStats(it Iterator) StatsContainer

type Tagger added in v0.3.1

type Tagger struct {
	// contains filtered or unexported fields
}

func (*Tagger) Add added in v0.3.1

func (t *Tagger) Add(tag string)

Add a tag to the iterator.

func (*Tagger) AddFixed added in v0.3.1

func (t *Tagger) AddFixed(tag string, value Value)

func (*Tagger) CopyFrom added in v0.3.1

func (t *Tagger) CopyFrom(src Iterator)

func (*Tagger) CopyFromTagger added in v0.5.0

func (t *Tagger) CopyFromTagger(st *Tagger)

func (*Tagger) Fixed added in v0.3.1

func (t *Tagger) Fixed() map[string]Value

Fixed returns the fixed tags held in the tagger. The returned value must not be mutated.

func (*Tagger) Tags added in v0.3.1

func (t *Tagger) Tags() []string

Tags returns the tags held in the tagger. The returned value must not be mutated.

type Transaction added in v0.5.0

type Transaction struct {
	// Deltas stores the deltas in the right order
	Deltas []Delta
	// contains filtered or unexported fields
}

Transaction stores a bunch of Deltas to apply atomatically on the database.

func NewTransaction added in v0.5.0

func NewTransaction() *Transaction

NewTransaction initialize a new transaction.

func (*Transaction) AddQuad added in v0.5.0

func (t *Transaction) AddQuad(q quad.Quad)

AddQuad adds a new quad to the transaction if it is not already present in it. If there is a 'remove' delta for that quad, it will remove that delta from the transaction instead of actually addind the quad.

func (*Transaction) RemoveQuad added in v0.5.0

func (t *Transaction) RemoveQuad(q quad.Quad)

RemoveQuad adds a quad to remove to the transaction. The quad will be removed from the database if it is not present in the transaction, otherwise it simply remove it from the transaction.

type Type added in v0.3.1

type Type int

Type enumerates the set of Iterator types.

const (
	Invalid Type = iota
	All
	And
	Or
	HasA
	LinksTo
	Comparison
	Null
	Fixed
	Not
	Optional
	Materialize
	Unique
	Limit
	Skip
	Regex
	Count
)

These are the iterator types, defined as constants

func RegisterIterator added in v0.3.1

func RegisterIterator(name string) Type

RegisterIterator adds a new iterator type to the set of acceptable types, returning the registered Type. Calls to Register are idempotent and must be made prior to use of the iterator. The conventional approach for use is to include a call to Register in a package init() function, saving the Type to a private package var.

func (*Type) MarshalText added in v0.5.0

func (t *Type) MarshalText() (text []byte, err error)

func (Type) String added in v0.3.1

func (t Type) String() string

String returns a string representation of the Type.

func (*Type) UnmarshalText added in v0.5.0

func (t *Type) UnmarshalText(text []byte) error

type UpgradeStoreFunc added in v0.5.0

type UpgradeStoreFunc func(string, Options) error

type Value added in v0.3.1

type Value interface {
	IsNode() bool
}

Value defines an opaque "quad store value" type. However the backend wishes to implement it, a Value is merely a token to a quad or a node that the backing store itself understands, and the base iterators pass around.

For example, in a very traditional, graphd-style graph, these are int64s (guids of the primitives). In a very direct sort of graph, these could be pointers to structs, or merely quads, or whatever works best for the backing store.

These must be comparable, or implement a Keyer interface so that they may be stored in maps.

func ToKey added in v0.6.0

func ToKey(v Value) Value

ToKey prepares Value to be stored inside maps, calling Key() if necessary.

Directories

Path Synopsis
b
Package b implements a B+tree.
Package b implements a B+tree.
Package proto is a generated protocol buffer package.
Package proto is a generated protocol buffer package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL