github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/vector.go (about) 1 // Copyright 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package containers 16 17 import ( 18 "bytes" 19 "io" 20 "unsafe" 21 22 "github.com/RoaringBitmap/roaring" 23 "github.com/RoaringBitmap/roaring/roaring64" 24 "github.com/matrixorigin/matrixone/pkg/common/mpool" 25 "github.com/matrixorigin/matrixone/pkg/compress" 26 "github.com/matrixorigin/matrixone/pkg/container/types" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 28 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl" 29 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl/containers" 30 ) 31 32 type internalVector interface { 33 Vector 34 forEachWindowWithBias(offset, length int, op ItOp, 35 sels *roaring.Bitmap, bias int) (err error) 36 } 37 38 type vector[T any] struct { 39 stlvec stl.Vector[T] 40 impl internalVector 41 typ types.Type 42 nulls *roaring64.Bitmap 43 roStorage []byte 44 } 45 46 func NewVector[T any](typ types.Type, nullable bool, opts ...Options) *vector[T] { 47 vec := &vector[T]{ 48 stlvec: containers.NewVector[T](opts...), 49 typ: typ, 50 } 51 if nullable { 52 vec.impl = newNullableVecImpl(vec) 53 } else { 54 vec.impl = newVecImpl(vec) 55 } 56 return vec 57 } 58 59 // func NewEmptyVector[T any](typ types.Type, opts ...*Options) *vector[T] { 60 // vec := new(vector[T]) 61 // vec.typ = typ 62 // vec.stlvec = container.NewVector[T](opts...) 63 // return vec 64 // } 65 66 func (vec *vector[T]) Equals(o Vector) bool { 67 if vec.Length() != o.Length() { 68 return false 69 } 70 if vec.GetType() != o.GetType() { 71 return false 72 } 73 if vec.Nullable() != o.Nullable() { 74 return false 75 } 76 if vec.HasNull() != o.HasNull() { 77 return false 78 } 79 if vec.HasNull() { 80 if !vec.NullMask().Equals(o.NullMask()) { 81 return false 82 } 83 } 84 mask := vec.NullMask() 85 for i := 0; i < vec.Length(); i++ { 86 if mask != nil && mask.ContainsInt(i) { 87 continue 88 } 89 var v T 90 if _, ok := any(v).([]byte); ok { 91 if !bytes.Equal(vec.Get(i).([]byte), o.Get(i).([]byte)) { 92 return false 93 } 94 } else if _, ok := any(v).(types.Decimal64); ok { 95 d := vec.Get(i).(types.Decimal64) 96 od := vec.Get(i).(types.Decimal64) 97 if d.Ne(od) { 98 return false 99 } 100 } else if _, ok := any(v).(types.Decimal128); ok { 101 d := vec.Get(i).(types.Decimal128) 102 od := vec.Get(i).(types.Decimal128) 103 if d.Ne(od) { 104 return false 105 } 106 } else if _, ok := any(v).(types.TS); ok { 107 d := vec.Get(i).(types.TS) 108 od := vec.Get(i).(types.TS) 109 if types.CompareTSTSAligned(d, od) != 0 { 110 return false 111 } 112 } else if _, ok := any(v).(types.Rowid); ok { 113 d := vec.Get(i).(types.Rowid) 114 od := vec.Get(i).(types.Rowid) 115 if types.CompareRowidRowidAligned(d, od) != 0 { 116 return false 117 } 118 } else { 119 if vec.Get(i) != o.Get(i) { 120 return false 121 } 122 } 123 } 124 return true 125 } 126 func (vec *vector[T]) IsView() bool { return vec.impl.IsView() } 127 func (vec *vector[T]) Nullable() bool { return vec.impl.Nullable() } 128 func (vec *vector[T]) IsNull(i int) bool { return vec.impl.IsNull(i) } 129 func (vec *vector[T]) HasNull() bool { return vec.impl.HasNull() } 130 func (vec *vector[T]) NullMask() *roaring64.Bitmap { return vec.impl.NullMask() } 131 func (vec *vector[T]) Bytes() *Bytes { return vec.impl.Bytes() } 132 func (vec *vector[T]) Data() []byte { return vec.impl.Data() } 133 func (vec *vector[T]) DataWindow(offset, length int) []byte { 134 return vec.impl.DataWindow(offset, length) 135 } 136 func (vec *vector[T]) CloneWindow(offset, length int, allocator ...*mpool.MPool) Vector { 137 opts := Options{} 138 if len(allocator) == 0 { 139 opts.Allocator = vec.GetAllocator() 140 } else { 141 opts.Allocator = allocator[0] 142 } 143 cloned := NewVector[T](vec.typ, vec.Nullable(), opts) 144 if vec.nulls != nil { 145 if offset == 0 || length == vec.Length() { 146 cloned.nulls = vec.nulls.Clone() 147 if length < vec.Length() { 148 cloned.nulls.RemoveRange(uint64(length), uint64(vec.Length())) 149 } 150 } else { 151 cloned.nulls = roaring64.New() 152 for i := offset; i < offset+length; i++ { 153 if vec.nulls.ContainsInt(i) { 154 cloned.nulls.AddInt(i - offset) 155 } 156 } 157 } 158 } 159 cloned.stlvec.Close() 160 cloned.stlvec = vec.stlvec.Clone(offset, length, allocator...) 161 return cloned 162 } 163 func (vec *vector[T]) fastSlice() []T { 164 return vec.stlvec.Slice() 165 } 166 func (vec *vector[T]) Slice() any { 167 return vec.stlvec.Slice() 168 } 169 func (vec *vector[T]) SlicePtr() unsafe.Pointer { 170 return vec.stlvec.SlicePtr() 171 } 172 173 func (vec *vector[T]) Get(i int) (v any) { return vec.impl.Get(i) } 174 func (vec *vector[T]) Update(i int, v any) { vec.impl.Update(i, v) } 175 func (vec *vector[T]) Delete(i int) { vec.impl.Delete(i) } 176 func (vec *vector[T]) Compact(deletes *roaring.Bitmap) { vec.impl.Compact(deletes) } 177 func (vec *vector[T]) Append(v any) { vec.impl.Append(v) } 178 func (vec *vector[T]) AppendMany(vs ...any) { vec.impl.AppendMany(vs...) } 179 func (vec *vector[T]) AppendNoNulls(s any) { vec.impl.AppendNoNulls(s) } 180 func (vec *vector[T]) Extend(o Vector) { vec.impl.Extend(o) } 181 func (vec *vector[T]) ExtendWithOffset(src Vector, srcOff, srcLen int) { 182 vec.impl.ExtendWithOffset(src, srcOff, srcLen) 183 } 184 185 // func (vec *vector[T]) ExtendView(o VectorView) { vec.impl.ExtendView(o) } 186 func (vec *vector[T]) Length() int { return vec.impl.Length() } 187 func (vec *vector[T]) Capacity() int { return vec.impl.Capacity() } 188 func (vec *vector[T]) Allocated() int { return vec.impl.Allocated() } 189 190 func (vec *vector[T]) GetAllocator() *mpool.MPool { return vec.stlvec.GetAllocator() } 191 func (vec *vector[T]) GetType() types.Type { return vec.typ } 192 func (vec *vector[T]) String() string { return vec.impl.String() } 193 func (vec *vector[T]) PPString(num int) string { return vec.impl.PPString(num) } 194 func (vec *vector[T]) Close() { vec.impl.Close() } 195 196 func (vec *vector[T]) cow() { 197 vec.stlvec = vec.stlvec.Clone(0, vec.stlvec.Length()) 198 vec.releaseRoStorage() 199 } 200 func (vec *vector[T]) releaseRoStorage() { 201 if vec.roStorage != nil { 202 vec.GetAllocator().Free(vec.roStorage) 203 } 204 vec.roStorage = nil 205 } 206 207 func (vec *vector[T]) Window(offset, length int) Vector { 208 return &vectorWindow[T]{ 209 ref: vec, 210 windowBase: &windowBase{ 211 offset: offset, 212 length: length, 213 }, 214 } 215 } 216 217 func (vec *vector[T]) WriteTo(w io.Writer) (n int64, err error) { 218 var nr int 219 var tmpn int64 220 // 1. Vector type 221 vt := vec.GetType() 222 if nr, err = w.Write(types.EncodeType(&vt)); err != nil { 223 return 224 } 225 n += int64(nr) 226 // 2. Nullable 227 if nr, err = w.Write(types.EncodeFixed(vec.Nullable())); err != nil { 228 return 229 } 230 n += int64(nr) 231 // 3. Vector data 232 if tmpn, err = vec.stlvec.WriteTo(w); err != nil { 233 return 234 } 235 n += tmpn 236 if !vec.Nullable() { 237 return 238 } 239 // 4. Nulls 240 var nullBuf []byte 241 if vec.nulls != nil { 242 if nullBuf, err = vec.nulls.ToBytes(); err != nil { 243 return 244 } 245 } 246 if nr, err = w.Write(types.EncodeFixed(uint32(len(nullBuf)))); err != nil { 247 return 248 } 249 n += int64(nr) 250 if len(nullBuf) == 0 { 251 return 252 } 253 if nr, err = w.Write(nullBuf); err != nil { 254 return 255 } 256 n += int64(nr) 257 258 return 259 } 260 261 func (vec *vector[T]) ReadFrom(r io.Reader) (n int64, err error) { 262 vec.releaseRoStorage() 263 var tmpn int64 264 // 1. Vector type 265 typeBuf := make([]byte, types.TSize) 266 if _, err = r.Read(typeBuf); err != nil { 267 return 268 } 269 vec.typ = types.DecodeType(typeBuf) 270 n += int64(len(typeBuf)) 271 272 // 2. Nullable 273 oneBuf := make([]byte, 1) 274 if _, err = r.Read(oneBuf); err != nil { 275 return 276 } 277 nullable := types.DecodeFixed[bool](oneBuf) 278 n += 1 279 280 if nullable { 281 vec.impl = newNullableVecImpl(vec) 282 } else { 283 vec.impl = newVecImpl(vec) 284 } 285 286 // 3. Data 287 if tmpn, err = vec.stlvec.ReadFrom(r); err != nil { 288 return 289 } 290 n += tmpn 291 292 // 4. Null 293 if !nullable { 294 return 295 } 296 fourBuf := make([]byte, int(unsafe.Sizeof(uint32(0)))) 297 if _, err = r.Read(fourBuf); err != nil { 298 return 299 } 300 n += int64(len(fourBuf)) 301 nullSize := types.DecodeFixed[uint32](fourBuf) 302 if nullSize == 0 { 303 return 304 } 305 vec.nulls = roaring64.New() 306 if tmpn, err = vec.nulls.ReadFrom(r); err != nil { 307 return 308 } 309 n += tmpn 310 return 311 } 312 313 func (vec *vector[T]) ReadFromFile(f common.IVFile, buffer *bytes.Buffer) (err error) { 314 vec.releaseRoStorage() 315 stat := f.Stat() 316 var n []byte 317 var buf []byte 318 var tmpNode []byte 319 if stat.CompressAlgo() != compress.None { 320 osize := int(stat.OriginSize()) 321 size := stat.Size() 322 tmpNode, err = vec.GetAllocator().Alloc(int(size)) 323 if err != nil { 324 return 325 } 326 defer vec.GetAllocator().Free(tmpNode) 327 srcBuf := tmpNode[:size] 328 if _, err = f.Read(srcBuf); err != nil { 329 return 330 } 331 if buffer == nil { 332 n, err = vec.GetAllocator().Alloc(osize) 333 if err != nil { 334 return 335 } 336 buf = n[:osize] 337 } else { 338 buffer.Reset() 339 if osize > buffer.Cap() { 340 buffer.Grow(osize) 341 } 342 buf = buffer.Bytes()[:osize] 343 } 344 if _, err = compress.Decompress(srcBuf, buf, compress.Lz4); err != nil { 345 if n != nil { 346 vec.GetAllocator().Free(n) 347 } 348 return 349 } 350 } 351 vec.typ = types.DecodeType(buf[:types.TSize]) 352 buf = buf[types.TSize:] 353 354 nullable := types.DecodeFixed[bool](buf[:1]) 355 buf = buf[1:] 356 357 if nullable { 358 vec.impl = newNullableVecImpl(vec) 359 } else { 360 vec.impl = newVecImpl(vec) 361 } 362 var nr int64 363 if nr, err = vec.stlvec.InitFromSharedBuf(buf); err != nil { 364 if n != nil { 365 vec.GetAllocator().Free(n) 366 } 367 return 368 } 369 buf = buf[nr:] 370 if !nullable { 371 vec.roStorage = n 372 return 373 } 374 375 nullSize := types.DecodeFixed[uint32](buf[:4]) 376 buf = buf[4:] 377 if nullSize > 0 { 378 nullBuf := buf[:nullSize] 379 nulls := roaring64.New() 380 r := bytes.NewBuffer(nullBuf) 381 if _, err = nulls.ReadFrom(r); err != nil { 382 if n != nil { 383 vec.GetAllocator().Free(n) 384 } 385 return 386 } 387 vec.nulls = nulls 388 } 389 vec.roStorage = n 390 return 391 } 392 393 func (vec *vector[T]) Foreach(op ItOp, sels *roaring.Bitmap) (err error) { 394 return vec.impl.ForeachWindow(0, vec.Length(), op, sels) 395 } 396 397 func (vec *vector[T]) ForeachWindow(offset, length int, op ItOp, sels *roaring.Bitmap) (err error) { 398 return vec.impl.ForeachWindow(offset, length, op, sels) 399 } 400 401 func (vec *vector[T]) GetView() (view VectorView) { 402 return newVecView(vec) 403 } 404 405 func (vec *vector[T]) ResetWithData(bs *Bytes, nulls *roaring64.Bitmap) { 406 vec.releaseRoStorage() 407 if vec.Nullable() { 408 vec.nulls = nulls 409 } 410 vec.stlvec.ReadBytes(bs, true) 411 } 412 413 func (vec *vector[T]) Reset() { 414 vec.releaseRoStorage() 415 vec.stlvec.Reset() 416 vec.nulls = nil 417 }