mirror of https://github.com/rocboss/paopao-ce
parent
4134faf541
commit
dd7eabec28
@ -0,0 +1,157 @@
|
|||||||
|
// Copyright 2023 ROC. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/RoaringBitmap/roaring"
|
||||||
|
"github.com/RoaringBitmap/roaring/roaring64"
|
||||||
|
"github.com/alimy/tryst/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type roaringBitmap struct {
|
||||||
|
Map *roaring.Bitmap
|
||||||
|
}
|
||||||
|
|
||||||
|
type roaring64Bitmap struct {
|
||||||
|
Map *roaring64.Bitmap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *roaringBitmap) MarshalBinary() ([]byte, error) {
|
||||||
|
if m == nil {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
return m.Map.MarshalBinary()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *roaringBitmap) UnmarshalBinary(data []byte) (res *roaringBitmap, err error) {
|
||||||
|
res = &roaringBitmap{
|
||||||
|
Map: roaring.New(),
|
||||||
|
}
|
||||||
|
err = res.Map.UnmarshalBinary(data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *roaring64Bitmap) MarshalBinary() ([]byte, error) {
|
||||||
|
if m == nil {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
return m.Map.MarshalBinary()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *roaring64Bitmap) UnmarshalBinary(data []byte) (res *roaring64Bitmap, err error) {
|
||||||
|
res = &roaring64Bitmap{
|
||||||
|
Map: roaring64.New(),
|
||||||
|
}
|
||||||
|
err = res.Map.UnmarshalBinary(data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bitmap alias type of types.Binary[*roaringBitmap]
|
||||||
|
type Bitmap = types.Binary[*roaringBitmap]
|
||||||
|
|
||||||
|
// NullBitmap alias type of types.NullBinary[*roaringBitmap]
|
||||||
|
type NullBitmap = types.NullBinary[*roaringBitmap]
|
||||||
|
|
||||||
|
// Bitmap64 alias type of types.Binary[*roaring64Bitmap]
|
||||||
|
type Bitmap64 = types.Binary[*roaring64Bitmap]
|
||||||
|
|
||||||
|
// NullBitmap64 alias type of types.NullBinary[*roaring64Bitmap]
|
||||||
|
type NullBitmap64 = types.NullBinary[*roaring64Bitmap]
|
||||||
|
|
||||||
|
// NewBitmap create a Bitmap instance
|
||||||
|
func NewBitmap() (res *Bitmap) {
|
||||||
|
return &types.Binary[*roaringBitmap]{
|
||||||
|
Data: &roaringBitmap{
|
||||||
|
Map: roaring.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNullBitmap create a NullBitmap instance
|
||||||
|
func NewNullBitmap() *NullBitmap {
|
||||||
|
return &types.NullBinary[*roaringBitmap]{
|
||||||
|
Data: &roaringBitmap{
|
||||||
|
Map: roaring.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBitmap64 create a Bitmap64 instance
|
||||||
|
func NewBitmap64() *Bitmap64 {
|
||||||
|
return &types.Binary[*roaring64Bitmap]{
|
||||||
|
Data: &roaring64Bitmap{
|
||||||
|
Map: roaring64.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNullBitmap64 create a NullBitmap64 instance
|
||||||
|
func NewNullBitmap64() *NullBitmap64 {
|
||||||
|
return &types.NullBinary[*roaring64Bitmap]{
|
||||||
|
Data: &roaring64Bitmap{
|
||||||
|
Map: roaring64.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustBitmap create a Bitmap instance
|
||||||
|
func MustBitmap(data ...[]byte) (res *Bitmap) {
|
||||||
|
res = &types.Binary[*roaringBitmap]{
|
||||||
|
Data: &roaringBitmap{
|
||||||
|
Map: roaring.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if len(data) > 0 && len(data[0]) > 0 {
|
||||||
|
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustNullBitmap create a NullBitmap instance
|
||||||
|
func MustNullBitmap(data ...[]byte) (res *NullBitmap) {
|
||||||
|
res = &types.NullBinary[*roaringBitmap]{
|
||||||
|
Data: &roaringBitmap{
|
||||||
|
Map: roaring.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if len(data) > 0 && len(data[0]) > 0 {
|
||||||
|
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustBitmap64 create a Bitmap64 instance
|
||||||
|
func MustBitmap64(data ...[]byte) (res *Bitmap64) {
|
||||||
|
res = &types.Binary[*roaring64Bitmap]{
|
||||||
|
Data: &roaring64Bitmap{
|
||||||
|
Map: roaring64.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if len(data) > 0 && len(data[0]) > 0 {
|
||||||
|
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustNullBitmap64 create a NullBitmap64 instance
|
||||||
|
func MustNullBitmap64(data ...[]byte) (res *NullBitmap64) {
|
||||||
|
res = &types.NullBinary[*roaring64Bitmap]{
|
||||||
|
Data: &roaring64Bitmap{
|
||||||
|
Map: roaring64.New(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if len(data) > 0 && len(data[0]) > 0 {
|
||||||
|
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright 2023 ROC. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package types_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
|
"github.com/rocboss/paopao-ce/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("Bitmap", Ordered, func() {
|
||||||
|
It("sql scaner for Bitmap", func() {
|
||||||
|
bitmap := types.NewBitmap()
|
||||||
|
bitmap.Data.Map.Add(128)
|
||||||
|
value, err := bitmap.Value()
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
var bm types.Bitmap
|
||||||
|
bm.Scan(value)
|
||||||
|
Expect(bm.Data.Map.Contains(128)).To(BeTrue())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("sql scaner for Bitmap64", func() {
|
||||||
|
bitmap := types.NewBitmap64()
|
||||||
|
bitmap.Data.Map.Add(128)
|
||||||
|
value, err := bitmap.Value()
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
var bm types.Bitmap64
|
||||||
|
bm.Scan(value)
|
||||||
|
Expect(bm.Data.Map.Contains(128)).To(BeTrue())
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in new issue