Skip to content

Commit b82008a

Browse files
bysomeonevipwzw
authored andcommitted
[[FIX]] fix list table primary key(#1203)
1 parent 3bf2911 commit b82008a

File tree

2 files changed

+90
-25
lines changed

2 files changed

+90
-25
lines changed

common/db/table/query.go

+16-21
Original file line numberDiff line numberDiff line change
@@ -69,31 +69,27 @@ func (query *Query) ListIndex(indexName string, prefix []byte, primaryKey []byte
6969
if isPrimaryIndex(indexName) || indexName == query.table.getOpt().Primary {
7070
return query.listPrimary(prefix, primaryKey, count, direction)
7171
}
72-
p := query.table.indexPrefix(indexName)
73-
var k []byte
72+
keyPrefix := append(query.table.indexPrefix(indexName), prefix...)
73+
var key []byte
7474
if len(primaryKey) > 0 {
7575
row, err := query.table.GetData(primaryKey)
7676
if err != nil {
7777
return nil, err
7878
}
79-
key, err := query.table.index(row, indexName)
79+
indexKey, err := query.table.index(row, indexName)
8080
if err != nil {
8181
return nil, err
8282
}
83-
//如果存在prefix
83+
////assert prefix
8484
if prefix != nil {
85-
p2 := commonPrefix(prefix, key)
86-
if len(p2) != len(prefix) {
85+
cp := commonPrefix(prefix, indexKey)
86+
if len(cp) != len(prefix) {
8787
return nil, types.ErrNotFound
8888
}
89-
p = append(p, p2...)
9089
}
91-
k = query.table.getIndexKey(indexName, key, row.Primary)
92-
} else {
93-
//这个情况下 k == nil
94-
p = append(p, prefix...)
90+
key = query.table.getIndexKey(indexName, indexKey, row.Primary)
9591
}
96-
values, err := query.kvdb.List(p, k, count, direction)
92+
values, err := query.kvdb.List(keyPrefix, key, count, direction)
9793
if err != nil {
9894
return nil, err
9995
}
@@ -112,21 +108,20 @@ func (query *Query) ListIndex(indexName string, prefix []byte, primaryKey []byte
112108

113109
//ListPrimary list primary data
114110
func (query *Query) listPrimary(prefix []byte, primaryKey []byte, count, direction int32) (rows []*Row, err error) {
115-
p := query.table.primaryPrefix()
116-
var k []byte
111+
metaPrefix := query.table.primaryPrefix()
112+
var key []byte
117113
if primaryKey != nil {
114+
//asset primary key prefix
118115
if prefix != nil {
119-
p2 := commonPrefix(prefix, primaryKey)
120-
if len(p2) != len(prefix) {
116+
cp := commonPrefix(prefix, primaryKey)
117+
if len(cp) != len(prefix) {
121118
return nil, types.ErrNotFound
122119
}
123-
p = append(p, p2...)
124120
}
125-
k = append(p, primaryKey...)
126-
} else {
127-
p = append(p, prefix...)
121+
key = append(metaPrefix, primaryKey...)
128122
}
129-
values, err := query.kvdb.List(p, k, count, direction)
123+
keyPrefix := append(metaPrefix, prefix...)
124+
values, err := query.kvdb.List(keyPrefix, key, count, direction)
130125
if err != nil {
131126
return nil, err
132127
}

common/db/table/table_test.go

+74-4
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,26 @@ import (
1414
"github.com/stretchr/testify/assert"
1515
)
1616

17-
func TestTransactinList(t *testing.T) {
17+
func testTxTable(t *testing.T) (string, db.DB, db.KVDB, *Table) {
1818
dir, ldb, kvdb := util.CreateTestDB()
19-
defer util.CloseTestDB(dir, ldb)
2019
opt := &Option{
2120
Prefix: "prefix",
2221
Name: "name",
2322
Primary: "Hash",
2423
Index: []string{"From", "To"},
2524
}
26-
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
2725
table, err := NewTable(NewTransactionRow(), kvdb, opt)
2826
assert.Nil(t, err)
27+
return dir, ldb, kvdb, table
28+
}
29+
30+
func TestTransactinList(t *testing.T) {
31+
dir, ldb, kvdb, table := testTxTable(t)
32+
defer util.CloseTestDB(dir, ldb)
33+
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
2934
addr1, priv := util.Genaddress()
3035
tx1 := util.CreateNoneTx(cfg, priv)
31-
err = table.Add(tx1)
36+
err := table.Add(tx1)
3237
assert.Nil(t, err)
3338
tx2 := util.CreateNoneTx(cfg, priv)
3439
err = table.Add(tx2)
@@ -448,3 +453,68 @@ func (tx *TransactionRow) Get(key string) ([]byte, error) {
448453
}
449454
return nil, types.ErrNotFound
450455
}
456+
457+
func TestTableListPrimary(t *testing.T) {
458+
459+
dir, ldb, _, table := testTxTable(t)
460+
defer util.CloseTestDB(dir, ldb)
461+
462+
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
463+
addr1, priv1 := util.Genaddress()
464+
_, priv2 := util.Genaddress()
465+
tx1 := util.CreateNoneTx(cfg, priv1)
466+
assert.Nil(t, table.Add(tx1))
467+
tx2 := util.CreateNoneTx(cfg, priv2)
468+
assert.Nil(t, table.Add(tx2))
469+
kvs, err := table.Save()
470+
assert.Nil(t, err)
471+
//save to database
472+
util.SaveKVList(ldb, kvs)
473+
hash := tx1.Hash()
474+
if bytes.Compare(hash, tx2.Hash()) > 0 {
475+
hash = tx2.Hash()
476+
}
477+
478+
// List
479+
rows, err := table.ListIndex("Hash", nil, nil, 10, db.ListASC)
480+
assert.Nil(t, err)
481+
assert.Equal(t, 2, len(rows))
482+
assert.Equal(t, hash, rows[0].Primary)
483+
484+
// List with prefix
485+
rows, err = table.ListIndex("Hash", hash[:20], nil, 10, db.ListASC)
486+
assert.Equal(t, 1, len(rows))
487+
488+
// List with primary
489+
rows, err = table.ListIndex("Hash", nil, hash, 10, db.ListASC)
490+
assert.Equal(t, 1, len(rows))
491+
rows, err = table.ListIndex("Hash", nil, hash, 10, db.ListDESC)
492+
assert.Equal(t, types.ErrNotFound, err)
493+
494+
// List with primary and prefix
495+
rows, err = table.ListIndex("Hash", hash[:20], hash, 10, db.ListASC)
496+
assert.Equal(t, types.ErrNotFound, err)
497+
rows, err = table.ListIndex("Hash", hash[:20], hash, 10, db.ListDESC)
498+
assert.Equal(t, types.ErrNotFound, err)
499+
500+
// List index
501+
rows, err = table.ListIndex("From", nil, nil, 10, db.ListDESC)
502+
assert.Nil(t, err)
503+
assert.Equal(t, 2, len(rows))
504+
505+
// List with prefix
506+
rows, err = table.ListIndex("From", []byte(addr1[:20]), nil, 10, db.ListDESC)
507+
assert.Equal(t, 1, len(rows))
508+
assert.Equal(t, tx1.Hash(), rows[0].Primary)
509+
510+
// List with primary
511+
rows, err = table.ListIndex("From", nil, hash, 10, db.ListASC)
512+
assert.Equal(t, 1, len(rows))
513+
assert.NotEqual(t, hash, rows[0].Primary)
514+
rows, err = table.ListIndex("From", nil, hash, 10, db.ListDESC)
515+
assert.Equal(t, types.ErrNotFound, err)
516+
517+
// List with primary and prefix
518+
rows, err = table.ListIndex("From", []byte(addr1)[:20], tx1.Hash(), 10, db.ListASC)
519+
assert.Equal(t, types.ErrNotFound, err)
520+
}

0 commit comments

Comments
 (0)