diff --git a/db/load.go b/db/load.go index 20953a7..9a3b069 100644 --- a/db/load.go +++ b/db/load.go @@ -57,7 +57,7 @@ func Load(ts graph.TripleStore, cfg *config.Config, path string) error { return err } - block := make([]*quad.Quad, 0, cfg.LoadSize) + block := make([]quad.Quad, 0, cfg.LoadSize) for { t, err := dec.Unmarshal() if err != nil { diff --git a/db/repl.go b/db/repl.go index c1bb5ea..730d59d 100644 --- a/db/repl.go +++ b/db/repl.go @@ -114,7 +114,7 @@ func Repl(ts graph.TripleStore, queryLanguage string, cfg *config.Config) error if bytes.HasPrefix(line, []byte(":a")) { var tripleStmt = line[3:] triple, err := cquads.Parse(string(tripleStmt)) - if triple == nil { + if !triple.IsValid() { if err != nil { fmt.Printf("not a valid triple: %v\n", err) } @@ -128,7 +128,7 @@ func Repl(ts graph.TripleStore, queryLanguage string, cfg *config.Config) error if bytes.HasPrefix(line, []byte(":d")) { var tripleStmt = line[3:] triple, err := cquads.Parse(string(tripleStmt)) - if triple == nil { + if !triple.IsValid() { if err != nil { fmt.Printf("not a valid triple: %v\n", err) } diff --git a/graph/iterator/mock_ts_test.go b/graph/iterator/mock_ts_test.go index 7332a8f..08483c7 100644 --- a/graph/iterator/mock_ts_test.go +++ b/graph/iterator/mock_ts_test.go @@ -36,11 +36,11 @@ func (qs *store) ValueOf(s string) graph.Value { return nil } -func (qs *store) AddTriple(*quad.Quad) {} +func (qs *store) AddTriple(quad.Quad) {} -func (qs *store) AddTripleSet([]*quad.Quad) {} +func (qs *store) AddTripleSet([]quad.Quad) {} -func (qs *store) Quad(graph.Value) *quad.Quad { return &quad.Quad{} } +func (qs *store) Quad(graph.Value) quad.Quad { return quad.Quad{} } func (qs *store) TripleIterator(d quad.Direction, i graph.Value) graph.Iterator { return qs.iter @@ -74,4 +74,4 @@ func (qs *store) Close() {} func (qs *store) TripleDirection(graph.Value, quad.Direction) graph.Value { return 0 } -func (qs *store) RemoveTriple(t *quad.Quad) {} +func (qs *store) RemoveTriple(t quad.Quad) {} diff --git a/graph/leveldb/leveldb_test.go b/graph/leveldb/leveldb_test.go index 0e6772a..956a5e4 100644 --- a/graph/leveldb/leveldb_test.go +++ b/graph/leveldb/leveldb_test.go @@ -26,8 +26,8 @@ import ( "github.com/google/cayley/quad" ) -func makeTripleSet() []*quad.Quad { - tripleSet := []*quad.Quad{ +func makeTripleSet() []quad.Quad { + tripleSet := []quad.Quad{ {"A", "follows", "B", ""}, {"C", "follows", "B", ""}, {"C", "follows", "D", ""}, @@ -43,7 +43,7 @@ func makeTripleSet() []*quad.Quad { return tripleSet } -func iteratedTriples(qs graph.TripleStore, it graph.Iterator) []*quad.Quad { +func iteratedTriples(qs graph.TripleStore, it graph.Iterator) []quad.Quad { var res ordered for { val, ok := graph.Next(it) @@ -56,7 +56,7 @@ func iteratedTriples(qs graph.TripleStore, it graph.Iterator) []*quad.Quad { return res } -type ordered []*quad.Quad +type ordered []quad.Quad func (o ordered) Len() int { return len(o) } func (o ordered) Less(i, j int) bool { @@ -143,7 +143,7 @@ func TestLoadDatabase(t *testing.T) { t.Error("Failed to create leveldb TripleStore.") } - qs.AddTriple(&quad.Quad{"Something", "points_to", "Something Else", "context"}) + qs.AddTriple(quad.Quad{"Something", "points_to", "Something Else", "context"}) for _, pq := range []string{"Something", "points_to", "Something Else", "context"} { if got := qs.NameOf(qs.ValueOf(pq)); got != pq { t.Errorf("Failed to roundtrip %q, got:%q expect:%q", pq, got, pq) @@ -176,7 +176,7 @@ func TestLoadDatabase(t *testing.T) { t.Errorf("Unexpected triplestore size, got:%d expect:5", s) } - qs.RemoveTriple(&quad.Quad{"A", "follows", "B", ""}) + qs.RemoveTriple(quad.Quad{"A", "follows", "B", ""}) if s := qs.Size(); s != 10 { t.Errorf("Unexpected triplestore size after RemoveTriple, got:%d expect:10", s) } @@ -301,7 +301,7 @@ func TestSetIterator(t *testing.T) { qs.AddTripleSet(makeTripleSet()) - expect := []*quad.Quad{ + expect := []quad.Quad{ {"C", "follows", "B", ""}, {"C", "follows", "D", ""}, } @@ -326,7 +326,7 @@ func TestSetIterator(t *testing.T) { // Object iterator. it = qs.TripleIterator(quad.Object, qs.ValueOf("F")) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "follows", "F", ""}, {"E", "follows", "F", ""}, } @@ -339,7 +339,7 @@ func TestSetIterator(t *testing.T) { and.AddSubIterator(qs.TripleIterator(quad.Subject, qs.ValueOf("B"))) and.AddSubIterator(it) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "follows", "F", ""}, } if got := iteratedTriples(qs, and); !reflect.DeepEqual(got, expect) { @@ -349,7 +349,7 @@ func TestSetIterator(t *testing.T) { // Predicate iterator. it = qs.TripleIterator(quad.Predicate, qs.ValueOf("status")) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "status", "cool", "status_graph"}, {"D", "status", "cool", "status_graph"}, {"G", "status", "cool", "status_graph"}, @@ -362,7 +362,7 @@ func TestSetIterator(t *testing.T) { // Label iterator. it = qs.TripleIterator(quad.Label, qs.ValueOf("status_graph")) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "status", "cool", "status_graph"}, {"D", "status", "cool", "status_graph"}, {"G", "status", "cool", "status_graph"}, @@ -378,7 +378,7 @@ func TestSetIterator(t *testing.T) { and.AddSubIterator(qs.TripleIterator(quad.Subject, qs.ValueOf("B"))) and.AddSubIterator(it) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "status", "cool", "status_graph"}, } if got := iteratedTriples(qs, and); !reflect.DeepEqual(got, expect) { @@ -391,7 +391,7 @@ func TestSetIterator(t *testing.T) { and.AddSubIterator(it) and.AddSubIterator(qs.TripleIterator(quad.Subject, qs.ValueOf("B"))) - expect = []*quad.Quad{ + expect = []quad.Quad{ {"B", "status", "cool", "status_graph"}, } if got := iteratedTriples(qs, and); !reflect.DeepEqual(got, expect) { diff --git a/graph/leveldb/triplestore.go b/graph/leveldb/triplestore.go index 8092d96..600b360 100644 --- a/graph/leveldb/triplestore.go +++ b/graph/leveldb/triplestore.go @@ -116,7 +116,7 @@ func (qs *TripleStore) Size() int64 { return qs.size } -func (qs *TripleStore) createKeyFor(d [3]quad.Direction, triple *quad.Quad) []byte { +func (qs *TripleStore) createKeyFor(d [3]quad.Direction, triple quad.Quad) []byte { key := make([]byte, 0, 2+(qs.hasher.Size()*3)) // TODO(kortschak) Remove dependence on String() method. key = append(key, []byte{d[0].Prefix(), d[1].Prefix()}...) @@ -126,7 +126,7 @@ func (qs *TripleStore) createKeyFor(d [3]quad.Direction, triple *quad.Quad) []by return key } -func (qs *TripleStore) createProvKeyFor(d [3]quad.Direction, triple *quad.Quad) []byte { +func (qs *TripleStore) createProvKeyFor(d [3]quad.Direction, triple quad.Quad) []byte { key := make([]byte, 0, 2+(qs.hasher.Size()*4)) // TODO(kortschak) Remove dependence on String() method. key = append(key, []byte{quad.Label.Prefix(), d[0].Prefix()}...) @@ -144,7 +144,7 @@ func (qs *TripleStore) createValueKeyFor(s string) []byte { return key } -func (qs *TripleStore) AddTriple(t *quad.Quad) { +func (qs *TripleStore) AddTriple(t quad.Quad) { batch := &leveldb.Batch{} qs.buildWrite(batch, t) err := qs.db.Write(batch, qs.writeopts) @@ -163,7 +163,7 @@ var ( pso = [3]quad.Direction{quad.Predicate, quad.Subject, quad.Object} ) -func (qs *TripleStore) RemoveTriple(t *quad.Quad) { +func (qs *TripleStore) RemoveTriple(t quad.Quad) { _, err := qs.db.Get(qs.createKeyFor(spo, t), qs.readopts) if err != nil && err != leveldb.ErrNotFound { glog.Error("Couldn't access DB to confirm deletion") @@ -192,8 +192,8 @@ func (qs *TripleStore) RemoveTriple(t *quad.Quad) { qs.size-- } -func (qs *TripleStore) buildTripleWrite(batch *leveldb.Batch, t *quad.Quad) { - bytes, err := json.Marshal(*t) +func (qs *TripleStore) buildTripleWrite(batch *leveldb.Batch, t quad.Quad) { + bytes, err := json.Marshal(t) if err != nil { glog.Errorf("Couldn't write to buffer for triple %s: %s", t, err) return @@ -206,7 +206,7 @@ func (qs *TripleStore) buildTripleWrite(batch *leveldb.Batch, t *quad.Quad) { } } -func (qs *TripleStore) buildWrite(batch *leveldb.Batch, t *quad.Quad) { +func (qs *TripleStore) buildWrite(batch *leveldb.Batch, t quad.Quad) { qs.buildTripleWrite(batch, t) qs.UpdateValueKeyBy(t.Get(quad.Subject), 1, nil) qs.UpdateValueKeyBy(t.Get(quad.Predicate), 1, nil) @@ -267,7 +267,7 @@ func (qs *TripleStore) UpdateValueKeyBy(name string, amount int, batch *leveldb. } } -func (qs *TripleStore) AddTripleSet(t_s []*quad.Quad) { +func (qs *TripleStore) AddTripleSet(t_s []quad.Quad) { batch := &leveldb.Batch{} newTs := len(t_s) resizeMap := make(map[string]int) @@ -306,23 +306,23 @@ func (qs *TripleStore) Close() { qs.open = false } -func (qs *TripleStore) Quad(k graph.Value) *quad.Quad { +func (qs *TripleStore) Quad(k graph.Value) quad.Quad { var triple quad.Quad b, err := qs.db.Get(k.([]byte), qs.readopts) if err != nil && err != leveldb.ErrNotFound { glog.Error("Error: couldn't get triple from DB.") - return &quad.Quad{} + return quad.Quad{} } if err == leveldb.ErrNotFound { // No harm, no foul. - return &quad.Quad{} + return quad.Quad{} } err = json.Unmarshal(b, &triple) if err != nil { glog.Error("Error: couldn't reconstruct triple.") - return &quad.Quad{} + return quad.Quad{} } - return &triple + return triple } func (qs *TripleStore) convertStringToByteHash(s string) []byte { diff --git a/graph/memstore/triplestore.go b/graph/memstore/triplestore.go index 23eb11a..c364f28 100644 --- a/graph/memstore/triplestore.go +++ b/graph/memstore/triplestore.go @@ -101,13 +101,13 @@ func newTripleStore() *TripleStore { return &ts } -func (ts *TripleStore) AddTripleSet(triples []*quad.Quad) { +func (ts *TripleStore) AddTripleSet(triples []quad.Quad) { for _, t := range triples { ts.AddTriple(t) } } -func (ts *TripleStore) tripleExists(t *quad.Quad) (bool, int64) { +func (ts *TripleStore) tripleExists(t quad.Quad) (bool, int64) { smallest := -1 var smallest_tree *llrb.LLRB for d := quad.Subject; d <= quad.Label; d++ { @@ -137,19 +137,19 @@ func (ts *TripleStore) tripleExists(t *quad.Quad) (bool, int64) { if !ok { break } - if t.Equals(&ts.triples[val.(int64)]) { + if t.Equals(ts.triples[val.(int64)]) { return true, val.(int64) } } return false, 0 } -func (ts *TripleStore) AddTriple(t *quad.Quad) { +func (ts *TripleStore) AddTriple(t quad.Quad) { if exists, _ := ts.tripleExists(t); exists { return } var tripleID int64 - ts.triples = append(ts.triples, *t) + ts.triples = append(ts.triples, t) tripleID = ts.tripleIdCounter ts.size++ ts.tripleIdCounter++ @@ -178,7 +178,7 @@ func (ts *TripleStore) AddTriple(t *quad.Quad) { // TODO(barakmich): Add VIP indexing } -func (ts *TripleStore) RemoveTriple(t *quad.Quad) { +func (ts *TripleStore) RemoveTriple(t quad.Quad) { var tripleID int64 var exists bool tripleID = 0 @@ -224,8 +224,8 @@ func (ts *TripleStore) RemoveTriple(t *quad.Quad) { } } -func (ts *TripleStore) Quad(index graph.Value) *quad.Quad { - return &ts.triples[index.(int64)] +func (ts *TripleStore) Quad(index graph.Value) quad.Quad { + return ts.triples[index.(int64)] } func (ts *TripleStore) TripleIterator(d quad.Direction, value graph.Value) graph.Iterator { diff --git a/graph/memstore/triplestore_test.go b/graph/memstore/triplestore_test.go index 44c43b4..1080b7e 100644 --- a/graph/memstore/triplestore_test.go +++ b/graph/memstore/triplestore_test.go @@ -37,7 +37,7 @@ import ( // \-->|#D#|------------->+---+ // +---+ // -var simpleGraph = []*quad.Quad{ +var simpleGraph = []quad.Quad{ {"A", "follows", "B", ""}, {"C", "follows", "B", ""}, {"C", "follows", "D", ""}, @@ -51,7 +51,7 @@ var simpleGraph = []*quad.Quad{ {"G", "status", "cool", "status_graph"}, } -func makeTestStore(data []*quad.Quad) (*TripleStore, []pair) { +func makeTestStore(data []quad.Quad) (*TripleStore, []pair) { seen := make(map[string]struct{}) ts := newTripleStore() var ( @@ -175,7 +175,7 @@ func TestLinksToOptimization(t *testing.T) { func TestRemoveTriple(t *testing.T) { ts, _ := makeTestStore(simpleGraph) - ts.RemoveTriple(&quad.Quad{"E", "follows", "F", ""}) + ts.RemoveTriple(quad.Quad{"E", "follows", "F", ""}) fixed := ts.FixedIterator() fixed.Add(ts.ValueOf("E")) diff --git a/graph/mongo/triplestore.go b/graph/mongo/triplestore.go index 2022e6c..20fea2f 100644 --- a/graph/mongo/triplestore.go +++ b/graph/mongo/triplestore.go @@ -91,7 +91,7 @@ func newTripleStore(addr string, options graph.Options) (graph.TripleStore, erro return &qs, nil } -func (qs *TripleStore) getIdForTriple(t *quad.Quad) string { +func (qs *TripleStore) getIdForTriple(t quad.Quad) string { id := qs.ConvertStringToByteHash(t.Subject) id += qs.ConvertStringToByteHash(t.Predicate) id += qs.ConvertStringToByteHash(t.Object) @@ -150,7 +150,7 @@ func (qs *TripleStore) updateNodeBy(node_name string, inc int) { } } -func (qs *TripleStore) writeTriple(t *quad.Quad) bool { +func (qs *TripleStore) writeTriple(t quad.Quad) bool { tripledoc := bson.M{ "_id": qs.getIdForTriple(t), "Subject": t.Subject, @@ -170,7 +170,7 @@ func (qs *TripleStore) writeTriple(t *quad.Quad) bool { return true } -func (qs *TripleStore) AddTriple(t *quad.Quad) { +func (qs *TripleStore) AddTriple(t quad.Quad) { _ = qs.writeTriple(t) qs.updateNodeBy(t.Subject, 1) qs.updateNodeBy(t.Predicate, 1) @@ -180,7 +180,7 @@ func (qs *TripleStore) AddTriple(t *quad.Quad) { } } -func (qs *TripleStore) AddTripleSet(in []*quad.Quad) { +func (qs *TripleStore) AddTripleSet(in []quad.Quad) { qs.session.SetSafe(nil) ids := make(map[string]int) for _, t := range in { @@ -200,7 +200,7 @@ func (qs *TripleStore) AddTripleSet(in []*quad.Quad) { qs.session.SetSafe(&mgo.Safe{}) } -func (qs *TripleStore) RemoveTriple(t *quad.Quad) { +func (qs *TripleStore) RemoveTriple(t quad.Quad) { err := qs.db.C("triples").RemoveId(qs.getIdForTriple(t)) if err == mgo.ErrNotFound { return @@ -216,13 +216,13 @@ func (qs *TripleStore) RemoveTriple(t *quad.Quad) { } } -func (qs *TripleStore) Quad(val graph.Value) *quad.Quad { +func (qs *TripleStore) Quad(val graph.Value) quad.Quad { var bsonDoc bson.M err := qs.db.C("triples").FindId(val.(string)).One(&bsonDoc) if err != nil { glog.Errorf("Error: Couldn't retrieve triple %s %v", val, err) } - return &quad.Quad{ + return quad.Quad{ bsonDoc["Subject"].(string), bsonDoc["Predicate"].(string), bsonDoc["Object"].(string), diff --git a/graph/triplestore.go b/graph/triplestore.go index a722db3..c099d47 100644 --- a/graph/triplestore.go +++ b/graph/triplestore.go @@ -40,17 +40,17 @@ type Value interface{} type TripleStore interface { // Add a triple to the store. - AddTriple(*quad.Quad) + AddTriple(quad.Quad) // Add a set of triples to the store, atomically if possible. - AddTripleSet([]*quad.Quad) + AddTripleSet([]quad.Quad) // Removes a triple matching the given one from the database, // if it exists. Does nothing otherwise. - RemoveTriple(*quad.Quad) + RemoveTriple(quad.Quad) // Given an opaque token, returns the triple for that token from the store. - Quad(Value) *quad.Quad + Quad(Value) quad.Quad // Given a direction and a token, creates an iterator of links which have // that node token in that directional field. diff --git a/http/http_test.go b/http/http_test.go index e4d8c30..d56bebf 100644 --- a/http/http_test.go +++ b/http/http_test.go @@ -25,7 +25,7 @@ import ( var parseTests = []struct { message string input string - expect []*quad.Quad + expect []quad.Quad err error }{ { @@ -34,7 +34,7 @@ var parseTests = []struct { {"subject": "foo", "predicate": "bar", "object": "baz"}, {"subject": "foo", "predicate": "bar", "object": "baz", "label": "graph"} ]`, - expect: []*quad.Quad{ + expect: []quad.Quad{ {"foo", "bar", "baz", ""}, {"foo", "bar", "baz", "graph"}, }, @@ -45,7 +45,7 @@ var parseTests = []struct { input: `[ {"subject": "foo", "predicate": "bar", "object": "foo", "something_else": "extra data"} ]`, - expect: []*quad.Quad{ + expect: []quad.Quad{ {"foo", "bar", "foo", ""}, }, err: nil, @@ -56,7 +56,7 @@ var parseTests = []struct { {"subject": "foo", "predicate": "bar"} ]`, expect: nil, - err: fmt.Errorf("Invalid triple at index %d. %v", 0, &quad.Quad{"foo", "bar", "", ""}), + err: fmt.Errorf("Invalid triple at index %d. %v", 0, quad.Quad{"foo", "bar", "", ""}), }, } diff --git a/http/write.go b/http/write.go index 7ad205b..f810941 100644 --- a/http/write.go +++ b/http/write.go @@ -29,8 +29,8 @@ import ( "github.com/google/cayley/quad/nquads" ) -func ParseJsonToTripleList(jsonBody []byte) ([]*quad.Quad, error) { - var tripleList []*quad.Quad +func ParseJsonToTripleList(jsonBody []byte) ([]quad.Quad, error) { + var tripleList []quad.Quad err := json.Unmarshal(jsonBody, &tripleList) if err != nil { return nil, err @@ -83,7 +83,7 @@ func (api *Api) ServeV1WriteNQuad(w http.ResponseWriter, r *http.Request, params var ( n int - block = make([]*quad.Quad, 0, blockSize) + block = make([]quad.Quad, 0, blockSize) ) for { t, err := dec.Unmarshal() diff --git a/quad/cquads/cquads.go b/quad/cquads/cquads.go index c3355ed..5045a96 100644 --- a/quad/cquads/cquads.go +++ b/quad/cquads/cquads.go @@ -34,9 +34,9 @@ import ( // Parse returns a valid quad.Quad or a non-nil error. Parse does // handle comments except where the comment placement does not prevent // a complete valid quad.Quad from being defined. -func Parse(str string) (*quad.Quad, error) { +func Parse(str string) (quad.Quad, error) { q, err := parse([]rune(str)) - return &q, err + return q, err } // Decoder implements simplified N-Quad document parsing. @@ -52,14 +52,14 @@ func NewDecoder(r io.Reader) *Decoder { } // Unmarshal returns the next valid N-Quad as a quad.Quad, or an error. -func (dec *Decoder) Unmarshal() (*quad.Quad, error) { +func (dec *Decoder) Unmarshal() (quad.Quad, error) { dec.line = dec.line[:0] var line []byte for { for { l, pre, err := dec.r.ReadLine() if err != nil { - return nil, err + return quad.Quad{}, err } dec.line = append(dec.line, l...) if !pre { @@ -73,9 +73,9 @@ func (dec *Decoder) Unmarshal() (*quad.Quad, error) { } triple, err := Parse(string(line)) if err != nil { - return nil, fmt.Errorf("failed to parse %q: %v", dec.line, err) + return quad.Quad{}, fmt.Errorf("failed to parse %q: %v", dec.line, err) } - if triple == nil { + if !triple.IsValid() { return dec.Unmarshal() } return triple, nil diff --git a/quad/cquads/cquads_test.go b/quad/cquads/cquads_test.go index 8c4f3ba..8d12ca7 100644 --- a/quad/cquads/cquads_test.go +++ b/quad/cquads/cquads_test.go @@ -31,7 +31,7 @@ import ( var testNTriples = []struct { message string input string - expect *quad.Quad + expect quad.Quad err error }{ // Tests from original nquads. @@ -40,7 +40,7 @@ var testNTriples = []struct { { message: "parse simple triples", input: "this is valid .", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "this", Predicate: "is", Object: "valid", @@ -50,7 +50,7 @@ var testNTriples = []struct { { message: "parse quoted triples", input: `this is "valid too" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "this", Predicate: "is", Object: "valid too", @@ -60,7 +60,7 @@ var testNTriples = []struct { { message: "parse escaped quoted triples", input: `he said "\"That's all folks\"" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "he", Predicate: "said", Object: `"That's all folks"`, @@ -70,7 +70,7 @@ var testNTriples = []struct { { message: "parse an example real triple", input: `":/guid/9202a8c04000641f80000000010c843c" "name" "George Morris" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: ":/guid/9202a8c04000641f80000000010c843c", Predicate: "name", Object: "George Morris", @@ -80,7 +80,7 @@ var testNTriples = []struct { { message: "parse a pathologically spaced triple", input: "foo is \"\\tA big tough\\r\\nDeal\\\\\" .", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "foo", Predicate: "is", Object: "\tA big tough\r\nDeal\\", @@ -92,7 +92,7 @@ var testNTriples = []struct { { message: "parse a simple quad", input: "this is valid quad .", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "this", Predicate: "is", Object: "valid", @@ -102,7 +102,7 @@ var testNTriples = []struct { { message: "parse a quoted quad", input: `this is valid "quad thing" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "this", Predicate: "is", Object: "valid", @@ -112,7 +112,7 @@ var testNTriples = []struct { { message: "parse crazy escaped quads", input: `"\"this" "\"is" "\"valid" "\"quad thing".`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: `"this`, Predicate: `"is`, Object: `"valid`, @@ -124,7 +124,7 @@ var testNTriples = []struct { { message: "handle simple case with comments", input: " . # comment", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example/s", Predicate: "http://example/p", Object: "http://example/o", @@ -134,7 +134,7 @@ var testNTriples = []struct { { message: "handle simple case with comments", input: " _:o . # comment", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example/s", Predicate: "http://example/p", Object: "_:o", @@ -144,7 +144,7 @@ var testNTriples = []struct { { message: "handle simple case with comments", input: " \"o\" . # comment", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example/s", Predicate: "http://example/p", Object: "o", @@ -154,7 +154,7 @@ var testNTriples = []struct { { message: "handle simple case with comments", input: " \"o\"^^ . # comment", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example/s", Predicate: "http://example/p", Object: `"o"^^`, @@ -164,7 +164,7 @@ var testNTriples = []struct { { message: "handle simple case with comments", input: " \"o\"@en . # comment", - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example/s", Predicate: "http://example/p", Object: `"o"@en`, @@ -177,7 +177,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: `_:100000 . # example from 30movies`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:100000", Predicate: "/film/performance/actor", Object: "/en/larry_fine_1902", @@ -189,7 +189,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: `_:10011 "Tomás de Torquemada" . # example from 30movies with unicode`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:10011", Predicate: "/film/performance/character", Object: "Tomás de Torquemada", @@ -202,7 +202,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: ` . # comments here`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://one.example/subject1", Predicate: "http://one.example/predicate1", Object: "http://one.example/object1", @@ -213,7 +213,7 @@ var testNTriples = []struct { { message: "parse triple with blank subject node, literal object and no comment (1)", input: `_:subject1 "object1" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject1", Predicate: "http://an.example/predicate1", Object: "object1", @@ -224,7 +224,7 @@ var testNTriples = []struct { { message: "parse triple with blank subject node, literal object and no comment (2)", input: `_:subject2 "object2" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject2", Predicate: "http://an.example/predicate2", Object: "object2", @@ -237,7 +237,7 @@ var testNTriples = []struct { { message: "parse triple with three IRIREFs", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/#spiderman", Predicate: "http://www.perceive.net/schemas/relationship/enemyOf", Object: "http://example.org/#green-goblin", @@ -250,7 +250,7 @@ var testNTriples = []struct { { message: "parse triple with blank node labelled subject and object and IRIREF predicate (1)", input: `_:alice _:bob .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:alice", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "_:bob", @@ -261,7 +261,7 @@ var testNTriples = []struct { { message: "parse triple with blank node labelled subject and object and IRIREF predicate (2)", input: `_:bob _:alice .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:bob", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "_:alice", @@ -274,7 +274,7 @@ var testNTriples = []struct { { message: "parse quad with commment", input: ` . # comments here`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://one.example/subject1", Predicate: "http://one.example/predicate1", Object: "http://one.example/object1", @@ -285,7 +285,7 @@ var testNTriples = []struct { { message: "parse quad with blank subject node, literal object, IRIREF predicate and label, and no comment (1)", input: `_:subject1 "object1" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject1", Predicate: "http://an.example/predicate1", Object: "object1", @@ -296,7 +296,7 @@ var testNTriples = []struct { { message: "parse quad with blank subject node, literal object, IRIREF predicate and label, and no comment (2)", input: `_:subject2 "object2" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject2", Predicate: "http://an.example/predicate2", Object: "object2", @@ -309,7 +309,7 @@ var testNTriples = []struct { { message: "parse quad with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/#spiderman", Predicate: "http://www.perceive.net/schemas/relationship/enemyOf", Object: "http://example.org/#green-goblin", @@ -322,7 +322,7 @@ var testNTriples = []struct { { message: "parse quad with blank node labelled subject and object and IRIREF predicate and label (1)", input: `_:alice _:bob .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:alice", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "_:bob", @@ -333,7 +333,7 @@ var testNTriples = []struct { { message: "parse quad with blank node labelled subject and object and IRIREF predicate and label (2)", input: `_:bob _:alice .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:bob", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "_:alice", @@ -346,7 +346,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", Object: "http://xmlns.com/foaf/0.1/Person", @@ -357,7 +357,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "http://example.org/alice#me", @@ -368,7 +368,7 @@ var testNTriples = []struct { { message: "parse triple with IRIREF schema on literal object", input: ` "1990-07-04"^^ .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://schema.org/birthDate", Object: `"1990-07-04"^^`, @@ -379,7 +379,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in triple", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://xmlns.com/foaf/0.1/topic_interest", Object: "http://www.wikidata.org/entity/Q12418", @@ -390,7 +390,7 @@ var testNTriples = []struct { { message: "parse triple with literal subject", input: ` "Mona Lisa" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://www.wikidata.org/entity/Q12418", Predicate: "http://purl.org/dc/terms/title", Object: "Mona Lisa", @@ -401,7 +401,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://www.wikidata.org/entity/Q12418", Predicate: "http://purl.org/dc/terms/creator", Object: "http://dbpedia.org/resource/Leonardo_da_Vinci", @@ -412,7 +412,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619", Predicate: "http://purl.org/dc/terms/subject", Object: "http://www.wikidata.org/entity/Q12418", @@ -425,7 +425,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in quad (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", Object: "http://xmlns.com/foaf/0.1/Person", @@ -436,7 +436,7 @@ var testNTriples = []struct { { message: "parse quad with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://xmlns.com/foaf/0.1/knows", Object: "http://example.org/alice#me", @@ -447,7 +447,7 @@ var testNTriples = []struct { { message: "parse quad with IRIREF schema on literal object", input: ` "1990-07-04"^^ .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://schema.org/birthDate", Object: `"1990-07-04"^^`, @@ -458,7 +458,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in quad (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://xmlns.com/foaf/0.1/topic_interest", Object: "http://www.wikidata.org/entity/Q12418", @@ -469,7 +469,7 @@ var testNTriples = []struct { { message: "parse literal object and colon qualified label in quad", input: ` "Mona Lisa" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://www.wikidata.org/entity/Q12418", Predicate: "http://purl.org/dc/terms/title", Object: "Mona Lisa", @@ -480,7 +480,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts with colon qualified label in quad (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://www.wikidata.org/entity/Q12418", Predicate: "http://purl.org/dc/terms/creator", Object: "http://dbpedia.org/resource/Leonardo_da_Vinci", @@ -491,7 +491,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts with colon qualified label in quad (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619", Predicate: "http://purl.org/dc/terms/subject", Object: "http://www.wikidata.org/entity/Q12418", @@ -502,7 +502,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts (quad section - 1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob", Predicate: "http://purl.org/dc/terms/publisher", Object: "http://example.org", @@ -513,7 +513,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts (quad section - 2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob", Predicate: "http://purl.org/dc/terms/rights", Object: "http://creativecommons.org/licenses/by/3.0/", @@ -526,31 +526,31 @@ var testNTriples = []struct { { message: "parse empty", input: ``, - expect: &quad.Quad{}, + expect: quad.Quad{}, err: quad.ErrIncomplete, }, { message: "parse commented", input: `# is a comment`, - expect: &quad.Quad{}, + expect: quad.Quad{}, err: fmt.Errorf("%v: unexpected rune '#' at 0", quad.ErrInvalid), }, { message: "parse commented internal (1)", input: `is # a comment`, - expect: &quad.Quad{Subject: "is"}, + expect: quad.Quad{Subject: "is"}, err: fmt.Errorf("%v: unexpected rune '#' at 3", quad.ErrInvalid), }, { message: "parse commented internal (2)", input: `is a # comment`, - expect: &quad.Quad{Subject: "is", Predicate: "a"}, + expect: quad.Quad{Subject: "is", Predicate: "a"}, err: fmt.Errorf("%v: unexpected rune '#' at 5", quad.ErrInvalid), }, { message: "parse incomplete quad (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", Object: "", @@ -561,7 +561,7 @@ var testNTriples = []struct { { message: "parse incomplete quad (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "http://example.org/bob#me", Predicate: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", Object: "", @@ -773,7 +773,7 @@ func TestUnescape(t *testing.T) { } } -var result *quad.Quad +var result quad.Quad func BenchmarkParser(b *testing.B) { for n := 0; n < b.N; n++ { diff --git a/quad/nquads/nquads.go b/quad/nquads/nquads.go index 5d54e1d..7b27d7e 100644 --- a/quad/nquads/nquads.go +++ b/quad/nquads/nquads.go @@ -33,9 +33,9 @@ import ( // Parse returns a valid quad.Quad or a non-nil error. Parse does // handle comments except where the comment placement does not prevent // a complete valid quad.Quad from being defined. -func Parse(str string) (*quad.Quad, error) { +func Parse(str string) (quad.Quad, error) { q, err := parse([]rune(str)) - return &q, err + return q, err } // Decoder implements N-Quad document parsing according to the RDF @@ -52,14 +52,14 @@ func NewDecoder(r io.Reader) *Decoder { } // Unmarshal returns the next valid N-Quad as a quad.Quad, or an error. -func (dec *Decoder) Unmarshal() (*quad.Quad, error) { +func (dec *Decoder) Unmarshal() (quad.Quad, error) { dec.line = dec.line[:0] var line []byte for { for { l, pre, err := dec.r.ReadLine() if err != nil { - return nil, err + return quad.Quad{}, err } dec.line = append(dec.line, l...) if !pre { @@ -73,9 +73,9 @@ func (dec *Decoder) Unmarshal() (*quad.Quad, error) { } triple, err := Parse(string(line)) if err != nil { - return nil, fmt.Errorf("failed to parse %q: %v", dec.line, err) + return quad.Quad{}, fmt.Errorf("failed to parse %q: %v", dec.line, err) } - if triple == nil { + if !triple.IsValid() { return dec.Unmarshal() } return triple, nil diff --git a/quad/nquads/nquads_test.go b/quad/nquads/nquads_test.go index fc7b70a..aaac549 100644 --- a/quad/nquads/nquads_test.go +++ b/quad/nquads/nquads_test.go @@ -31,7 +31,7 @@ import ( var testNTriples = []struct { message string input string - expect *quad.Quad + expect quad.Quad err error }{ // Tests taken from http://www.w3.org/TR/n-quads/ and http://www.w3.org/TR/n-triples/. @@ -40,7 +40,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: `_:100000 . # example from 30movies`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:100000", Predicate: "", Object: "", @@ -52,7 +52,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: `_:10011 "Tomás de Torquemada" . # example from 30movies with unicode`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:10011", Predicate: "", Object: `"Tomás de Torquemada"`, @@ -65,7 +65,7 @@ var testNTriples = []struct { { message: "parse triple with commment", input: ` . # comments here`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -76,7 +76,7 @@ var testNTriples = []struct { { message: "parse triple with blank subject node, literal object and no comment (1)", input: `_:subject1 "object1" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject1", Predicate: "", Object: `"object1"`, @@ -87,7 +87,7 @@ var testNTriples = []struct { { message: "parse triple with blank subject node, literal object and no comment (2)", input: `_:subject2 "object2" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject2", Predicate: "", Object: `"object2"`, @@ -100,7 +100,7 @@ var testNTriples = []struct { { message: "parse triple with three IRIREFs", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -113,7 +113,7 @@ var testNTriples = []struct { { message: "parse triple with blank node labelled subject and object and IRIREF predicate (1)", input: `_:alice _:bob .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:alice", Predicate: "", Object: "_:bob", @@ -124,7 +124,7 @@ var testNTriples = []struct { { message: "parse triple with blank node labelled subject and object and IRIREF predicate (2)", input: `_:bob _:alice .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:bob", Predicate: "", Object: "_:alice", @@ -137,7 +137,7 @@ var testNTriples = []struct { { message: "parse quad with commment", input: ` . # comments here`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -148,7 +148,7 @@ var testNTriples = []struct { { message: "parse quad with blank subject node, literal object, IRIREF predicate and label, and no comment (1)", input: `_:subject1 "object1" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject1", Predicate: "", Object: `"object1"`, @@ -159,7 +159,7 @@ var testNTriples = []struct { { message: "parse quad with blank subject node, literal object, IRIREF predicate and label, and no comment (2)", input: `_:subject2 "object2" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:subject2", Predicate: "", Object: `"object2"`, @@ -172,7 +172,7 @@ var testNTriples = []struct { { message: "parse quad with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -185,7 +185,7 @@ var testNTriples = []struct { { message: "parse quad with blank node labelled subject and object and IRIREF predicate and label (1)", input: `_:alice _:bob .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:alice", Predicate: "", Object: "_:bob", @@ -196,7 +196,7 @@ var testNTriples = []struct { { message: "parse quad with blank node labelled subject and object and IRIREF predicate and label (2)", input: `_:bob _:alice .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "_:bob", Predicate: "", Object: "_:alice", @@ -209,7 +209,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -220,7 +220,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -231,7 +231,7 @@ var testNTriples = []struct { { message: "parse triple with IRIREF schema on literal object", input: ` "1990-07-04"^^ .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: `"1990-07-04"^^`, @@ -242,7 +242,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in triple", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -253,7 +253,7 @@ var testNTriples = []struct { { message: "parse triple with literal subject", input: ` "Mona Lisa" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: `"Mona Lisa"`, @@ -264,7 +264,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -275,7 +275,7 @@ var testNTriples = []struct { { message: "parse triple with all IRIREF parts (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -288,7 +288,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in quad (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -299,7 +299,7 @@ var testNTriples = []struct { { message: "parse quad with all IRIREF parts", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -310,7 +310,7 @@ var testNTriples = []struct { { message: "parse quad with IRIREF schema on literal object", input: ` "1990-07-04"^^ .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: `"1990-07-04"^^`, @@ -321,7 +321,7 @@ var testNTriples = []struct { { message: "parse commented IRIREF in quad (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -332,7 +332,7 @@ var testNTriples = []struct { { message: "parse literal object and colon qualified label in quad", input: ` "Mona Lisa" .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: `"Mona Lisa"`, @@ -343,7 +343,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts with colon qualified label in quad (1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -354,7 +354,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts with colon qualified label in quad (2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -365,7 +365,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts (quad section - 1)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -376,7 +376,7 @@ var testNTriples = []struct { { message: "parse all IRIREF parts (quad section - 2)", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -389,19 +389,19 @@ var testNTriples = []struct { { message: "parse empty", input: ``, - expect: &quad.Quad{}, + expect: quad.Quad{}, err: quad.ErrIncomplete, }, { message: "parse commented", input: `# comment`, - expect: &quad.Quad{}, + expect: quad.Quad{}, err: fmt.Errorf("%v: unexpected rune '#' at 0", quad.ErrInvalid), }, { message: "parse incomplete quad", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -412,7 +412,7 @@ var testNTriples = []struct { { message: "parse incomplete quad", input: ` .`, - expect: &quad.Quad{ + expect: quad.Quad{ Subject: "", Predicate: "", Object: "", @@ -580,7 +580,7 @@ func TestUnescape(t *testing.T) { } } -var result *quad.Quad +var result quad.Quad func BenchmarkParser(b *testing.B) { for n := 0; n < b.N; n++ { diff --git a/quad/quad.go b/quad/quad.go index 3e9943b..2f172c3 100644 --- a/quad/quad.go +++ b/quad/quad.go @@ -104,7 +104,7 @@ func (d Direction) String() string { // instead of the pointer. This needs benchmarking to make the decision. // Per-field accessor for triples -func (q *Quad) Get(d Direction) string { +func (q Quad) Get(d Direction) string { switch d { case Subject: return q.Subject @@ -119,16 +119,16 @@ func (q *Quad) Get(d Direction) string { } } -func (q *Quad) Equals(o *Quad) bool { - return *q == *o +func (q Quad) Equals(o Quad) bool { + return q == o } // Pretty-prints a triple. -func (q *Quad) String() string { +func (q Quad) String() string { return fmt.Sprintf("%s -- %s -> %s", q.Subject, q.Predicate, q.Object) } -func (q *Quad) IsValid() bool { +func (q Quad) IsValid() bool { return q.Subject != "" && q.Predicate != "" && q.Object != "" } @@ -137,7 +137,7 @@ func (q *Quad) IsValid() bool { // from nquads to here to provide UnmarshalText(text []byte) error. // Prints a triple in N-Quad format. -func (q *Quad) NTriple() string { +func (q Quad) NTriple() string { if q.Label == "" { //TODO(barakmich): Proper escaping. return fmt.Sprintf("%s %s %s .", q.Subject, q.Predicate, q.Object) @@ -147,5 +147,5 @@ func (q *Quad) NTriple() string { } type Unmarshaler interface { - Unmarshal() (*Quad, error) + Unmarshal() (Quad, error) } diff --git a/query/gremlin/gremlin_test.go b/query/gremlin/gremlin_test.go index dbd115a..a638eb7 100644 --- a/query/gremlin/gremlin_test.go +++ b/query/gremlin/gremlin_test.go @@ -38,7 +38,7 @@ import ( // \-->|#D#|------------->+---+ // +---+ // -var simpleGraph = []*quad.Quad{ +var simpleGraph = []quad.Quad{ {"A", "follows", "B", ""}, {"C", "follows", "B", ""}, {"C", "follows", "D", ""}, @@ -52,7 +52,7 @@ var simpleGraph = []*quad.Quad{ {"G", "status", "cool", "status_graph"}, } -func makeTestSession(data []*quad.Quad) *Session { +func makeTestSession(data []quad.Quad) *Session { ts, _ := graph.NewTripleStore("memstore", "", nil) for _, t := range data { ts.AddTriple(t) @@ -246,7 +246,7 @@ var testQueries = []struct { }, } -func runQueryGetTag(g []*quad.Quad, query string, tag string) []string { +func runQueryGetTag(g []quad.Quad, query string, tag string) []string { js := makeTestSession(g) c := make(chan interface{}, 5) js.ExecInput(query, c, -1) diff --git a/query/mql/mql_test.go b/query/mql/mql_test.go index 6be480e..619ae54 100644 --- a/query/mql/mql_test.go +++ b/query/mql/mql_test.go @@ -37,7 +37,7 @@ import ( // \-->|#D#|------------->+---+ // +---+ // -var simpleGraph = []*quad.Quad{ +var simpleGraph = []quad.Quad{ {"A", "follows", "B", ""}, {"C", "follows", "B", ""}, {"C", "follows", "D", ""}, @@ -51,7 +51,7 @@ var simpleGraph = []*quad.Quad{ {"G", "status", "cool", "status_graph"}, } -func makeTestSession(data []*quad.Quad) *Session { +func makeTestSession(data []quad.Quad) *Session { ts, _ := graph.NewTripleStore("memstore", "", nil) for _, t := range data { ts.AddTriple(t) @@ -165,7 +165,7 @@ var testQueries = []struct { }, } -func runQuery(g []*quad.Quad, query string) interface{} { +func runQuery(g []quad.Quad, query string) interface{} { s := makeTestSession(g) c := make(chan interface{}, 5) go s.ExecInput(query, c, -1) diff --git a/query/sexp/parser_test.go b/query/sexp/parser_test.go index e7e66bf..ed4776a 100644 --- a/query/sexp/parser_test.go +++ b/query/sexp/parser_test.go @@ -32,21 +32,21 @@ func TestBadParse(t *testing.T) { var testQueries = []struct { message string - add *quad.Quad + add quad.Quad query string typ graph.Type expect string }{ { message: "get a single triple linkage", - add: &quad.Quad{"i", "can", "win", ""}, + add: quad.Quad{"i", "can", "win", ""}, query: "($a (:can \"win\"))", typ: graph.And, expect: "i", }, { message: "get a single triple linkage", - add: &quad.Quad{"i", "can", "win", ""}, + add: quad.Quad{"i", "can", "win", ""}, query: "(\"i\" (:can $a))", typ: graph.And, expect: "i", @@ -60,7 +60,7 @@ func TestMemstoreBackedSexp(t *testing.T) { t.Errorf(`Incorrect type for empty query, got:%q expect: "null"`, it.Type()) } for _, test := range testQueries { - if test.add != nil { + if test.add.IsValid() { ts.AddTriple(test.add) } it := BuildIteratorTreeForQuery(ts, test.query) @@ -79,8 +79,8 @@ func TestMemstoreBackedSexp(t *testing.T) { func TestTreeConstraintParse(t *testing.T) { ts, _ := graph.NewTripleStore("memstore", "", nil) - ts.AddTriple(&quad.Quad{"i", "like", "food", ""}) - ts.AddTriple(&quad.Quad{"food", "is", "good", ""}) + ts.AddTriple(quad.Quad{"i", "like", "food", ""}) + ts.AddTriple(quad.Quad{"food", "is", "good", ""}) query := "(\"i\"\n" + "(:like\n" + "($a (:is :good))))" @@ -99,8 +99,8 @@ func TestTreeConstraintParse(t *testing.T) { func TestTreeConstraintTagParse(t *testing.T) { ts, _ := graph.NewTripleStore("memstore", "", nil) - ts.AddTriple(&quad.Quad{"i", "like", "food", ""}) - ts.AddTriple(&quad.Quad{"food", "is", "good", ""}) + ts.AddTriple(quad.Quad{"i", "like", "food", ""}) + ts.AddTriple(quad.Quad{"food", "is", "good", ""}) query := "(\"i\"\n" + "(:like\n" + "($a (:is :good))))" @@ -119,7 +119,7 @@ func TestTreeConstraintTagParse(t *testing.T) { func TestMultipleConstraintParse(t *testing.T) { ts, _ := graph.NewTripleStore("memstore", "", nil) - for _, tv := range []*quad.Quad{ + for _, tv := range []quad.Quad{ {"i", "like", "food", ""}, {"i", "like", "beer", ""}, {"you", "like", "beer", ""},