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  }