11package 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
88type bucket struct {
99 data [][]string
10- index map [[ 2 ] int ][][]byte
10+ index [ ][][]byte
1111 //blooms [][]byte
1212 loglen int
1313}
1414
1515func (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
2333func (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+
248266func (b * bucket ) countExisting (col int , val string ) (out int ) {
249267 if ! b .presentBucket (col , val ) {
250268 return 0
0 commit comments