Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for reverse order for ItemSketches and rename the type utility struct from SerDe to Ops #19

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,40 +23,45 @@ import (
"math"
)

type ArrayOfDoublesSerDe struct {
type ArrayOfDoublesOps struct {
ReverseOrder bool

scratch [8]byte
}

func (f ArrayOfDoublesSerDe) Identity() float64 {
func (f ArrayOfDoublesOps) Identity() float64 {
return 0
}

func (f ArrayOfDoublesSerDe) Hash(item float64) uint64 {
func (f ArrayOfDoublesOps) Hash(item float64) uint64 {
binary.LittleEndian.PutUint64(f.scratch[:], math.Float64bits(item))
return murmur3.SeedSum64(_DEFAULT_SERDE_HASH_SEED, f.scratch[:])
}

func (f ArrayOfDoublesSerDe) LessFn() LessFn[float64] {
func (f ArrayOfDoublesOps) CompareFn() CompareFn[float64] {
return func(a float64, b float64) bool {
if f.ReverseOrder {
return a > b
}
return a < b
}
}

func (f ArrayOfDoublesSerDe) SizeOf(item float64) int {
func (f ArrayOfDoublesOps) SizeOf(item float64) int {
return 8
}

func (f ArrayOfDoublesSerDe) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
func (f ArrayOfDoublesOps) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
return numItems * 8, nil
}

func (f ArrayOfDoublesSerDe) SerializeOneToSlice(item float64) []byte {
func (f ArrayOfDoublesOps) SerializeOneToSlice(item float64) []byte {
bytes := make([]byte, 8)
binary.LittleEndian.PutUint64(bytes, math.Float64bits(item))
return bytes
}

func (f ArrayOfDoublesSerDe) SerializeManyToSlice(item []float64) []byte {
func (f ArrayOfDoublesOps) SerializeManyToSlice(item []float64) []byte {
if len(item) == 0 {
return []byte{}
}
Expand All @@ -69,7 +74,7 @@ func (f ArrayOfDoublesSerDe) SerializeManyToSlice(item []float64) []byte {
return bytes
}

func (f ArrayOfDoublesSerDe) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]float64, error) {
func (f ArrayOfDoublesOps) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]float64, error) {
if numItems == 0 {
return []float64{}, nil
}
Expand Down
23 changes: 14 additions & 9 deletions common/array_of_longs_serde.go → common/array_of_longs_ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,40 +22,45 @@ import (
"github.com/twmb/murmur3"
)

type ArrayOfLongsSerDe struct {
type ArrayOfLongsOps struct {
ReverseOrder bool

scratch [8]byte
}

func (f ArrayOfLongsSerDe) Identity() int64 {
func (f ArrayOfLongsOps) Identity() int64 {
return 0
}

func (f ArrayOfLongsSerDe) Hash(item int64) uint64 {
func (f ArrayOfLongsOps) Hash(item int64) uint64 {
binary.LittleEndian.PutUint64(f.scratch[:], uint64(item))
return murmur3.SeedSum64(_DEFAULT_SERDE_HASH_SEED, f.scratch[:])
}

func (f ArrayOfLongsSerDe) LessFn() LessFn[int64] {
func (f ArrayOfLongsOps) CompareFn() CompareFn[int64] {
return func(a int64, b int64) bool {
if f.ReverseOrder {
return a > b
}
return a < b
}
}

func (f ArrayOfLongsSerDe) SizeOf(item int64) int {
func (f ArrayOfLongsOps) SizeOf(item int64) int {
return 8
}

func (f ArrayOfLongsSerDe) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
func (f ArrayOfLongsOps) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
return numItems * 8, nil
}

func (f ArrayOfLongsSerDe) SerializeOneToSlice(item int64) []byte {
func (f ArrayOfLongsOps) SerializeOneToSlice(item int64) []byte {
bytes := make([]byte, 8)
binary.LittleEndian.PutUint64(bytes, uint64(item))
return bytes
}

func (f ArrayOfLongsSerDe) SerializeManyToSlice(item []int64) []byte {
func (f ArrayOfLongsOps) SerializeManyToSlice(item []int64) []byte {
if len(item) == 0 {
return []byte{}
}
Expand All @@ -68,7 +73,7 @@ func (f ArrayOfLongsSerDe) SerializeManyToSlice(item []int64) []byte {
return bytes
}

func (f ArrayOfLongsSerDe) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]int64, error) {
func (f ArrayOfLongsOps) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]int64, error) {
if numItems == 0 {
return []int64{}, nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,36 @@ import (
"github.com/twmb/murmur3"
)

type ArrayOfStringsSerDe struct {
type ArrayOfStringsOps struct {
ReverseOrder bool
}

func (f ArrayOfStringsSerDe) Identity() string {
func (f ArrayOfStringsOps) Identity() string {
return ""
}

func (f ArrayOfStringsSerDe) Hash(item string) uint64 {
func (f ArrayOfStringsOps) Hash(item string) uint64 {
datum := unsafe.Slice(unsafe.StringData(item), len(item))
return murmur3.SeedSum64(_DEFAULT_SERDE_HASH_SEED, datum[:])
}

func (f ArrayOfStringsSerDe) LessFn() LessFn[string] {
func (f ArrayOfStringsOps) CompareFn() CompareFn[string] {
return func(a string, b string) bool {
if f.ReverseOrder {
return a > b
}
return a < b
}
}

func (f ArrayOfStringsSerDe) SizeOf(item string) int {
func (f ArrayOfStringsOps) SizeOf(item string) int {
if len(item) == 0 {
return int(unsafe.Sizeof(uint32(0)))
}
return len(item) + int(unsafe.Sizeof(uint32(0)))
}

func (f ArrayOfStringsSerDe) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
func (f ArrayOfStringsOps) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) {
if numItems <= 0 {
return 0, nil
}
Expand All @@ -71,7 +75,7 @@ func (f ArrayOfStringsSerDe) SizeOfMany(mem []byte, offsetBytes int, numItems in
return offset - offsetBytes, nil
}

func (f ArrayOfStringsSerDe) SerializeOneToSlice(item string) []byte {
func (f ArrayOfStringsOps) SerializeOneToSlice(item string) []byte {
if len(item) == 0 {
return []byte{}
}
Expand All @@ -82,7 +86,7 @@ func (f ArrayOfStringsSerDe) SerializeOneToSlice(item string) []byte {
return bytesOut
}

func (f ArrayOfStringsSerDe) SerializeManyToSlice(item []string) []byte {
func (f ArrayOfStringsOps) SerializeManyToSlice(item []string) []byte {
if len(item) == 0 {
return []byte{}
}
Expand All @@ -105,7 +109,7 @@ func (f ArrayOfStringsSerDe) SerializeManyToSlice(item []string) []byte {
return bytesOut
}

func (f ArrayOfStringsSerDe) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]string, error) {
func (f ArrayOfStringsOps) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]string, error) {
if numItems <= 0 {
return []string{}, nil
}
Expand Down
4 changes: 2 additions & 2 deletions common/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@

package common

type LessFn[C comparable] func(C, C) bool
type CompareFn[C comparable] func(C, C) bool

type ItemSketchOp[C comparable] interface {
Identity() C
Hash(item C) uint64
LessFn() LessFn[C]
CompareFn() CompareFn[C]
SizeOf(item C) int
SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error)
SerializeManyToSlice(items []C) []byte
Expand Down
2 changes: 1 addition & 1 deletion examples/frequency_example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (

func TestFrequencyItemsSketch(t *testing.T) {
// Create a new sketch with a maximum of 16 items
sketch, err := frequencies.NewFrequencyItemsSketchWithMaxMapSize[string](16, common.ArrayOfStringsSerDe{})
sketch, err := frequencies.NewFrequencyItemsSketchWithMaxMapSize[string](16, common.ArrayOfStringsOps{})
assert.NoError(t, err)

// Update the sketch with some items
Expand Down
2 changes: 1 addition & 1 deletion examples/kll_example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (

func TestKllItemsSketch(t *testing.T) {
// Create a new KLL sketch
sketch, err := kll.NewKllItemsSketchWithDefault[string](common.ArrayOfStringsSerDe{})
sketch, err := kll.NewKllItemsSketchWithDefault[string](common.ArrayOfStringsOps{})
assert.NoError(t, err)

// Update the sketch with 1000 items
Expand Down
Loading
Loading