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  }