github.com/parquet-go/parquet-go@v0.21.1-0.20240501160520-b3c3a0c3ed6f/dictionary_amd64.go (about) 1 //go:build !purego 2 3 package parquet 4 5 import ( 6 "unsafe" 7 8 "github.com/parquet-go/parquet-go/internal/unsafecast" 9 "github.com/parquet-go/parquet-go/sparse" 10 ) 11 12 //go:noescape 13 func dictionaryBoundsInt32(dict []int32, indexes []int32) (min, max int32, err errno) 14 15 //go:noescape 16 func dictionaryBoundsInt64(dict []int64, indexes []int32) (min, max int64, err errno) 17 18 //go:noescape 19 func dictionaryBoundsFloat32(dict []float32, indexes []int32) (min, max float32, err errno) 20 21 //go:noescape 22 func dictionaryBoundsFloat64(dict []float64, indexes []int32) (min, max float64, err errno) 23 24 //go:noescape 25 func dictionaryBoundsUint32(dict []uint32, indexes []int32) (min, max uint32, err errno) 26 27 //go:noescape 28 func dictionaryBoundsUint64(dict []uint64, indexes []int32) (min, max uint64, err errno) 29 30 //go:noescape 31 func dictionaryBoundsBE128(dict [][16]byte, indexes []int32) (min, max *[16]byte, err errno) 32 33 //go:noescape 34 func dictionaryLookup32(dict []uint32, indexes []int32, rows sparse.Array) errno 35 36 //go:noescape 37 func dictionaryLookup64(dict []uint64, indexes []int32, rows sparse.Array) errno 38 39 //go:noescape 40 func dictionaryLookupByteArrayString(dict []uint32, page []byte, indexes []int32, rows sparse.Array) errno 41 42 //go:noescape 43 func dictionaryLookupFixedLenByteArrayString(dict []byte, len int, indexes []int32, rows sparse.Array) errno 44 45 //go:noescape 46 func dictionaryLookupFixedLenByteArrayPointer(dict []byte, len int, indexes []int32, rows sparse.Array) errno 47 48 func (d *int32Dictionary) lookup(indexes []int32, rows sparse.Array) { 49 checkLookupIndexBounds(indexes, rows) 50 dict := unsafecast.Int32ToUint32(d.values) 51 dictionaryLookup32(dict, indexes, rows).check() 52 } 53 54 func (d *int64Dictionary) lookup(indexes []int32, rows sparse.Array) { 55 checkLookupIndexBounds(indexes, rows) 56 dict := unsafecast.Int64ToUint64(d.values) 57 dictionaryLookup64(dict, indexes, rows).check() 58 } 59 60 func (d *floatDictionary) lookup(indexes []int32, rows sparse.Array) { 61 checkLookupIndexBounds(indexes, rows) 62 dict := unsafecast.Float32ToUint32(d.values) 63 dictionaryLookup32(dict, indexes, rows).check() 64 } 65 66 func (d *doubleDictionary) lookup(indexes []int32, rows sparse.Array) { 67 checkLookupIndexBounds(indexes, rows) 68 dict := unsafecast.Float64ToUint64(d.values) 69 dictionaryLookup64(dict, indexes, rows).check() 70 } 71 72 func (d *byteArrayDictionary) lookupString(indexes []int32, rows sparse.Array) { 73 checkLookupIndexBounds(indexes, rows) 74 // TODO: this optimization is disabled for now because it appears to race 75 // with the garbage collector and result in writing pointers to free objects 76 // to the output. 77 // 78 // This command was used to trigger the problem: 79 // 80 // GOMAXPROCS=8 go test -run TestIssue368 -count 10 81 // 82 // https://github.com/segmentio/parquet-go/issues/368 83 // 84 //dictionaryLookupByteArrayString(d.offsets, d.values, indexes, rows).check() 85 for i, j := range indexes { 86 v := d.index(int(j)) 87 *(*string)(rows.Index(i)) = *(*string)(unsafe.Pointer(&v)) 88 } 89 } 90 91 func (d *fixedLenByteArrayDictionary) lookupString(indexes []int32, rows sparse.Array) { 92 checkLookupIndexBounds(indexes, rows) 93 //dictionaryLookupFixedLenByteArrayString(d.data, d.size, indexes, rows).check() 94 for i, j := range indexes { 95 v := d.index(j) 96 *(*string)(rows.Index(i)) = *(*string)(unsafe.Pointer(&v)) 97 } 98 } 99 100 func (d *uint32Dictionary) lookup(indexes []int32, rows sparse.Array) { 101 checkLookupIndexBounds(indexes, rows) 102 dictionaryLookup32(d.values, indexes, rows).check() 103 } 104 105 func (d *uint64Dictionary) lookup(indexes []int32, rows sparse.Array) { 106 checkLookupIndexBounds(indexes, rows) 107 dictionaryLookup64(d.values, indexes, rows).check() 108 } 109 110 func (d *be128Dictionary) lookupString(indexes []int32, rows sparse.Array) { 111 checkLookupIndexBounds(indexes, rows) 112 //dict := unsafecast.Uint128ToBytes(d.values) 113 //dictionaryLookupFixedLenByteArrayString(dict, 16, indexes, rows).check() 114 s := "0123456789ABCDEF" 115 for i, j := range indexes { 116 *(**[16]byte)(unsafe.Pointer(&s)) = d.index(j) 117 *(*string)(rows.Index(i)) = s 118 } 119 } 120 121 func (d *be128Dictionary) lookupPointer(indexes []int32, rows sparse.Array) { 122 checkLookupIndexBounds(indexes, rows) 123 //dict := unsafecast.Uint128ToBytes(d.values) 124 //dictionaryLookupFixedLenByteArrayPointer(dict, 16, indexes, rows).check() 125 for i, j := range indexes { 126 *(**[16]byte)(rows.Index(i)) = d.index(j) 127 } 128 } 129 130 func (d *int32Dictionary) bounds(indexes []int32) (min, max int32) { 131 min, max, err := dictionaryBoundsInt32(d.values, indexes) 132 err.check() 133 return min, max 134 } 135 136 func (d *int64Dictionary) bounds(indexes []int32) (min, max int64) { 137 min, max, err := dictionaryBoundsInt64(d.values, indexes) 138 err.check() 139 return min, max 140 } 141 142 func (d *floatDictionary) bounds(indexes []int32) (min, max float32) { 143 min, max, err := dictionaryBoundsFloat32(d.values, indexes) 144 err.check() 145 return min, max 146 } 147 148 func (d *doubleDictionary) bounds(indexes []int32) (min, max float64) { 149 min, max, err := dictionaryBoundsFloat64(d.values, indexes) 150 err.check() 151 return min, max 152 } 153 154 func (d *uint32Dictionary) bounds(indexes []int32) (min, max uint32) { 155 min, max, err := dictionaryBoundsUint32(d.values, indexes) 156 err.check() 157 return min, max 158 } 159 160 func (d *uint64Dictionary) bounds(indexes []int32) (min, max uint64) { 161 min, max, err := dictionaryBoundsUint64(d.values, indexes) 162 err.check() 163 return min, max 164 } 165 166 func (d *be128Dictionary) bounds(indexes []int32) (min, max *[16]byte) { 167 min, max, err := dictionaryBoundsBE128(d.values, indexes) 168 err.check() 169 return min, max 170 }