added KVReader.MultiGet() method
This commit is contained in:
parent
8dc067b1d9
commit
fb048f6c64
|
@ -30,6 +30,10 @@ func (r *Reader) Get(key []byte) ([]byte, error) {
|
||||||
return rv, nil
|
return rv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
|
||||||
|
return store.MultiGet(r, keys)
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
|
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
|
||||||
cursor := r.bucket.Cursor()
|
cursor := r.bucket.Cursor()
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (r *Reader) Get(key []byte) ([]byte, error) {
|
||||||
return b, err
|
return b, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
|
||||||
|
return store.MultiGet(r, keys)
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
|
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
|
||||||
byteRange := util.BytesPrefix(prefix)
|
byteRange := util.BytesPrefix(prefix)
|
||||||
iter := r.snapshot.NewIterator(byteRange, r.store.defaultReadOptions)
|
iter := r.snapshot.NewIterator(byteRange, r.store.defaultReadOptions)
|
||||||
|
|
|
@ -35,6 +35,10 @@ func (w *Reader) Get(k []byte) (v []byte, err error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
|
||||||
|
return store.MultiGet(r, keys)
|
||||||
|
}
|
||||||
|
|
||||||
func (w *Reader) PrefixIterator(k []byte) store.KVIterator {
|
func (w *Reader) PrefixIterator(k []byte) store.KVIterator {
|
||||||
rv := Iterator{
|
rv := Iterator{
|
||||||
t: w.t,
|
t: w.t,
|
||||||
|
|
|
@ -40,6 +40,9 @@ type KVReader interface {
|
||||||
// The caller owns the bytes returned.
|
// The caller owns the bytes returned.
|
||||||
Get(key []byte) ([]byte, error)
|
Get(key []byte) ([]byte, error)
|
||||||
|
|
||||||
|
// MultiGet retrieves multiple values in one call.
|
||||||
|
MultiGet(keys [][]byte) ([][]byte, error)
|
||||||
|
|
||||||
// PrefixIterator returns a KVIterator that will
|
// PrefixIterator returns a KVIterator that will
|
||||||
// visit all K/V pairs with the provided prefix
|
// visit all K/V pairs with the provided prefix
|
||||||
PrefixIterator(prefix []byte) KVIterator
|
PrefixIterator(prefix []byte) KVIterator
|
||||||
|
|
|
@ -17,6 +17,16 @@ func (r *Reader) Get(key []byte) (v []byte, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) MultiGet(keys [][]byte) (vals [][]byte, err error) {
|
||||||
|
r.s.TimerReaderMultiGet.Time(func() {
|
||||||
|
vals, err = r.o.MultiGet(keys)
|
||||||
|
if err != nil {
|
||||||
|
r.s.AddError("Reader.MultiGet", err, nil)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Reader) PrefixIterator(prefix []byte) (i store.KVIterator) {
|
func (r *Reader) PrefixIterator(prefix []byte) (i store.KVIterator) {
|
||||||
r.s.TimerReaderPrefixIterator.Time(func() {
|
r.s.TimerReaderPrefixIterator.Time(func() {
|
||||||
i = &Iterator{s: r.s, o: r.o.PrefixIterator(prefix)}
|
i = &Iterator{s: r.s, o: r.o.PrefixIterator(prefix)}
|
||||||
|
|
|
@ -33,6 +33,7 @@ type Store struct {
|
||||||
o store.KVStore
|
o store.KVStore
|
||||||
|
|
||||||
TimerReaderGet metrics.Timer
|
TimerReaderGet metrics.Timer
|
||||||
|
TimerReaderMultiGet metrics.Timer
|
||||||
TimerReaderPrefixIterator metrics.Timer
|
TimerReaderPrefixIterator metrics.Timer
|
||||||
TimerReaderRangeIterator metrics.Timer
|
TimerReaderRangeIterator metrics.Timer
|
||||||
TimerWriterExecuteBatch metrics.Timer
|
TimerWriterExecuteBatch metrics.Timer
|
||||||
|
@ -71,6 +72,7 @@ func New(mo store.MergeOperator, config map[string]interface{}) (store.KVStore,
|
||||||
o: kvs,
|
o: kvs,
|
||||||
|
|
||||||
TimerReaderGet: metrics.NewTimer(),
|
TimerReaderGet: metrics.NewTimer(),
|
||||||
|
TimerReaderMultiGet: metrics.NewTimer(),
|
||||||
TimerReaderPrefixIterator: metrics.NewTimer(),
|
TimerReaderPrefixIterator: metrics.NewTimer(),
|
||||||
TimerReaderRangeIterator: metrics.NewTimer(),
|
TimerReaderRangeIterator: metrics.NewTimer(),
|
||||||
TimerWriterExecuteBatch: metrics.NewTimer(),
|
TimerWriterExecuteBatch: metrics.NewTimer(),
|
||||||
|
@ -141,6 +143,11 @@ func (s *Store) WriteJSON(w io.Writer) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
WriteTimerJSON(w, s.TimerReaderGet)
|
WriteTimerJSON(w, s.TimerReaderGet)
|
||||||
|
_, err = w.Write([]byte(`,"TimerReaderMultiGet":`))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
WriteTimerJSON(w, s.TimerReaderMultiGet)
|
||||||
_, err = w.Write([]byte(`,"TimerReaderPrefixIterator":`))
|
_, err = w.Write([]byte(`,"TimerReaderPrefixIterator":`))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
|
28
index/store/multiget.go
Normal file
28
index/store/multiget.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright (c) 2016 Couchbase, Inc.
|
||||||
|
// 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 store
|
||||||
|
|
||||||
|
// MultiGet is a helper function to retrieve mutiple keys from a
|
||||||
|
// KVReader, and might be used by KVStore implementations that don't
|
||||||
|
// have a native multi-get facility.
|
||||||
|
func MultiGet(kvreader KVReader, keys [][]byte) ([][]byte, error) {
|
||||||
|
vals := make([][]byte, 0, len(keys))
|
||||||
|
|
||||||
|
for i, key := range keys {
|
||||||
|
val, err := kvreader.Get(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
vals[i] = val
|
||||||
|
}
|
||||||
|
|
||||||
|
return vals, nil
|
||||||
|
}
|
|
@ -40,6 +40,10 @@ func (r *reader) Get(key []byte) ([]byte, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *reader) MultiGet(keys [][]byte) ([][]byte, error) {
|
||||||
|
return make([][]byte, len(keys)), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *reader) PrefixIterator(prefix []byte) store.KVIterator {
|
func (r *reader) PrefixIterator(prefix []byte) store.KVIterator {
|
||||||
return &iterator{}
|
return &iterator{}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user