package kv import ( "context" "crypto/rand" "fmt" "io/ioutil" "testing" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/kv" "github.com/tendermint/tendermint/libs/pubsub/query" "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" ) func BenchmarkTxSearch(b *testing.B) { dbDir, err := ioutil.TempDir("", "benchmark_tx_search_test") if err != nil { b.Errorf("failed to create temporary directory: %s", err) } db, err := dbm.NewGoLevelDB("benchmark_tx_search_test", dbDir) if err != nil { b.Errorf("failed to create database: %s", err) } allowedKeys := []string{"transfer.address", "transfer.amount"} indexer := NewTxIndex(db, IndexEvents(allowedKeys)) for i := 0; i < 35000; i++ { events := []abci.Event{ { Type: "transfer", Attributes: []kv.Pair{ {Key: []byte("address"), Value: []byte(fmt.Sprintf("address_%d", i%100))}, {Key: []byte("amount"), Value: []byte("50")}, }, }, } txBz := make([]byte, 8) if _, err := rand.Read(txBz); err != nil { b.Errorf("failed produce random bytes: %s", err) } txResult := &types.TxResult{ Height: int64(i), Index: 0, Tx: types.Tx(string(txBz)), Result: abci.ResponseDeliverTx{ Data: []byte{0}, Code: abci.CodeTypeOK, Log: "", Events: events, }, } if err := indexer.Index(txResult); err != nil { b.Errorf("failed to index tx: %s", err) } } txQuery := query.MustParse("transfer.address = 'address_43' AND transfer.amount = 50") b.ResetTimer() ctx := context.Background() for i := 0; i < b.N; i++ { if _, err := indexer.Search(ctx, txQuery); err != nil { b.Errorf("failed to query for txs: %s", err) } } }