mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-10 23:11:01 +00:00
removed leafArg and added conatinertypebitmapptr; lint fixes
This commit is contained in:
parent
bbd83e4618
commit
59d2d89a5c
6 changed files with 54 additions and 68 deletions
|
|
@ -84,7 +84,7 @@ func runAdd(runs []roaring.Interval16, v uint16) ([]roaring.Interval16, bool) {
|
|||
}
|
||||
return runs, true
|
||||
}
|
||||
func checkRun(runs []roaring.Interval16, key uint64) leafArgs {
|
||||
func checkRun(runs []roaring.Interval16, key uint64) leafCell {
|
||||
if len(runs) >= RLEMaxSize {
|
||||
//convertToBitmap
|
||||
bitmap := make([]uint64, BitmapN)
|
||||
|
|
@ -123,9 +123,9 @@ func checkRun(runs []roaring.Interval16, key uint64) leafArgs {
|
|||
n += popcount(v)
|
||||
}
|
||||
|
||||
return leafArgs{Key: key, N: int(n), Type: ContainerTypeBitmap, Data: fromArray64(bitmap)}
|
||||
return leafCell{Key: key, N: int(n), Type: ContainerTypeBitmap, Data: fromArray64(bitmap)}
|
||||
}
|
||||
return leafArgs{Key: key, N: len(runs), Type: ContainerTypeRLE, Data: fromInterval16(runs)}
|
||||
return leafCell{Key: key, N: len(runs), Type: ContainerTypeRLE, Data: fromInterval16(runs)}
|
||||
}
|
||||
|
||||
// Add sets a bit on the underlying bitmap.
|
||||
|
|
@ -136,7 +136,7 @@ func (c *Cursor) Add(v uint64) (changed bool, err error) {
|
|||
if exact, err := c.Seek(hi); err != nil {
|
||||
return false, err
|
||||
} else if !exact {
|
||||
return true, c.putLeafCell(leafArgs{Key: hi, Type: ContainerTypeArray, N: 1, Data: fromArray16([]uint16{lo})})
|
||||
return true, c.putLeafCell(leafCell{Key: hi, Type: ContainerTypeArray, N: 1, Data: fromArray16([]uint16{lo})})
|
||||
}
|
||||
|
||||
// If the container exists and bit is not set then update the page.
|
||||
|
|
@ -155,7 +155,7 @@ func (c *Cursor) Add(v uint64) (changed bool, err error) {
|
|||
copy(other, a[:i])
|
||||
other[i] = lo
|
||||
copy(other[i+1:], a[i:])
|
||||
return true, c.putLeafCell(leafArgs{Key: cell.Key, Type: ContainerTypeArray, N: len(other), Data: fromArray16(other)})
|
||||
return true, c.putLeafCell(leafCell{Key: cell.Key, Type: ContainerTypeArray, N: len(other), Data: fromArray16(other)})
|
||||
|
||||
case ContainerTypeRLE:
|
||||
runs := toInterval16(cell.Data)
|
||||
|
|
@ -167,7 +167,7 @@ func (c *Cursor) Add(v uint64) (changed bool, err error) {
|
|||
return true, c.putLeafCell(leaf)
|
||||
}
|
||||
return false, nil
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
// Exit if bit set in bitmap container.
|
||||
pgno, bm, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
|
||||
|
|
@ -220,7 +220,7 @@ func (c *Cursor) Remove(v uint64) (changed bool, err error) {
|
|||
other := make([]uint16, len(a)-1)
|
||||
copy(other[:i], a[:i])
|
||||
copy(other[i:], a[i+1:])
|
||||
return true, c.putLeafCell(leafArgs{Key: cell.Key, Type: ContainerTypeArray, N: len(other), Data: fromArray16(other)})
|
||||
return true, c.putLeafCell(leafCell{Key: cell.Key, Type: ContainerTypeArray, N: len(other), Data: fromArray16(other)})
|
||||
|
||||
case ContainerTypeRLE:
|
||||
r := toInterval16(cell.Data)
|
||||
|
|
@ -247,8 +247,8 @@ func (c *Cursor) Remove(v uint64) (changed bool, err error) {
|
|||
if len(runs) == 0 {
|
||||
return true, c.deleteLeafCell(cell.Key)
|
||||
}
|
||||
return true, c.putLeafCell(leafArgs{Key: cell.Key, Type: ContainerTypeRLE, N: len(runs), Data: fromInterval16(runs)})
|
||||
case ContainerTypeBitmap:
|
||||
return true, c.putLeafCell(leafCell{Key: cell.Key, Type: ContainerTypeRLE, N: len(runs), Data: fromInterval16(runs)})
|
||||
case ContainerTypeBitmapPtr:
|
||||
pgno, bm, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "cursor.add")
|
||||
|
|
@ -298,7 +298,7 @@ func (c *Cursor) Contains(v uint64) (exists bool, err error) {
|
|||
return (lo >= a[i].Start) && (lo <= a[i].Last), nil
|
||||
}
|
||||
return false, nil
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, a, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "cursor.Contains")
|
||||
|
|
@ -317,33 +317,33 @@ func fromPgno(val uint32) []byte {
|
|||
func toPgno(val []byte) uint32 {
|
||||
return binary.LittleEndian.Uint32(val)
|
||||
}
|
||||
func (c *Cursor) putLeafCell(in leafArgs) (err error) {
|
||||
func (c *Cursor) putLeafCell(in leafCell) (err error) {
|
||||
cells := readLeafCells(c.leafPage, c.leafCells[:])
|
||||
elem := &c.stack.elems[c.stack.index]
|
||||
cell := leafCell(in)
|
||||
|
||||
cell := in
|
||||
if elem.index >= len(cells) || c.Key() != cell.Key {
|
||||
//new cell
|
||||
if cell.Type == ContainerTypeBitmap {
|
||||
if in.Type == ContainerTypeBitmap {
|
||||
//allocated bitmap()
|
||||
bitmapPgno, _ := c.tx.allocate()
|
||||
cell.Data = fromPgno(bitmapPgno)
|
||||
cell.Type = ContainerTypeBitmapPtr
|
||||
}
|
||||
|
||||
// Shift cells over if this is an insertion.
|
||||
cells = append(cells, leafCell{})
|
||||
copy(cells[elem.index+1:], cells[elem.index:])
|
||||
|
||||
} else if in.Type == ContainerTypeBitmap {
|
||||
ecell := cells[elem.index]
|
||||
if ecell.Type != ContainerTypeBitmap {
|
||||
bitmapPgno, err := c.tx.allocate()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "cursor.putLeafCell")
|
||||
} else {
|
||||
if in.Type == ContainerTypeBitmap {
|
||||
cell = cells[elem.index]
|
||||
if cell.Type != ContainerTypeBitmapPtr {
|
||||
bitmapPgno, err := c.tx.allocate()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "cursor.putLeafCell")
|
||||
}
|
||||
cell.Type = ContainerTypeBitmapPtr
|
||||
cell.Data = fromPgno(bitmapPgno)
|
||||
}
|
||||
cell.Data = fromPgno(bitmapPgno)
|
||||
} else {
|
||||
cell.Data = ecell.Data //fill in the old pgno
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -355,7 +355,7 @@ func (c *Cursor) putLeafCell(in leafArgs) (err error) {
|
|||
a[v/64] |= 1 << uint64(v%64)
|
||||
}
|
||||
in.Data = fromArray64(a)
|
||||
cell.Type = ContainerTypeBitmap
|
||||
cell.Type = ContainerTypeBitmapPtr
|
||||
bitmapPgno, _ := c.tx.allocate()
|
||||
cell.Data = fromPgno(bitmapPgno)
|
||||
}
|
||||
|
|
@ -436,7 +436,7 @@ func (c *Cursor) deleteLeafCell(key uint64) (err error) {
|
|||
elem := &c.stack.elems[c.stack.index]
|
||||
oldPageKey := cells[0].Key
|
||||
cell := c.cell()
|
||||
if cell.Type == ContainerTypeBitmap {
|
||||
if cell.Type == ContainerTypeBitmapPtr {
|
||||
if err := c.tx.deallocate(toPgno(cell.Data)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -957,7 +957,7 @@ func (c *Cursor) Union(rowID uint64, row []uint64) error {
|
|||
}
|
||||
case ContainerTypeRLE:
|
||||
panic("TODO(BBJ): rbf.Bitmap.Union() RLE support")
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, bm, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "union")
|
||||
|
|
@ -1005,7 +1005,7 @@ func (c *Cursor) Intersect(rowID uint64, row []uint64) error {
|
|||
}
|
||||
case ContainerTypeRLE:
|
||||
panic("TODO(BBJ): rbf.Bitmap.Intersect() RLE support")
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, bm, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "cursor.Intersect")
|
||||
|
|
@ -1086,7 +1086,7 @@ func (c *Cursor) goNextPage() error {
|
|||
}
|
||||
}
|
||||
|
||||
func ConvertToLeafArgs(key uint64, c *roaring.Container) (result leafArgs) {
|
||||
func ConvertToLeafArgs(key uint64, c *roaring.Container) (result leafCell) {
|
||||
result.Key = key
|
||||
result.N = int(c.N())
|
||||
result.Type = ContainerTypeNone
|
||||
|
|
@ -1131,7 +1131,7 @@ func (c *Cursor) merge(key uint64, data *roaring.Container) (bool, error) {
|
|||
case ContainerTypeArray:
|
||||
d := toArray16(cell.Data)
|
||||
container = roaring.NewContainerArray(d)
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, d, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "cursor.merge")
|
||||
|
|
@ -1218,7 +1218,7 @@ func (c *Cursor) difference(key uint64, data *roaring.Container) (bool, error) {
|
|||
case ContainerTypeArray:
|
||||
d := toArray16(cell.Data)
|
||||
container = roaring.NewContainerArray(d)
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, d, err := c.tx.leafCellBitmap(toPgno(cell.Data))
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "cursor.difference")
|
||||
|
|
|
|||
|
|
@ -803,8 +803,6 @@ func TestCursor_RLEConversion(t *testing.T) {
|
|||
}
|
||||
if got, want := c.Values(), want; !reflect.DeepEqual(got, want) {
|
||||
t.Fatalf("Values()=%#v, want %#v", got, want)
|
||||
} else if c.CurrentPageType() != rbf.ContainerTypeBitmap {
|
||||
t.Fatalf("Should be bitmap but is %v", c.CurrentPageType())
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ func (c *Cursor) Row(rowID uint64) (*roaring.Bitmap, error) {
|
|||
if cell.Key >= hi1 {
|
||||
break
|
||||
}
|
||||
other.Containers.Put(off+(cell.Key-hi0), toContainer(cell))
|
||||
other.Containers.Put(off+(cell.Key-hi0), toContainer(cell, c.tx))
|
||||
}
|
||||
return other, nil
|
||||
}
|
||||
|
|
@ -138,10 +138,13 @@ func (c *Cursor) CurrentPageType() int {
|
|||
return cell.Type
|
||||
}
|
||||
|
||||
func toContainer(l leafCell) *roaring.Container {
|
||||
func toContainer(l leafCell, tx *Tx) *roaring.Container {
|
||||
switch l.Type {
|
||||
case ContainerTypeArray:
|
||||
return roaring.NewContainerArray(toArray16(l.Data))
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, bm, _ := tx.leafCellBitmap(toPgno(l.Data))
|
||||
return roaring.NewContainerBitmap(l.N, bm)
|
||||
case ContainerTypeBitmap:
|
||||
return roaring.NewContainerBitmap(l.N, toArray64(l.Data))
|
||||
case ContainerTypeRLE:
|
||||
|
|
@ -181,11 +184,7 @@ func Page(tx *Tx, pgno uint32, walker Walker) {
|
|||
walker.Visit(pgno, Branch)
|
||||
for i, n := 0, readCellN(page); i < n; i++ {
|
||||
cell := readBranchCell(page, i)
|
||||
if cell.Flags&ContainerTypeBitmap == 0 { // leaf/branch child page
|
||||
Page(tx, cell.Pgno, walker)
|
||||
} else {
|
||||
walker.Visit(cell.Pgno, Bitmap)
|
||||
}
|
||||
Page(tx, cell.Pgno, walker)
|
||||
}
|
||||
case PageTypeLeaf:
|
||||
walker.Visit(pgno, Leaf)
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ func dotCell(b []byte, parent string, writer io.Writer) {
|
|||
fmt.Fprintf(writer, "<tr><td border=\"1\" bgcolor=\"green\"><font color=\"white\">[%d]: key=%d type=array n=%d</font></td></tr>\n", i, cell.Key, cell.N)
|
||||
case ContainerTypeRLE:
|
||||
fmt.Fprintf(writer, "<tr><td border=\"1\" bgcolor=\"blue\"><font color=\"white\">[%d]: key=%d type=rle n=%d</font></td></tr>\n", i, cell.Key, cell.N)
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
bpn := toPgno(cell.Data)
|
||||
fmt.Fprintf(writer, "<tr><td border=\"1\" bgcolor=\"red\" port=\"%d\"><font color=\"white\">[%d]: key=%d type=bitmap n=%d </font></td></tr>\n", bpn, i, cell.Key, cell.N)
|
||||
links = append(links, fmt.Sprintf("bitmap%d[label=\"bitmap (%d)\"]\n cell%d:%d -> bitmap%d\n", bpn, bpn, pgno, i, bpn))
|
||||
|
|
|
|||
17
rbf/rbf.go
17
rbf/rbf.go
|
|
@ -67,6 +67,7 @@ const (
|
|||
ContainerTypeArray
|
||||
ContainerTypeRLE
|
||||
ContainerTypeBitmap
|
||||
ContainerTypeBitmapPtr
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -295,7 +296,7 @@ func (c *leafCell) Bitmap(tx *Tx) []uint64 {
|
|||
}
|
||||
}
|
||||
return buf
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
_, bm, _ := tx.leafCellBitmap(toPgno(c.Data))
|
||||
return bm
|
||||
default:
|
||||
|
|
@ -320,7 +321,7 @@ func (c *leafCell) Values(tx *Tx) []uint16 {
|
|||
}
|
||||
a = a[:n]
|
||||
return a
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
a := make([]uint16, 0, BitmapN*64)
|
||||
_, bm, _ := tx.leafCellBitmap(toPgno(c.Data))
|
||||
for i, v := range bm {
|
||||
|
|
@ -347,7 +348,7 @@ func (c *leafCell) firstValue() uint16 {
|
|||
case ContainerTypeRLE:
|
||||
r := toInterval16(c.Data)
|
||||
return r[0].Start
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
for i, v := range toArray64(c.Data) {
|
||||
for j := uint(0); j < 64; j++ {
|
||||
if v&(1<<j) != 0 {
|
||||
|
|
@ -380,7 +381,7 @@ func readLeafCell(page []byte, i int) leafCell {
|
|||
cell.Data = buf[16 : 16+(cell.N*2)]
|
||||
case ContainerTypeRLE:
|
||||
cell.Data = buf[16 : 16+(cell.N*4)]
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
cell.Data = buf[16 : 16+4]
|
||||
default:
|
||||
}
|
||||
|
|
@ -508,7 +509,7 @@ func pagedumpi(b []byte, indent string, writer io.Writer) {
|
|||
fmt.Fprintf(writer, "%s[%d]: key=%d type=array n=%d \n", indent, i, cell.Key, cell.N)
|
||||
case ContainerTypeRLE:
|
||||
fmt.Fprintf(writer, "%s[%d]: key=%d type=rle n=%d\n", indent, i, cell.Key, cell.N)
|
||||
case ContainerTypeBitmap:
|
||||
case ContainerTypeBitmapPtr:
|
||||
fmt.Fprintf(writer, "%s[%d]: key=%d type=bitmap n=%d\n", indent, i, cell.Key, cell.N)
|
||||
default:
|
||||
fmt.Fprintf(writer, "%s[%d]: key=%d type=unknown<%d> n=%d\n", indent, i, cell.Key, cell.Type, cell.N)
|
||||
|
|
@ -575,11 +576,7 @@ func treedump(tx *Tx, pgno uint32, indent string, writer io.Writer) {
|
|||
|
||||
for i, n := 0, readCellN(page); i < n; i++ {
|
||||
cell := readBranchCell(page, i)
|
||||
if cell.Flags&ContainerTypeBitmap == 0 { // leaf/branch child page
|
||||
treedump(tx, cell.Pgno, " "+indent, writer)
|
||||
} else {
|
||||
fmt.Fprintf(writer, "%s BITMAP(%d)\n", fmtindent(" "+indent), cell.Pgno)
|
||||
}
|
||||
treedump(tx, cell.Pgno, " "+indent, writer)
|
||||
}
|
||||
case PageTypeLeaf:
|
||||
fmt.Fprintf(writer, "%s LEAF(%d) n=%d\n", fmtindent(indent), pgno, readCellN(page))
|
||||
|
|
|
|||
26
rbf/tx.go
26
rbf/tx.go
|
|
@ -78,7 +78,11 @@ func (tx *Tx) Rollback() error {
|
|||
}
|
||||
|
||||
// Disconnect transaction from DB.
|
||||
return tx.db.removeTx(tx)
|
||||
err := tx.db.removeTx(tx)
|
||||
if err != nil {
|
||||
//TODO need to fix this error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Root returns the root page number for a bitmap. Returns 0 if the bitmap does not exist.
|
||||
|
|
@ -516,14 +520,8 @@ func (tx *Tx) walkTree(pgno uint32, fn func(uint32) error) error {
|
|||
case PageTypeBranch:
|
||||
for i, n := 0, readCellN(page); i < n; i++ {
|
||||
cell := readBranchCell(page, i)
|
||||
if cell.Flags&ContainerTypeBitmap != 0 { // bitmap cell (cannot traverse into)
|
||||
if err := fn(cell.Pgno); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err := tx.walkTree(cell.Pgno, fn); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.walkTree(cell.Pgno, fn); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
|
@ -600,14 +598,8 @@ func (tx *Tx) deallocateTree(pgno uint32) error {
|
|||
case PageTypeBranch:
|
||||
for i, n := 0, readCellN(page); i < n; i++ {
|
||||
cell := readBranchCell(page, i)
|
||||
if cell.Flags&ContainerTypeBitmap == 0 { // leaf/branch child page
|
||||
if err := tx.deallocateTree(cell.Pgno); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err := tx.deallocate(cell.Pgno); err != nil { // bitmap child page
|
||||
return err
|
||||
}
|
||||
if err := tx.deallocateTree(cell.Pgno); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue