github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/vecbase.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 "fmt" 20 "io" 21 "unsafe" 22 23 "github.com/RoaringBitmap/roaring" 24 "github.com/RoaringBitmap/roaring/roaring64" 25 "github.com/matrixorigin/matrixone/pkg/common/mpool" 26 "github.com/matrixorigin/matrixone/pkg/container/types" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 28 ) 29 30 type vecBase[T any] struct { 31 derived *vector[T] 32 } 33 34 func newVecBase[T any](derived *vector[T]) *vecBase[T] { 35 return &vecBase[T]{ 36 derived: derived, 37 } 38 } 39 40 func (base *vecBase[T]) Window(offset, length int) Vector { panic("not supported") } 41 func (base *vecBase[T]) CloneWindow(_, _ int, _ ...*mpool.MPool) Vector { panic("not supported") } 42 func (base *vecBase[T]) ResetWithData(_ *Bytes, _ *roaring64.Bitmap) { panic("not supported") } 43 func (base *vecBase[T]) Reset() { panic("not supported") } 44 func (base *vecBase[T]) Equals(o Vector) bool { panic("not supported") } 45 func (base *vecBase[T]) IsView() bool { return false } 46 func (base *vecBase[T]) Nullable() bool { return false } 47 func (base *vecBase[T]) IsNull(i int) bool { return false } 48 func (base *vecBase[T]) HasNull() bool { return false } 49 func (base *vecBase[T]) NullMask() *roaring64.Bitmap { return base.derived.nulls } 50 func (base *vecBase[T]) Slice() any { panic("not supported") } 51 func (base *vecBase[T]) SlicePtr() unsafe.Pointer { panic("not supported") } 52 func (base *vecBase[T]) Data() []byte { return base.derived.stlvec.Data() } 53 func (base *vecBase[T]) DataWindow(offset, length int) []byte { 54 return base.derived.stlvec.DataWindow(offset, length) 55 } 56 func (base *vecBase[T]) Bytes() *Bytes { return base.derived.stlvec.Bytes() } 57 func (base *vecBase[T]) Get(i int) (v any) { return base.derived.stlvec.Get(i) } 58 59 func (base *vecBase[T]) tryCOW() { 60 if base.derived.roStorage != nil { 61 base.derived.cow() 62 } 63 } 64 65 // Modification 66 func (base *vecBase[T]) Update(i int, v any) { base.derived.stlvec.Update(i, v.(T)) } 67 func (base *vecBase[T]) Delete(i int) { base.derived.stlvec.Delete(i) } 68 func (base *vecBase[T]) Compact(deletes *roaring.Bitmap) { 69 if deletes == nil || deletes.IsEmpty() { 70 return 71 } 72 base.derived.stlvec.BatchDelete( 73 deletes.Iterator(), 74 int(deletes.GetCardinality())) 75 } 76 func (base *vecBase[T]) Append(v any) { 77 base.tryCOW() 78 base.derived.stlvec.Append(v.(T)) 79 } 80 func (base *vecBase[T]) AppendMany(vs ...any) { 81 base.tryCOW() 82 for _, v := range vs { 83 base.Append(v) 84 } 85 } 86 func (base *vecBase[T]) AppendNoNulls(s any) { 87 base.tryCOW() 88 slice := s.([]T) 89 base.derived.stlvec.AppendMany(slice...) 90 } 91 func (base *vecBase[T]) Extend(o Vector) { 92 base.ExtendWithOffset(o, 0, o.Length()) 93 } 94 95 func (base *vecBase[T]) extendData(src Vector, srcOff, srcLen int) { 96 if srcLen < 1 { 97 return 98 } 99 if base.derived.typ.IsVarlen() { 100 bs := src.Bytes() 101 for i := srcOff; i < srcOff+srcLen; i++ { 102 base.derived.stlvec.Append(any(bs.GetVarValueAt(i)).(T)) 103 } 104 return 105 } 106 slice := unsafe.Slice((*T)(src.SlicePtr()), srcOff+srcLen) 107 base.derived.stlvec.AppendMany(slice[srcOff : srcOff+srcLen]...) 108 } 109 110 func (base *vecBase[T]) ExtendWithOffset(src Vector, srcOff, srcLen int) { 111 if srcLen <= 0 { 112 return 113 } 114 base.tryCOW() 115 base.extendData(src, srcOff, srcLen) 116 } 117 118 func (base *vecBase[T]) Length() int { return base.derived.stlvec.Length() } 119 func (base *vecBase[T]) Capacity() int { return base.derived.stlvec.Capacity() } 120 func (base *vecBase[T]) Allocated() int { 121 if base.derived.roStorage != nil { 122 return len(base.derived.roStorage) 123 } 124 return base.derived.stlvec.Allocated() 125 } 126 127 func (base *vecBase[T]) GetAllocator() *mpool.MPool { return base.derived.stlvec.GetAllocator() } 128 func (base *vecBase[T]) GetType() types.Type { return base.derived.typ } 129 func (base *vecBase[T]) String() string { 130 s := base.derived.stlvec.String() 131 if base.derived.roStorage != nil { 132 s = fmt.Sprintf("%s;[RoAlloc=%d]", s, len(base.derived.roStorage)) 133 } 134 return s 135 } 136 func (base *vecBase[T]) PPString(num int) string { 137 var w bytes.Buffer 138 _, _ = w.WriteString(fmt.Sprintf("[T=%s][Len=%d][Data=(", base.GetType().String(), base.Length())) 139 limit := base.Length() 140 if num > 0 && num < limit { 141 limit = num 142 } 143 size := base.Length() 144 long := false 145 if size > limit { 146 long = true 147 size = limit 148 } 149 for i := 0; i < size; i++ { 150 if base.IsNull(i) { 151 _, _ = w.WriteString("null") 152 continue 153 } 154 if base.GetType().IsVarlen() { 155 _, _ = w.WriteString(fmt.Sprintf("%s, ", base.Get(i).([]byte))) 156 } else { 157 _, _ = w.WriteString(fmt.Sprintf("%v, ", base.Get(i))) 158 } 159 } 160 if long { 161 _, _ = w.WriteString("...") 162 } 163 _, _ = w.WriteString(")]") 164 return w.String() 165 } 166 167 func (base *vecBase[T]) Close() { 168 base.derived.releaseRoStorage() 169 base.derived.stlvec.Close() 170 } 171 func (base *vecBase[T]) WriteTo(w io.Writer) (n int64, err error) { panic("not supported") } 172 func (base *vecBase[T]) ReadFrom(r io.Reader) (n int64, err error) { panic("not supported") } 173 func (base *vecBase[T]) ReadFromFile(f common.IVFile, buffer *bytes.Buffer) (err error) { 174 panic("not supported") 175 } 176 177 func (base *vecBase[T]) Foreach(op ItOp, sels *roaring.Bitmap) (err error) { 178 panic("not supported") 179 } 180 181 func (base *vecBase[T]) ForeachWindow(offset, length int, op ItOp, sels *roaring.Bitmap) (err error) { 182 return base.forEachWindowWithBias(offset, length, op, sels, 0) 183 } 184 185 func (base *vecBase[T]) forEachWindowWithBias(offset, length int, op ItOp, sels *roaring.Bitmap, bias int) (err error) { 186 var v T 187 if _, ok := any(v).([]byte); !ok { 188 slice := base.derived.stlvec.Slice() 189 slice = slice[offset+bias : offset+length+bias] 190 if sels == nil || sels.IsEmpty() { 191 for i, elem := range slice { 192 if err = op(elem, i+offset); err != nil { 193 break 194 } 195 } 196 } else { 197 idxes := sels.ToArray() 198 end := offset + length 199 for _, idx := range idxes { 200 if int(idx) < offset { 201 continue 202 } else if int(idx) >= end { 203 break 204 } 205 if err = op(slice[int(idx)-offset], int(idx)); err != nil { 206 break 207 } 208 } 209 } 210 return 211 } 212 if sels == nil || sels.IsEmpty() { 213 for i := offset; i < offset+length; i++ { 214 elem := base.derived.stlvec.Get(i + bias) 215 if err = op(elem, i); err != nil { 216 break 217 } 218 } 219 return 220 } 221 222 idxes := sels.ToArray() 223 end := offset + length 224 for _, idx := range idxes { 225 if int(idx) < offset { 226 continue 227 } else if int(idx) >= end { 228 break 229 } 230 elem := base.derived.stlvec.Get(int(idx) + bias) 231 if err = op(elem, int(idx)); err != nil { 232 break 233 } 234 } 235 return 236 } 237 238 func (base *vecBase[T]) GetView() (view VectorView) { panic("not supported") }