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