/
push.go
50 lines (42 loc) · 1.28 KB
/
push.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package imageblk
import (
"fmt"
"github.com/janelia-flyem/dvid/datastore"
"github.com/janelia-flyem/dvid/datatype/roi"
"github.com/janelia-flyem/dvid/dvid"
"github.com/janelia-flyem/dvid/storage"
)
// PushData does an imageblk-specific push using optional ROI filters.
func (d *Data) PushData(p *datastore.PushSession) error {
return datastore.PushData(d, p)
}
// --- dvid.Filterer implementation -----
// NewFilter returns a Filter for use with a push of key-value pairs.
func (d *Data) NewFilter(fs storage.FilterSpec) (storage.Filter, error) {
roiIterator, _, found, err := roi.NewIteratorBySpec(fs, d)
if err != nil {
dvid.Debugf("No filter found that was parsable: %s\n", fs)
return nil, err
}
if !found || roiIterator == nil {
dvid.Debugf("No ROI found so using generic data push for data %q.\n", d.DataName())
return nil, nil
}
return &Filter{d, fs, roiIterator}, nil
}
// --- dvid.Filter implementation ----
type Filter struct {
*Data
fs storage.FilterSpec
it *roi.Iterator
}
func (f Filter) Check(tkv *storage.TKeyValue) (skip bool, err error) {
indexZYX, err := DecodeTKey(tkv.K)
if err != nil {
return true, fmt.Errorf("key (%v) cannot be decoded as block coord: %v", tkv.K, err)
}
if !f.it.InsideFast(*indexZYX) {
return true, nil
}
return false, nil
}