Skip to content

Commit ee91046

Browse files
committed
Bump quaternary, tuned newBucked
1 parent 4c8d1d5 commit ee91046

File tree

3 files changed

+59
-41
lines changed

3 files changed

+59
-41
lines changed

bucket.go

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,47 @@
11
package table
22

3-
import "github.com/neurlang/quaternary"
4-
import "sync"
5-
import "math/bits"
6-
import "runtime"
3+
import quaternary "github.com/neurlang/quaternary/v1"
4+
//import "sync"
5+
//import "math/bits"
6+
//import "runtime"
77

88
type bucket struct {
99
data [][]string
10-
index map[[2]int][][]byte
10+
index [][][]byte
1111
//blooms [][]byte
1212
loglen int
1313
}
1414

1515
func (b *bucket) filter(j, c int, val string) uint64 {
16-
if b.index[[2]int{j, c}] == nil {
16+
if b.loglen == 0 {
1717
return 0
1818
}
19-
var f = quaternary.Filters(b.index[[2]int{j, c}])
20-
return f.GetStringMulti(val)
19+
if j >= len(b.index) {
20+
return 0
21+
}
22+
if c >= len(b.index[j]) {
23+
return 0
24+
}
25+
if b.index[j][c] == nil {
26+
return 0
27+
}
28+
ret := quaternary.GetNum(b.index[j][c], uint64(b.loglen), val)
29+
//println(&b.index[[2]int{j, c}][0], j, c, val, "->", ret, "(", b.loglen, ")")
30+
return ret
2131
}
2232

2333
func (ret *bucket) presentBucket(col int, val string) bool {
2434
return true
2535

2636
}
27-
func newBucket(rows [][]string) *bucket {
37+
/*
38+
func newBucketfast(rows [][]string) *bucket {
2839
// Initialize bucket and handle empty input
2940
ret := &bucket{
3041
data: rows,
31-
index: make(map[[2]int][][]byte),
42+
index: make(map[[2]int][]byte),
3243
}
33-
if len(rows) == 0 {
44+
if len(rows) <= 1 {
3445
ret.loglen = 0
3546
return ret
3647
}
@@ -139,8 +150,8 @@ func newBucket(rows [][]string) *bucket {
139150
}
140151
tasks := make(chan task, len(global))
141152
results := make(chan struct {
142-
ik [2]int
143-
fss [][]byte
153+
ik [2]int
154+
fs []byte
144155
}, nWorkers)
145156
146157
go func() {
@@ -155,15 +166,13 @@ func newBucket(rows [][]string) *bucket {
155166
go func() {
156167
defer wg.Done()
157168
for t := range tasks {
158-
var fs [][]byte
159-
for _, f := range quaternary.MakeStringMulti(byte(loglen), t.val) {
160-
if len(f) > 0 {
161-
fs = append(fs, f)
162-
}
163-
}
169+
var fs = quaternary.Make(t.val, byte(loglen))
170+
//for k, v := range t.val {
171+
//println(&fs[0], t.ikey[0], t.ikey[1], k, v, "(", loglen, ")")
172+
//}
164173
results <- struct {
165-
ik [2]int
166-
fss [][]byte
174+
ik [2]int
175+
fs []byte
167176
}{t.ikey, fs}
168177
}
169178
}()
@@ -175,35 +184,40 @@ func newBucket(rows [][]string) *bucket {
175184
}()
176185
177186
for r := range results {
178-
ret.index[r.ik] = append(ret.index[r.ik], r.fss...)
187+
ret.index[r.ik] = r.fs
179188
}
180189
181190
return ret
182191
}
183-
184-
func newBucketslow(rows [][]string) (ret *bucket) {
185-
var loglen = 0
186-
for i := 0; 1<<i < len(rows); i++ {
187-
loglen++
188-
}
192+
*/
193+
func newBucket(rows [][]string) (ret *bucket) {
189194
ret = &bucket{
190195
data: rows,
191-
index: make(map[[2]int][][]byte),
192-
loglen: loglen,
196+
loglen: 0,
193197
}
198+
if len(rows) <= 1 {
199+
return
200+
}
201+
for i := 0; 1<<i < len(rows); i++ {
202+
ret.loglen++
203+
}
204+
ret.index = make([][][]byte, ret.loglen+1, ret.loglen+1)
194205
var counter = make(map[struct {
195206
b int
196207
n int
197208
s string
198209
}]int)
199210
var collection = make(map[[2]int]map[string]uint64)
211+
var maxlen int
200212
for y := range rows {
213+
if len(rows[y]) > maxlen {
214+
maxlen = len(rows[y])
215+
}
201216
for x := range rows[y] {
202-
203217
// do other stuff
204218
var bval uint64
205219
key := rows[y][x]
206-
for b := 0; b < loglen; b++ {
220+
for b := 0; b < ret.loglen; b++ {
207221
cnt := counter[struct {
208222
b int
209223
n int
@@ -225,6 +239,9 @@ func newBucketslow(rows [][]string) (ret *bucket) {
225239
}
226240
}
227241
}
242+
for i := range ret.index {
243+
ret.index[i] = make([][]byte, maxlen, maxlen)
244+
}
228245
for k, w := range counter {
229246
intkey := [2]int{0, k.n}
230247
strkey := k.s
@@ -236,15 +253,16 @@ func newBucketslow(rows [][]string) (ret *bucket) {
236253
//println(strkey, "=>", boolval)
237254
}
238255
for key, val := range collection {
239-
for _, f := range quaternary.MakeStringMulti(byte(loglen), val) {
240-
if len(f) > 0 {
241-
ret.index[key] = append(ret.index[key], f)
242-
}
243-
}
256+
ret.index[key[0]][key[1]] = quaternary.Make(val, byte(ret.loglen))
257+
//for k, v := range val {
258+
//println(&ret.index[key][0], key[0], key[1], k, v, "(", ret.loglen, ")")
259+
//}
244260
}
245261
return
246262
}
247263

264+
265+
248266
func (b *bucket) countExisting(col int, val string) (out int) {
249267
if !b.presentBucket(col, val) {
250268
return 0

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module github.com/neurlang/table
22

3-
go 1.16
3+
go 1.18
44

5-
require github.com/neurlang/quaternary v0.1.2-0.20250702182454-357310351097
5+
require github.com/neurlang/quaternary v0.2.2

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
github.com/neurlang/quaternary v0.1.2-0.20250702182454-357310351097 h1:vI7gBLUgA8jM1D0KHgZjwDuTsmFyfbuEYsV2oa1nO+Q=
2-
github.com/neurlang/quaternary v0.1.2-0.20250702182454-357310351097/go.mod h1:yP32mjSy4ataxp2pwQ+RXUQoD0byfW50vzBjXs8GY5Y=
1+
github.com/neurlang/quaternary v0.2.2 h1:XnvZoMLQUsK2yymCgC632ux2sj+71UQNYgmoc5ghPCo=
2+
github.com/neurlang/quaternary v0.2.2/go.mod h1:yP32mjSy4ataxp2pwQ+RXUQoD0byfW50vzBjXs8GY5Y=

0 commit comments

Comments
 (0)