From 81b3bf98816c2390da897bb0b60252b53f7f14f0 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Mon, 4 Aug 2014 00:44:25 -0400 Subject: [PATCH] rename to quads --- graph/quadwriter.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++ graph/triplestore.go | 2 +- graph/triplewriter.go | 81 ------------------------------------------------- writer/single.go | 13 ++++---- 4 files changed, 91 insertions(+), 88 deletions(-) create mode 100644 graph/quadwriter.go delete mode 100644 graph/triplewriter.go diff --git a/graph/quadwriter.go b/graph/quadwriter.go new file mode 100644 index 0000000..bae0ced --- /dev/null +++ b/graph/quadwriter.go @@ -0,0 +1,83 @@ +// Copyright 2014 The Cayley Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package graph + +// Defines the interface for consistent replication of a graph instance. +// +// Separate from the backend, this dictates how individual triples get +// identified and replicated consistently across (potentially) multiple +// instances. The simplest case is to keep an append-only log of triple +// changes. + +import ( + "errors" + "time" + + "github.com/google/cayley/quad" +) + +type Procedure byte + +// The different types of actions a transaction can do. +const ( + Add Procedure = iota + Delete +) + +type Delta struct { + ID int64 + Quad *quad.Quad + Action Procedure + Timestamp time.Time +} + +type QuadWriter interface { + // Add a triple to the store. + AddQuad(*quad.Quad) error + + // Add a set of triples to the store, atomically if possible. + AddQuadSet([]*quad.Quad) error + + // Removes a triple matching the given one from the database, + // if it exists. Does nothing otherwise. + RemoveQuad(*quad.Quad) error +} + +type NewQuadWriterFunc func(TripleStore, Options) (QuadWriter, error) + +var writerRegistry = make(map[string]NewQuadWriterFunc) + +func RegisterWriter(name string, newFunc NewQuadWriterFunc) { + if _, found := writerRegistry[name]; found { + panic("already registered TripleWriter " + name) + } + writerRegistry[name] = newFunc +} + +func NewQuadWriter(name string, ts TripleStore, opts Options) (QuadWriter, error) { + newFunc, hasNew := writerRegistry[name] + if !hasNew { + return nil, errors.New("replication: name '" + name + "' is not registered") + } + return newFunc(ts, opts) +} + +func WriterMethods() []string { + t := make([]string, 0, len(writerRegistry)) + for n := range writerRegistry { + t = append(t, n) + } + return t +} diff --git a/graph/triplestore.go b/graph/triplestore.go index ba766fa..00b1a47 100644 --- a/graph/triplestore.go +++ b/graph/triplestore.go @@ -41,7 +41,7 @@ type Value interface{} type TripleStore interface { // The only way in is through building a transaction, which // is done by a replication strategy. - ApplyTransactions([]*Transaction) error + ApplyDeltas([]*Delta) error // Given an opaque token, returns the triple for that token from the store. Quad(Value) *quad.Quad diff --git a/graph/triplewriter.go b/graph/triplewriter.go deleted file mode 100644 index 65e560e..0000000 --- a/graph/triplewriter.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 The Cayley Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package graph - -// Defines the interface for consistent replication of a graph instance. -// -// Separate from the backend, this dictates how individual triples get -// identified and replicated consistently across (potentially) multiple -// instances. The simplest case is to keep an append-only log of triple -// changes. - -import ( - "errors" - "time" -) - -type Procedure byte - -// The different types of actions a transaction can do. -const ( - Add Procedure = iota - Delete -) - -type Transaction struct { - ID int64 - Triple *Triple - Action Procedure - Timestamp time.Time -} - -type TripleWriter interface { - // Add a triple to the store. - AddTriple(*Triple) error - - // Add a set of triples to the store, atomically if possible. - AddTripleSet([]*Triple) error - - // Removes a triple matching the given one from the database, - // if it exists. Does nothing otherwise. - RemoveTriple(*Triple) error -} - -type NewTripleWriterFunc func(TripleStore, Options) (TripleWriter, error) - -var writerRegistry = make(map[string]NewTripleWriterFunc) - -func RegisterWriter(name string, newFunc NewTripleWriterFunc) { - if _, found := writerRegistry[name]; found { - panic("already registered TripleWriter " + name) - } - writerRegistry[name] = newFunc -} - -func NewTripleWriter(name string, ts TripleStore, opts Options) (TripleWriter, error) { - newFunc, hasNew := writerRegistry[name] - if !hasNew { - return nil, errors.New("replication: name '" + name + "' is not registered") - } - return newFunc(ts, opts) -} - -func WriterMethods() []string { - t := make([]string, 0, len(writerRegistry)) - for n := range writerRegistry { - t = append(t, n) - } - return t -} diff --git a/writer/single.go b/writer/single.go index 6687055..d797af1 100644 --- a/writer/single.go +++ b/writer/single.go @@ -19,6 +19,7 @@ import ( "time" "github.com/google/cayley/graph" + "github.com/google/cayley/quad" ) type Single struct { @@ -27,7 +28,7 @@ type Single struct { mut sync.Mutex } -func NewSingleReplication(ts graph.TripleStore, opts graph.Options) (graph.TripleWriter, error) { +func NewSingleReplication(ts graph.TripleStore, opts graph.Options) (graph.QuadWriter, error) { rep := &Single{nextID: ts.Horizon(), ts: ts} if rep.nextID == -1 { rep.nextID = 1 @@ -43,23 +44,23 @@ func (s *Single) AcquireNextId() int64 { return id } -func (s *Single) AddTriple(t *graph.Triple) error { +func (s *Single) AddQuad(t *quad.Quad) error { trans := make([]*graph.Transaction, 1) trans[0] = &graph.Transaction{ ID: s.AcquireNextId(), - Triple: t, + Quad: t, Action: graph.Add, Timestamp: time.Now(), } return s.ts.ApplyTransactions(trans) } -func (s *Single) AddTripleSet(set []*graph.Triple) error { +func (s *Single) AddQuadSet(set []*quad.Quad) error { trans := make([]*graph.Transaction, len(set)) for i, t := range set { trans[i] = &graph.Transaction{ ID: s.AcquireNextId(), - Triple: t, + Quad: t, Action: graph.Add, Timestamp: time.Now(), } @@ -68,7 +69,7 @@ func (s *Single) AddTripleSet(set []*graph.Triple) error { return nil } -func (s *Single) RemoveTriple(t *graph.Triple) error { +func (s *Single) RemoveQuad(t *graph.Quad) error { trans := make([]*graph.Transaction, 1) trans[0] = &graph.Transaction{ ID: s.AcquireNextId(),