Documentation ¶
Overview ¶
Package peripheral provides a secondary index layer for badger key-value store - see examples.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var (
ErrNoIndexNameProvided = fmt.Errorf("no index name provided")
)
error
Functions ¶
Types ¶
type Index ¶
type Index struct {
// contains filtered or unexported fields
}
Index .
func NewIndex ¶
NewIndex .
Example ¶
db := createDB("", false) defer db.Close() indexTags := NewIndex("tags", func(key, val []byte) (entries []IndexEntry, err error) { var p comment json.Unmarshal(val, &p) if len(p.Tags) == 0 { return } for _, v := range p.Tags { entries = append(entries, IndexEntry{Index: []byte(v)}) } return }) indexBy := NewIndex("tags", func(key, val []byte) (entries []IndexEntry, err error) { var p comment json.Unmarshal(val, &p) if p.By == "" { return } entries = append(entries, IndexEntry{Index: []byte(p.By)}) return }) sampleIndexBuilder := func(txn *layer.Txn, entries map[string][]byte) error { for k, v := range entries { // all indexes must be built here, // based on document type (v), etc, etc. if err := Emit(txn, indexTags, []byte(k), v); err != nil { return err } if err := Emit(txn, indexBy, []byte(k), v); err != nil { return err } } return nil } func() { cmnt := comment{ ID: "CMNT::001", By: "Frodo Baggins", Text: "Hi!", At: time.Now(), Tags: []string{"tech", "golang"}, } js, err := json.Marshal(cmnt) fmt.Println(err) txn := db.NewTransaction(true) defer txn.Discard() fmt.Println(txn.Set([]byte(cmnt.ID), js)) err = txn.CommitWith(sampleIndexBuilder, nil) fmt.Println(err) }()
Output: <nil> <nil> <nil>
type Res ¶
Res .
func QueryIndex ¶
func QueryIndex(params Q, txn *layer.Txn, forIndexedKeys ...bool) (reslist []Res, rescount int, reserr error)
QueryIndex .
Example ¶
db := createDB("", false) defer db.Close() check := func(err interface{}) { if err == nil { return } panic(err) } indexTags := NewIndex("tags", func(key, val []byte) (entries []IndexEntry, err error) { var p comment if err := json.Unmarshal(val, &p); err != nil { return nil, err } if len(p.Tags) == 0 { return } for _, v := range p.Tags { entries = append(entries, IndexEntry{Index: []byte(v)}) } return }) indexBy := NewIndex("by", func(key, val []byte) (entries []IndexEntry, err error) { var p comment if err := json.Unmarshal(val, &p); err != nil { return nil, err } if p.By == "" { return } entries = append(entries, IndexEntry{Index: []byte(p.By)}) return }) sampleIndexBuilder := func(txn *layer.Txn, entries map[string][]byte) error { for k, v := range entries { // all indexes must be built here, // based on document type (v), etc, etc. if err := Emit(txn, indexTags, []byte(k), v); err != nil { return err } if err := Emit(txn, indexBy, []byte(k), v); err != nil { return err } } return nil } func() { cmnt := comment{ ID: "CMNT::001", By: "Frodo Baggins", Text: "Hi!", At: time.Now(), Tags: []string{"nosql"}, } js, err := json.Marshal(cmnt) check(err) txn := db.NewTransaction(true) defer txn.Discard() check(txn.Set([]byte(cmnt.ID), js)) err = txn.CommitWith(sampleIndexBuilder, nil) check(err) }() func() { cmnt := comment{ ID: "CMNT::002", By: "Frodo Baggins", Text: "Hi!", At: time.Now(), Tags: []string{"nosql", "golang"}, } js, err := json.Marshal(cmnt) check(err) txn := db.NewTransaction(true) defer txn.Discard() check(txn.Set([]byte(cmnt.ID), js)) err = txn.CommitWith(sampleIndexBuilder, nil) check(err) }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "tags", Start: []byte("nosql"), Prefix: []byte("nosql")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "tags", Start: []byte("golang"), Prefix: []byte("golang")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "by", Start: []byte("Frodo Baggins"), Prefix: []byte("Frodo Baggins")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }()
Output: 2 CMNT::001 CMNT::001 nosql CMNT::002 CMNT::002 nosql 1 CMNT::002 CMNT::002 golang 2 CMNT::001 CMNT::001 Frodo Baggins CMNT::002 CMNT::002 Frodo Baggins
Example (With) ¶
db := createDB("", false) defer db.Close() check := func(err interface{}) { if err == nil { return } panic(err) } indexTags := NewIndex("tags", func(key, val []byte) (entries []IndexEntry, err error) { var p comment if err := json.Unmarshal(val, &p); err != nil { return nil, err } if len(p.Tags) == 0 { return } for _, v := range p.Tags { entries = append(entries, IndexEntry{Index: []byte(v)}) } return }) indexBy := NewIndex("by", func(key, val []byte) (entries []IndexEntry, err error) { var p comment if err := json.Unmarshal(val, &p); err != nil { return nil, err } if p.By == "" { return } entries = append(entries, IndexEntry{Index: []byte(p.By)}) return }) sampleIndexBuilder := func(txn *layer.Txn, entries map[string][]byte) error { for k, v := range entries { // all indexes must be built here, // based on document type (v), etc, etc. if err := Emit(txn, indexTags, []byte(k), v); err != nil { return err } if err := Emit(txn, indexBy, []byte(k), v); err != nil { return err } } return nil } func() { cmnt := comment{ ID: "CMNT::001", By: "Frodo Baggins", Text: "Hi!", At: time.Now(), Tags: []string{"nosql"}, } js, err := json.Marshal(cmnt) check(err) err = db.UpdateWith(func(txn *layer.Txn) error { return txn.Set([]byte(cmnt.ID), js) }, sampleIndexBuilder) check(err) }() func() { cmnt := comment{ ID: "CMNT::002", By: "Frodo Baggins", Text: "Hi!", At: time.Now(), Tags: []string{"nosql", "golang"}, } js, err := json.Marshal(cmnt) check(err) err = db.UpdateWith(func(txn *layer.Txn) error { return txn.Set([]byte(cmnt.ID), js) }, sampleIndexBuilder) check(err) }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "tags", Start: []byte("nosql"), Prefix: []byte("nosql")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "tags", Start: []byte("golang"), Prefix: []byte("golang")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }() func() { got := make(map[string]Res) err := db.View(func(txn *layer.Txn) error { r, _, err := QueryIndex(Q{Index: "by", Start: []byte("Frodo Baggins"), Prefix: []byte("Frodo Baggins")}, txn) if err != nil { return err } for _, v := range r { got[string(v.Key)] = v } return nil }) check(err) fmt.Println(len(got)) var keys []string for k := range got { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { v := got[k] fmt.Println(k) fmt.Println(string(v.Key)) fmt.Println(string(v.Index)) } }()
Output: 2 CMNT::001 CMNT::001 nosql CMNT::002 CMNT::002 nosql 1 CMNT::002 CMNT::002 golang 2 CMNT::001 CMNT::001 Frodo Baggins CMNT::002 CMNT::002 Frodo Baggins
Click to show internal directories.
Click to hide internal directories.