github.com/m3db/m3@v1.5.0/src/dbnode/encoding/iterator_test.go (about)

     1  // Copyright (c) 2016 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package encoding
    22  
    23  import (
    24  	"time"
    25  
    26  	"github.com/m3db/m3/src/dbnode/namespace"
    27  	"github.com/m3db/m3/src/dbnode/ts"
    28  	"github.com/m3db/m3/src/dbnode/x/xio"
    29  	"github.com/m3db/m3/src/x/pool"
    30  	xtime "github.com/m3db/m3/src/x/time"
    31  )
    32  
    33  type testValue struct {
    34  	value      float64
    35  	t          xtime.UnixNano
    36  	unit       xtime.Unit
    37  	annotation ts.Annotation
    38  }
    39  
    40  type testIterator struct {
    41  	values  []testValue
    42  	idx     int
    43  	closed  bool
    44  	err     error
    45  	onNext  func(oldIdx, newIdx int)
    46  	onReset func(r xio.Reader64, descr namespace.SchemaDescr)
    47  }
    48  
    49  func newTestIterator(values []testValue) ReaderIterator {
    50  	return &testIterator{values: values, idx: -1}
    51  }
    52  
    53  func (it *testIterator) Next() bool {
    54  	if it.onNext != nil {
    55  		it.onNext(it.idx, it.idx+1)
    56  	}
    57  	if it.Err() != nil {
    58  		return false
    59  	}
    60  	if it.idx+1 >= len(it.values) {
    61  		return false
    62  	}
    63  	it.idx++
    64  	return true
    65  }
    66  
    67  func (it *testIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) {
    68  	idx := it.idx
    69  	if idx == -1 {
    70  		idx = 0
    71  	}
    72  	v := it.values[idx]
    73  	dp := ts.Datapoint{TimestampNanos: v.t, Value: v.value}
    74  	return dp, v.unit, v.annotation
    75  }
    76  
    77  func (it *testIterator) Err() error {
    78  	return it.err
    79  }
    80  
    81  func (it *testIterator) Close() {
    82  	it.closed = true
    83  }
    84  
    85  func (it *testIterator) Reset(r xio.Reader64, descr namespace.SchemaDescr) {
    86  	it.onReset(r, descr)
    87  }
    88  
    89  func (it *testIterator) ResetSliceOfSlices(readers xio.ReaderSliceOfSlicesIterator, descr namespace.SchemaDescr) {
    90  	l, _, _ := readers.CurrentReaders()
    91  	for i := 0; i < l; i++ {
    92  		r := readers.CurrentReaderAt(i)
    93  		it.onReset(r, descr)
    94  	}
    95  }
    96  
    97  type testMultiIterator struct {
    98  	values  []testValue
    99  	idx     int
   100  	closed  bool
   101  	err     error
   102  	onNext  func(oldIdx, newIdx int)
   103  	onReset func(r xio.Reader64)
   104  }
   105  
   106  func newTestMultiIterator(values []testValue, err error) MultiReaderIterator {
   107  	return &testMultiIterator{values: values, idx: -1, err: err}
   108  }
   109  
   110  func (it *testMultiIterator) Next() bool {
   111  	if it.onNext != nil {
   112  		it.onNext(it.idx, it.idx+1)
   113  	}
   114  	if it.Err() != nil {
   115  		return false
   116  	}
   117  	if it.idx+1 >= len(it.values) {
   118  		return false
   119  	}
   120  	it.idx++
   121  	return true
   122  }
   123  
   124  func (it *testMultiIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) {
   125  	idx := it.idx
   126  	if idx == -1 {
   127  		idx = 0
   128  	}
   129  	v := it.values[idx]
   130  	dp := ts.Datapoint{TimestampNanos: v.t, Value: v.value}
   131  	return dp, v.unit, v.annotation
   132  }
   133  
   134  func (it *testMultiIterator) Err() error {
   135  	return it.err
   136  }
   137  
   138  func (it *testMultiIterator) Close() {
   139  	it.closed = true
   140  }
   141  
   142  func (it *testMultiIterator) Reset(r []xio.SegmentReader, _ xtime.UnixNano,
   143  	_ time.Duration, _ namespace.SchemaDescr) {
   144  	for _, reader := range r {
   145  		it.onReset(reader)
   146  	}
   147  }
   148  
   149  func (it *testMultiIterator) ResetSliceOfSlices(
   150  	readers xio.ReaderSliceOfSlicesIterator, _ namespace.SchemaDescr) {
   151  	l, _, _ := readers.CurrentReaders()
   152  	for i := 0; i < l; i++ {
   153  		r := readers.CurrentReaderAt(i)
   154  		it.onReset(r)
   155  	}
   156  }
   157  
   158  func (it *testMultiIterator) Schema() namespace.SchemaDescr {
   159  	return nil
   160  }
   161  
   162  func (it *testMultiIterator) Readers() xio.ReaderSliceOfSlicesIterator {
   163  	return nil
   164  }
   165  
   166  type testReaderSliceOfSlicesIterator struct {
   167  	blocks [][]xio.BlockReader
   168  	idx    int
   169  	closed bool
   170  }
   171  
   172  func newTestReaderSliceOfSlicesIterator(
   173  	blocks [][]xio.BlockReader,
   174  ) xio.ReaderSliceOfSlicesIterator {
   175  	return &testReaderSliceOfSlicesIterator{blocks: blocks, idx: -1}
   176  }
   177  
   178  func (it *testReaderSliceOfSlicesIterator) Next() bool {
   179  	if !(it.idx+1 < len(it.blocks)) {
   180  		return false
   181  	}
   182  	it.idx++
   183  	return true
   184  }
   185  
   186  func (it *testReaderSliceOfSlicesIterator) CurrentReaders() (int, xtime.UnixNano, time.Duration) {
   187  	return len(it.blocks[it.arrayIdx()]), 0, 0
   188  }
   189  
   190  func (it *testReaderSliceOfSlicesIterator) CurrentReaderAt(idx int) xio.BlockReader {
   191  	return it.blocks[it.arrayIdx()][idx]
   192  }
   193  
   194  func (it *testReaderSliceOfSlicesIterator) Close() {
   195  	it.closed = true
   196  }
   197  
   198  func (it *testReaderSliceOfSlicesIterator) Size() (int, error) {
   199  	return 0, nil
   200  }
   201  
   202  func (it *testReaderSliceOfSlicesIterator) RewindToIndex(idx int) {
   203  	it.idx = idx
   204  }
   205  
   206  func (it *testReaderSliceOfSlicesIterator) Index() int {
   207  	return it.idx
   208  }
   209  
   210  func (it *testReaderSliceOfSlicesIterator) arrayIdx() int {
   211  	idx := it.idx
   212  	if idx == -1 {
   213  		idx = 0
   214  	}
   215  	return idx
   216  }
   217  
   218  type testNoopReader struct {
   219  	n byte // return for "n", also required so that each struct construction has its address
   220  }
   221  
   222  func (r *testNoopReader) Read64() (word uint64, n byte, err error) { return 0, r.n, nil }
   223  func (r *testNoopReader) Peek64() (word uint64, n byte, err error) { return 0, r.n, nil }
   224  func (r *testNoopReader) Segment() (ts.Segment, error)             { return ts.Segment{}, nil }
   225  func (r *testNoopReader) Reset(ts.Segment)                         {}
   226  func (r *testNoopReader) Finalize()                                {}
   227  func (r *testNoopReader) Clone(
   228  	_ pool.CheckedBytesPool,
   229  ) (xio.SegmentReader, error) {
   230  	return r, nil
   231  }