wp
This commit is contained in:
230
atree/misc.go
230
atree/misc.go
@@ -1,8 +1,8 @@
|
||||
package atree
|
||||
|
||||
import (
|
||||
"gordenko.dev/dima/qb/bin"
|
||||
)
|
||||
type KeyComparator interface {
|
||||
CompareTo(int) int
|
||||
}
|
||||
|
||||
type ValueAtComparator struct {
|
||||
buf []byte
|
||||
@@ -10,21 +10,22 @@ type ValueAtComparator struct {
|
||||
}
|
||||
|
||||
func (s ValueAtComparator) CompareTo(elemIdx int) int {
|
||||
var (
|
||||
pos = elemIdx * timestampSize
|
||||
elem = bin.GetUint32(s.buf[pos:])
|
||||
)
|
||||
// var (
|
||||
// pos = elemIdx * timestampSize
|
||||
// elem, _ = bin.GetUint32(s.buf[pos:])
|
||||
// )
|
||||
|
||||
if s.timestamp < elem {
|
||||
return -1
|
||||
} else if s.timestamp > elem {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
// if s.timestamp < elem {
|
||||
// return -1
|
||||
// } else if s.timestamp > elem {
|
||||
// return 1
|
||||
// } else {
|
||||
// return 0
|
||||
// }
|
||||
return 213131132
|
||||
}
|
||||
|
||||
func BinarySearch(qty int, keyComparator bin.KeyComparator) (elemIdx int, isFound bool) {
|
||||
func BinarySearch(qty int, keyComparator KeyComparator) (elemIdx int, isFound bool) {
|
||||
if qty == 0 {
|
||||
return
|
||||
}
|
||||
@@ -55,141 +56,94 @@ func BinarySearch(qty int, keyComparator bin.KeyComparator) (elemIdx int, isFoun
|
||||
}
|
||||
}
|
||||
|
||||
// type ChunksToNotLinkedDataPageReq struct {
|
||||
// // PrevPageNo uint32
|
||||
// TimestampsChunks [][]byte
|
||||
// TimestampsSize uint16
|
||||
// ValuesChunks [][]byte
|
||||
// ValuesSize uint16
|
||||
// func getPrevPageNo(buf []byte) uint32 {
|
||||
// pageNo, _ := bin.GetUint32(buf[prevPageIdx:])
|
||||
// return pageNo
|
||||
// }
|
||||
|
||||
// func ChunksToNotLinkedDataPage(buf []byte, req ChunksToNotLinkedDataPageReq) {
|
||||
// bin.PutUint16(buf[timestampsSizeIdx:], req.TimestampsSize)
|
||||
// bin.PutUint16(buf[valuesSizeIdx:], req.ValuesSize)
|
||||
|
||||
// var (
|
||||
// remainingSize = int(req.TimestampsSize)
|
||||
// pos = 0
|
||||
// )
|
||||
// for _, chunk := range req.TimestampsChunks {
|
||||
// if remainingSize >= len(chunk) {
|
||||
// copy(buf[pos:], chunk)
|
||||
// remainingSize -= len(chunk)
|
||||
// pos += len(chunk)
|
||||
// } else {
|
||||
// copy(buf[pos:], chunk[:remainingSize])
|
||||
// break
|
||||
// }
|
||||
// func findPageNo(buf []byte, timestamp uint32) (pageNo uint32) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: buf,
|
||||
// timestamp: timestamp,
|
||||
// }
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// elemIdx, _ := BinarySearch(int(qty), comparator)
|
||||
// pos := indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
// pageNo, _ = bin.GetUint32(buf[pos:])
|
||||
// return
|
||||
// }
|
||||
|
||||
// remainingSize = int(req.ValuesSize)
|
||||
// pos = int(req.TimestampsSize)
|
||||
|
||||
// for _, chunk := range req.ValuesChunks {
|
||||
// if remainingSize >= len(chunk) {
|
||||
// copy(buf[pos:], chunk)
|
||||
// remainingSize -= len(chunk)
|
||||
// pos += len(chunk)
|
||||
// } else {
|
||||
// copy(buf[pos:], chunk[:remainingSize])
|
||||
// break
|
||||
// }
|
||||
// func findPageNoIdx(buf []byte, timestamp uint32) (idx int) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: buf,
|
||||
// timestamp: timestamp,
|
||||
// }
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// elemIdx, _ := BinarySearch(int(qty), comparator)
|
||||
// return elemIdx
|
||||
// }
|
||||
|
||||
// func setPrevPageNo(buf []byte, pageNo uint32) {
|
||||
// bin.PutUint32(buf[prevPageIdx:], pageNo)
|
||||
// func findPageNoForDeleteSince(buf []byte, since uint32) (uint32, int, int) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: buf,
|
||||
// timestamp: since,
|
||||
// }
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// elemIdx, _ := BinarySearch(int(qty), comparator)
|
||||
// pos := elemIdx * timestampSize
|
||||
// timestamp, _ := bin.GetUint32(buf[pos:])
|
||||
|
||||
// if timestamp == since {
|
||||
// if elemIdx == 0 {
|
||||
// return 0, int(qty), -1
|
||||
// }
|
||||
// elemIdx--
|
||||
// }
|
||||
// pos = indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
// pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
// return pageNo, int(qty), elemIdx
|
||||
// }
|
||||
|
||||
func getPrevPageNo(buf []byte) uint32 {
|
||||
return bin.GetUint32(buf[prevPageIdx:])
|
||||
}
|
||||
// func getLastPageNo(buf []byte) (pageNo uint32) {
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// pos := indexFooterIdx - qty*PageNoSize
|
||||
// pageNo, _ = bin.GetUint32(buf[pos:])
|
||||
// return
|
||||
// }
|
||||
|
||||
func findPageNo(buf []byte, timestamp uint32) (pageNo uint32) {
|
||||
var (
|
||||
qty = bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
comparator = ValueAtComparator{
|
||||
buf: buf,
|
||||
timestamp: timestamp,
|
||||
}
|
||||
)
|
||||
elemIdx, _ := BinarySearch(qty, comparator)
|
||||
pos := indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
return bin.GetUint32(buf[pos:])
|
||||
}
|
||||
// func getPageNo(buf []byte, idx int) (pageNo uint32) {
|
||||
// pos := indexFooterIdx - (idx+1)*PageNoSize
|
||||
// pageNo, _ = bin.GetUint32(buf[pos:])
|
||||
// return
|
||||
// }
|
||||
|
||||
func findPageNoIdx(buf []byte, timestamp uint32) (idx int) {
|
||||
var (
|
||||
qty = bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
comparator = ValueAtComparator{
|
||||
buf: buf,
|
||||
timestamp: timestamp,
|
||||
}
|
||||
)
|
||||
elemIdx, _ := BinarySearch(qty, comparator)
|
||||
return elemIdx
|
||||
}
|
||||
// func listPageNumbers(buf []byte) (pageNumbers []uint32) {
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// pos := indexFooterIdx - PageNoSize
|
||||
// for range qty {
|
||||
// pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
// pageNumbers = append(pageNumbers, pageNo)
|
||||
// pos -= PageNoSize
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
|
||||
func findPageNoForDeleteSince(buf []byte, since uint32) (uint32, int, int) {
|
||||
var (
|
||||
qty = bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
comparator = ValueAtComparator{
|
||||
buf: buf,
|
||||
timestamp: since,
|
||||
}
|
||||
)
|
||||
elemIdx, _ := BinarySearch(qty, comparator)
|
||||
pos := elemIdx * timestampSize
|
||||
timestamp := bin.GetUint32(buf[pos:])
|
||||
|
||||
if timestamp == since {
|
||||
if elemIdx == 0 {
|
||||
return 0, qty, -1
|
||||
}
|
||||
elemIdx--
|
||||
}
|
||||
pos = indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
return bin.GetUint32(buf[pos:]), qty, elemIdx
|
||||
}
|
||||
|
||||
func getLastPageNo(buf []byte) (pageNo uint32) {
|
||||
qty := bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
pos := indexFooterIdx - qty*PageNoSize
|
||||
return bin.GetUint32(buf[pos:])
|
||||
}
|
||||
|
||||
func getPageNo(buf []byte, idx int) (pageNo uint32) {
|
||||
pos := indexFooterIdx - (idx+1)*PageNoSize
|
||||
return bin.GetUint32(buf[pos:])
|
||||
}
|
||||
|
||||
func listPageNumbers(buf []byte) (pageNumbers []uint32) {
|
||||
qty := bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
pos := indexFooterIdx - PageNoSize
|
||||
for range qty {
|
||||
pageNumbers = append(pageNumbers, bin.GetUint32(buf[pos:]))
|
||||
pos -= PageNoSize
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// include since timestamp
|
||||
func listPageNumbersSince(buf []byte, timestamp uint32) (pageNumbers []uint32) {
|
||||
var (
|
||||
qty = bin.GetUint16AsInt(buf[indexRecordsQtyIdx:])
|
||||
comparator = ValueAtComparator{
|
||||
buf: buf,
|
||||
timestamp: timestamp,
|
||||
}
|
||||
)
|
||||
elemIdx, _ := BinarySearch(qty, comparator)
|
||||
pos := indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
for range qty {
|
||||
pageNumbers = append(pageNumbers, bin.GetUint32(buf[pos:]))
|
||||
pos -= PageNoSize
|
||||
}
|
||||
return
|
||||
}
|
||||
// // include since timestamp
|
||||
// func listPageNumbersSince(buf []byte, timestamp uint32) (pageNumbers []uint32) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: buf,
|
||||
// timestamp: timestamp,
|
||||
// }
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// elemIdx, _ := BinarySearch(int(qty), comparator)
|
||||
// pos := indexFooterIdx - (elemIdx+1)*PageNoSize
|
||||
// for range qty {
|
||||
// pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
// pageNumbers = append(pageNumbers, pageNo)
|
||||
// pos -= PageNoSize
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
|
||||
// func getSince(buf []byte) uint32 {
|
||||
// return bin.GetUint32(buf[0:])
|
||||
|
||||
Reference in New Issue
Block a user