github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tables/jobs/helper.go (about) 1 // Copyright 2021 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 jobs 16 17 import ( 18 "fmt" 19 20 "github.com/matrixorigin/matrixone/pkg/logutil" 21 "github.com/matrixorigin/matrixone/pkg/objectio" 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/iface/txnif" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables/indexwrapper" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks" 28 "go.uber.org/zap" 29 ) 30 31 func BuildColumnIndex(writer objectio.Writer, block objectio.BlockObject, colDef *catalog.ColDef, columnData containers.Vector, isPk, isSorted bool) (metas []indexwrapper.IndexMeta, err error) { 32 zmPos := 0 33 34 zoneMapWriter := indexwrapper.NewZMWriter() 35 if err = zoneMapWriter.Init(writer, block, common.Plain, uint16(colDef.Idx), uint16(zmPos)); err != nil { 36 return 37 } 38 if isSorted && isPk && columnData.Length() > 2 { 39 slimForZmVec := containers.MakeVector(columnData.GetType(), columnData.Nullable()) 40 defer slimForZmVec.Close() 41 slimForZmVec.Append(columnData.Get(0)) 42 slimForZmVec.Append(columnData.Get(columnData.Length() - 1)) 43 err = zoneMapWriter.AddValues(slimForZmVec) 44 } else { 45 err = zoneMapWriter.AddValues(columnData) 46 } 47 if err != nil { 48 return 49 } 50 zmMeta, err := zoneMapWriter.Finalize() 51 if err != nil { 52 return 53 } 54 metas = append(metas, *zmMeta) 55 56 if !isPk { 57 return 58 } 59 60 bfPos := 1 61 bfWriter := indexwrapper.NewBFWriter() 62 if err = bfWriter.Init(writer, block, common.Plain, uint16(colDef.Idx), uint16(bfPos)); err != nil { 63 return 64 } 65 if err = bfWriter.AddValues(columnData); err != nil { 66 return 67 } 68 bfMeta, err := bfWriter.Finalize() 69 if err != nil { 70 return 71 } 72 metas = append(metas, *bfMeta) 73 return 74 } 75 76 func BuildBlockIndex(writer objectio.Writer, block objectio.BlockObject, schema *catalog.Schema, columnsData *containers.Batch, isSorted bool) (err error) { 77 blkMetas := indexwrapper.NewEmptyIndicesMeta() 78 pkIdx := -10086 79 if schema.HasPK() { 80 pkIdx = schema.GetSingleSortKey().Idx 81 } 82 83 for _, colDef := range schema.ColDefs { 84 if colDef.IsPhyAddr() { 85 continue 86 } 87 data := columnsData.GetVectorByName(colDef.GetName()) 88 isPk := colDef.Idx == pkIdx 89 colMetas, err := BuildColumnIndex(writer, block, colDef, data, isPk, isSorted) 90 if err != nil { 91 return err 92 } 93 blkMetas.AddIndex(colMetas...) 94 } 95 return nil 96 } 97 98 type delSegTask struct { 99 *tasks.BaseTask 100 delSegs []*catalog.SegmentEntry 101 txn txnif.AsyncTxn 102 } 103 104 func NewDelSegTask(ctx *tasks.Context, txn txnif.AsyncTxn, delSegs []*catalog.SegmentEntry) *delSegTask { 105 task := &delSegTask{ 106 delSegs: delSegs, 107 txn: txn, 108 } 109 task.BaseTask = tasks.NewBaseTask(task, tasks.DataCompactionTask, ctx) 110 return task 111 } 112 113 func (t *delSegTask) String() string { 114 segs := "DelSeg:" 115 for _, seg := range t.delSegs { 116 segs = fmt.Sprintf("%s%d,", segs, seg.GetID()) 117 } 118 return segs 119 } 120 121 func (t *delSegTask) Execute() (err error) { 122 tdesc := t.String() 123 logutil.Info("Mergeblocks delete merged segments [Start]", zap.String("task", tdesc)) 124 dbId := t.delSegs[0].GetTable().GetDB().ID 125 database, err := t.txn.GetDatabaseByID(dbId) 126 if err != nil { 127 return 128 } 129 relId := t.delSegs[0].GetTable().ID 130 rel, err := database.GetRelationByID(relId) 131 if err != nil { 132 return 133 } 134 for _, entry := range t.delSegs { 135 if err = rel.SoftDeleteSegment(entry.GetID()); err != nil { 136 return 137 } 138 } 139 logutil.Info("Mergeblocks delete merged segments [Done]", zap.String("task", tdesc)) 140 return 141 }