github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tables/indexwrapper/immutindex.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 indexwrapper 16 17 import ( 18 "github.com/RoaringBitmap/roaring" 19 "github.com/matrixorigin/matrixone/pkg/common/moerr" 20 "github.com/matrixorigin/matrixone/pkg/objectio" 21 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/buffer/base" 22 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" 23 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 24 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/index" 26 ) 27 28 var _ Index = (*immutableIndex)(nil) 29 30 type immutableIndex struct { 31 zmReader *ZmReader 32 bfReader *BfReader 33 } 34 35 func NewImmutableIndex() *immutableIndex { 36 return new(immutableIndex) 37 } 38 func (index *immutableIndex) BatchUpsert(keysCtx *index.KeysCtx, offset int) (err error) { 39 panic("not support") 40 } 41 func (index *immutableIndex) GetActiveRow(key any) ([]uint32, error) { panic("not support") } 42 func (index *immutableIndex) String() string { return "immutable" } 43 func (index *immutableIndex) Dedup(key any, _ func(row uint32) error) (err error) { 44 exist := index.zmReader.Contains(key) 45 // 1. if not in [min, max], key is definitely not found 46 if !exist { 47 return 48 } 49 if index.bfReader != nil { 50 exist, err = index.bfReader.MayContainsKey(key) 51 // 2. check bloomfilter has some error. return err 52 if err != nil { 53 err = TranslateError(err) 54 return 55 } 56 // 3. all keys were checked. definitely not 57 if !exist { 58 return 59 } 60 } 61 62 err = moerr.GetOkExpectedPossibleDup() 63 return 64 } 65 66 func (index *immutableIndex) BatchDedup( 67 keys containers.Vector, 68 skipfn func(row uint32) (err error), 69 ) (keyselects *roaring.Bitmap, err error) { 70 if keys.Length() == 1 { 71 err = index.Dedup(keys.Get(0), skipfn) 72 return 73 } 74 exist := index.zmReader.FastContainsAny(keys) 75 // 1. all keys are not in [min, max]. definitely not 76 if !exist { 77 return 78 } 79 if index.bfReader != nil { 80 exist, keyselects, err = index.bfReader.MayContainsAnyKeys(keys, nil) 81 // 2. check bloomfilter has some unknown error. return err 82 if err != nil { 83 err = TranslateError(err) 84 return 85 } 86 // 3. all keys were checked. definitely not 87 if !exist { 88 return 89 } 90 } 91 err = moerr.GetOkExpectedPossibleDup() 92 return 93 } 94 95 func (index *immutableIndex) Close() (err error) { 96 // TODO 97 return 98 } 99 100 func (index *immutableIndex) Destroy() (err error) { 101 if index.zmReader != nil { 102 if err = index.zmReader.Destroy(); err != nil { 103 return 104 } 105 } 106 if index.bfReader != nil { 107 err = index.bfReader.Destroy() 108 } 109 return 110 } 111 112 func (index *immutableIndex) ReadFrom( 113 bufMgr base.INodeManager, 114 fs *objectio.ObjectFS, 115 id *common.ID, 116 location string, 117 colDef *catalog.ColDef) (err error) { 118 id.Idx = uint16(colDef.Idx) 119 index.zmReader = newZmReader( 120 bufMgr, 121 colDef.Type, 122 *id, 123 fs, 124 id.Idx, 125 location) 126 127 if colDef.IsPrimary() { 128 index.bfReader = newBfReader( 129 id, 130 colDef.Type, 131 location, 132 bufMgr, 133 fs, 134 ) 135 } 136 return 137 }