diff --git a/pkg/vm/engine/aoe/engine/relation.go b/pkg/vm/engine/aoe/engine/relation.go index 1a14bcc0bed06972a403ff7a5f3078099191d7f7..9d500f369ab0c6682b4dba99cd5c96c3eae26507 100644 --- a/pkg/vm/engine/aoe/engine/relation.go +++ b/pkg/vm/engine/aoe/engine/relation.go @@ -128,7 +128,7 @@ func (r *relation) Write(_ uint64, bat *batch.Batch, _ engine.Snapshot) error { } func (r *relation) Delete(_ uint64, _ *vector.Vector, _ string, _ engine.Snapshot) error { - panic(any("implement me")) + return nil } func (r *relation) update() error { @@ -254,11 +254,11 @@ func (r *relation) Nodes(_ engine.Snapshot) engine.Nodes { } func (r *relation) GetPrimaryKeys(_ engine.Snapshot) []*engine.Attribute { - panic(any("implement me")) + return nil } func (r *relation) GetHideKey(_ engine.Snapshot) *engine.Attribute { - panic(any("implement me")) + return nil } func (r *relation) GetPriKeyOrHideKey(_ engine.Snapshot) ([]engine.Attribute, bool) { diff --git a/pkg/vm/engine/tae/dataio/segmentio/segment.go b/pkg/vm/engine/tae/dataio/segmentio/segment.go index 8ab2851ed11a216b70104e0ce32d519353013ae2..a537f791aa3cab4e986dea2ad850ef53a3967ab2 100644 --- a/pkg/vm/engine/tae/dataio/segmentio/segment.go +++ b/pkg/vm/engine/tae/dataio/segmentio/segment.go @@ -53,7 +53,7 @@ func openSegment(name string, id uint64) *segmentFile { sf.seg = &segment.Segment{} err := sf.seg.Open(sf.name) if err != nil { - return nil + panic(any(err.Error())) } sf.id = &common.ID{ SegmentID: id, @@ -172,7 +172,7 @@ func newSegmentFile(name string, id uint64) *segmentFile { sf.seg = &segment.Segment{} err := sf.seg.Init(sf.name) if err != nil { - return nil + panic(any(err.Error())) } sf.seg.Mount() sf.id = &common.ID{ diff --git a/pkg/vm/engine/tae/moengine/engine_test.go b/pkg/vm/engine/tae/moengine/engine_test.go index e5fb89dd031764f00fa98a9c0aaa9d511e36a6ca..7ff6d075aebfb3da09dcfca202eeff4bb8a4a412 100644 --- a/pkg/vm/engine/tae/moengine/engine_test.go +++ b/pkg/vm/engine/tae/moengine/engine_test.go @@ -53,6 +53,18 @@ func TestEngine(t *testing.T) { err = rel.Write(0, bat, txn.GetCtx()) assert.Nil(t, err) assert.Nil(t, txn.Commit()) + txn, err = e.StartTxn(nil) + assert.Nil(t, err) + dbase, err = e.Database("db", txn.GetCtx()) + assert.Nil(t, err) + rel, err = dbase.Relation(schema.Name, txn.GetCtx()) + assert.Nil(t, err) + attr := rel.GetPrimaryKeys(nil) + key := attr[0] + bat = catalog.MockData(schema, 20) + err = rel.Delete(0, bat.Vecs[12], key.Name, nil) + assert.Nil(t, err) + assert.Nil(t, txn.Commit()) txn, err = e.StartTxn(nil) assert.Nil(t, err) @@ -64,8 +76,84 @@ func TestEngine(t *testing.T) { for _, reader := range readers { bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[1].Name}) assert.Nil(t, err) + if bat != nil { + assert.Equal(t, 80, vector.Length(bat.Vecs[0])) + } + } + t.Log(tae.Catalog.SimplePPString(common.PPL1)) +} + +func TestTxnRelation_GetHideKey(t *testing.T) { + tae := initDB(t, nil) + defer tae.Close() + e := NewEngine(tae) + txn, err := e.StartTxn(nil) + assert.Nil(t, err) + err = e.Create(0, "db", 0, txn.GetCtx()) + assert.Nil(t, err) + names := e.Databases(txn.GetCtx()) + assert.Equal(t, 2, len(names)) + dbase, err := e.Database("db", txn.GetCtx()) + assert.Nil(t, err) + + schema := catalog.MockSchema(13, 15) + defs, err := SchemaToDefs(schema) + assert.NoError(t, err) + err = dbase.Create(0, schema.Name, defs, txn.GetCtx()) + assert.Nil(t, err) + names = dbase.Relations(txn.GetCtx()) + assert.Equal(t, 1, len(names)) + + rel, err := dbase.Relation(schema.Name, txn.GetCtx()) + assert.Nil(t, err) + assert.Equal(t, 1, len(rel.Nodes(nil))) + assert.Equal(t, ADDR, rel.Nodes(nil)[0].Addr) + bat := catalog.MockData(schema, 100) + err = rel.Write(0, bat, txn.GetCtx()) + assert.Nil(t, err) + assert.Nil(t, txn.Commit()) + txn, err = e.StartTxn(nil) + assert.Nil(t, err) + dbase, err = e.Database("db", txn.GetCtx()) + assert.Nil(t, err) + rel, err = dbase.Relation(schema.Name, txn.GetCtx()) + assert.Nil(t, err) + assert.Nil(t, txn.Commit()) + readers := rel.NewReader(10, nil, nil, nil) + delete := bat + for _, reader := range readers { + bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[13].Name}) + assert.Nil(t, err) if bat != nil { assert.Equal(t, 100, vector.Length(bat.Vecs[0])) + delete = bat + } + } + txn, err = e.StartTxn(nil) + assert.Nil(t, err) + dbase, err = e.Database("db", txn.GetCtx()) + assert.Nil(t, err) + rel, err = dbase.Relation(schema.Name, txn.GetCtx()) + assert.Nil(t, err) + attr := rel.GetPrimaryKeys(nil) + assert.Nil(t, attr) + key := rel.GetHideKey(nil) + err = rel.Delete(0, delete.Vecs[0], key.Name, nil) + assert.Nil(t, err) + assert.Nil(t, txn.Commit()) + txn, err = e.StartTxn(nil) + assert.Nil(t, err) + dbase, err = e.Database("db", txn.GetCtx()) + assert.Nil(t, err) + rel, err = dbase.Relation(schema.Name, txn.GetCtx()) + assert.Nil(t, err) + assert.Nil(t, txn.Commit()) + readers = rel.NewReader(1, nil, nil, nil) + for _, reader := range readers { + bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[13].Name}) + assert.Nil(t, err) + if bat != nil { + assert.Equal(t, 0, vector.Length(bat.Vecs[0])) } } t.Log(tae.Catalog.SimplePPString(common.PPL1)) diff --git a/pkg/vm/engine/tae/moengine/relation.go b/pkg/vm/engine/tae/moengine/relation.go index 77a149ff22def7c15b8424d8ce3bcdfc35c4380a..a391db3b691883c8f7b4ffafb7732083a0ea0391 100644 --- a/pkg/vm/engine/tae/moengine/relation.go +++ b/pkg/vm/engine/tae/moengine/relation.go @@ -17,9 +17,11 @@ package moengine import ( "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/sql/colexec/extend" "github.com/matrixorigin/matrixone/pkg/vm/engine" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" + "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/container/compute" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle" ) @@ -98,6 +100,7 @@ func (rel *txnRelation) GetPrimaryKeys(_ engine.Snapshot) (attrs []*engine.Attri attr.Type = def.Type attrs = append(attrs, attr) } + logutil.Debugf("GetPrimaryKeys: %v", attrs[0]) return } @@ -106,6 +109,7 @@ func (rel *txnRelation) GetHideKey(_ engine.Snapshot) *engine.Attribute { key := new(engine.Attribute) key.Name = schema.HiddenKey.Name key.Type = schema.HiddenKey.Type + logutil.Debugf("GetHideKey: %v", key) return key } @@ -132,8 +136,27 @@ func (rel *txnRelation) Write(_ uint64, bat *batch.Batch, _ engine.Snapshot) err return rel.handle.Append(bat) } -func (rel *txnRelation) Delete(_ uint64, _ *vector.Vector, _ string, _ engine.Snapshot) error { - panic(any("implement me")) +func (rel *txnRelation) Delete(_ uint64, data *vector.Vector, col string, _ engine.Snapshot) error { + schema := rel.handle.GetMeta().(*catalog.TableEntry).GetSchema() + logutil.Debugf("Delete col: %v", col) + if schema.HiddenKey.Name == col { + return rel.handle.DeleteByHiddenKeys(data) + } + if !schema.HasPK() || schema.IsCompoundSortKey() { + panic(any("No valid primary key found")) + } + if schema.SortKey.Defs[0].Name == col { + for i := 0; i < vector.Length(data); i++ { + v := compute.GetValue(data, uint32(i)) + filter := handle.NewEQFilter(v) + err := rel.handle.DeleteByFilter(filter) + if err != nil { + return err + } + } + return nil + } + panic(any("Key not found")) } func (rel *txnRelation) NewReader(num int, _ extend.Extend, _ []byte, _ engine.Snapshot) (rds []engine.Reader) {