You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
2.5 KiB
129 lines
2.5 KiB
package atree
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gordenko.dev/dima/diploma"
|
|
)
|
|
|
|
type ContinueFullScanReq struct {
|
|
FracDigits byte
|
|
ResponseWriter AtreeMeasureConsumer
|
|
LastPageNo uint32
|
|
}
|
|
|
|
func (s *Atree) ContinueFullScan(req ContinueFullScanReq) error {
|
|
buf, err := s.fetchDataPage(req.LastPageNo)
|
|
if err != nil {
|
|
return fmt.Errorf("fetchDataPage(%d): %s", req.LastPageNo, err)
|
|
}
|
|
|
|
treeCursor, err := NewBackwardCursor(BackwardCursorOptions{
|
|
PageNo: req.LastPageNo,
|
|
PageData: buf,
|
|
Atree: s,
|
|
FracDigits: req.FracDigits,
|
|
MetricType: diploma.Instant,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer treeCursor.Close()
|
|
|
|
for {
|
|
timestamp, value, done, err := treeCursor.Prev()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if done {
|
|
return nil
|
|
}
|
|
req.ResponseWriter.Feed(timestamp, value)
|
|
}
|
|
}
|
|
|
|
type ContinueRangeScanReq struct {
|
|
FracDigits byte
|
|
ResponseWriter AtreeMeasureConsumer
|
|
LastPageNo uint32
|
|
Since uint32
|
|
}
|
|
|
|
func (s *Atree) ContinueRangeScan(req ContinueRangeScanReq) error {
|
|
buf, err := s.fetchDataPage(req.LastPageNo)
|
|
if err != nil {
|
|
return fmt.Errorf("fetchDataPage(%d): %s", req.LastPageNo, err)
|
|
}
|
|
|
|
treeCursor, err := NewBackwardCursor(BackwardCursorOptions{
|
|
PageNo: req.LastPageNo,
|
|
PageData: buf,
|
|
Atree: s,
|
|
FracDigits: req.FracDigits,
|
|
MetricType: diploma.Instant,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer treeCursor.Close()
|
|
|
|
for {
|
|
timestamp, value, done, err := treeCursor.Prev()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if done {
|
|
return nil
|
|
}
|
|
req.ResponseWriter.Feed(timestamp, value)
|
|
if timestamp < req.Since {
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
type RangeScanReq struct {
|
|
FracDigits byte
|
|
ResponseWriter AtreeMeasureConsumer
|
|
RootPageNo uint32
|
|
Since uint32
|
|
Until uint32
|
|
}
|
|
|
|
func (s *Atree) RangeScan(req RangeScanReq) error {
|
|
pageNo, buf, err := s.findDataPage(req.RootPageNo, req.Until)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cursor, err := NewBackwardCursor(BackwardCursorOptions{
|
|
PageNo: pageNo,
|
|
PageData: buf,
|
|
Atree: s,
|
|
FracDigits: req.FracDigits,
|
|
MetricType: diploma.Instant,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer cursor.Close()
|
|
|
|
for {
|
|
timestamp, value, done, err := cursor.Prev()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if done {
|
|
return nil
|
|
}
|
|
|
|
if timestamp <= req.Until {
|
|
req.ResponseWriter.Feed(timestamp, value)
|
|
|
|
if timestamp < req.Since {
|
|
// - записи, удовлетворяющие временным рамкам, закончились.
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|