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