спеціалізована СУБД для зберігання та обробки показань датчиків та лічильників
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.
diploma/atree/select.go

130 lines
2.5 KiB

3 months ago
package atree
import (
"fmt"
3 months ago
"gordenko.dev/dima/diploma"
3 months ago
)
3 months ago
type ContinueFullScanReq struct {
3 months ago
FracDigits byte
3 months ago
ResponseWriter AtreeMeasureConsumer
3 months ago
LastPageNo uint32
}
3 months ago
func (s *Atree) ContinueFullScan(req ContinueFullScanReq) error {
3 months ago
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,
3 months ago
MetricType: diploma.Instant,
3 months ago
})
if err != nil {
return err
}
defer treeCursor.Close()
for {
timestamp, value, done, err := treeCursor.Prev()
if err != nil {
return err
}
if done {
return nil
}
3 months ago
req.ResponseWriter.Feed(timestamp, value)
3 months ago
}
}
3 months ago
type ContinueRangeScanReq struct {
3 months ago
FracDigits byte
3 months ago
ResponseWriter AtreeMeasureConsumer
3 months ago
LastPageNo uint32
3 months ago
Since uint32
3 months ago
}
3 months ago
func (s *Atree) ContinueRangeScan(req ContinueRangeScanReq) error {
3 months ago
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,
3 months ago
MetricType: diploma.Instant,
3 months ago
})
if err != nil {
return err
}
defer treeCursor.Close()
for {
timestamp, value, done, err := treeCursor.Prev()
if err != nil {
return err
}
if done {
return nil
}
3 months ago
req.ResponseWriter.Feed(timestamp, value)
3 months ago
if timestamp < req.Since {
return nil
}
}
}
3 months ago
type RangeScanReq struct {
3 months ago
FracDigits byte
3 months ago
ResponseWriter AtreeMeasureConsumer
3 months ago
RootPageNo uint32
Since uint32
Until uint32
}
3 months ago
func (s *Atree) RangeScan(req RangeScanReq) error {
3 months ago
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,
3 months ago
MetricType: diploma.Instant,
3 months ago
})
if err != nil {
return err
}
defer cursor.Close()
for {
timestamp, value, done, err := cursor.Prev()
if err != nil {
return err
}
3 months ago
if done {
3 months ago
return nil
}
if timestamp <= req.Until {
3 months ago
req.ResponseWriter.Feed(timestamp, value)
3 months ago
3 months ago
if timestamp < req.Since {
// - записи, удовлетворяющие временным рамкам, закончились.
return nil
3 months ago
}
}
}
}