mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-05 23:57:04 +00:00
rpc: add sort_order option to tx_search (#4342)
I have added order_by which can be "asc" or "desc" (should be in string format) in the tx_search RPC method. Fixes: #3333 Author: @princesinha19
This commit is contained in:
+8
-15
@@ -4,7 +4,6 @@ import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -160,12 +159,14 @@ func (txi *TxIndex) indexEvents(result *types.TxResult, hash []byte, store dbm.S
|
||||
}
|
||||
}
|
||||
|
||||
// Search performs a search using the given query. It breaks the query into
|
||||
// conditions (like "tx.height > 5"). For each condition, it queries the DB
|
||||
// index. One special use cases here: (1) if "tx.hash" is found, it returns tx
|
||||
// result for it (2) for range queries it is better for the client to provide
|
||||
// both lower and upper bounds, so we are not performing a full scan. Results
|
||||
// from querying indexes are then intersected and returned to the caller.
|
||||
// Search performs a search using the given query.
|
||||
//
|
||||
// It breaks the query into conditions (like "tx.height > 5"). For each
|
||||
// condition, it queries the DB index. One special use cases here: (1) if
|
||||
// "tx.hash" is found, it returns tx result for it (2) for range queries it is
|
||||
// better for the client to provide both lower and upper bounds, so we are not
|
||||
// performing a full scan. Results from querying indexes are then intersected
|
||||
// and returned to the caller, in no particular order.
|
||||
func (txi *TxIndex) Search(q *query.Query) ([]*types.TxResult, error) {
|
||||
var hashesInitialized bool
|
||||
filteredHashes := make(map[string][]byte)
|
||||
@@ -250,14 +251,6 @@ func (txi *TxIndex) Search(q *query.Query) ([]*types.TxResult, error) {
|
||||
results = append(results, res)
|
||||
}
|
||||
|
||||
// sort by height & index by default
|
||||
sort.Slice(results, func(i, j int) bool {
|
||||
if results[i].Height == results[j].Height {
|
||||
return results[i].Index < results[j].Index
|
||||
}
|
||||
return results[i].Height < results[j].Height
|
||||
})
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -272,29 +272,6 @@ func TestTxSearchMultipleTxs(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
|
||||
require.Len(t, results, 3)
|
||||
assert.Equal(t, []*types.TxResult{txResult3, txResult2, txResult}, results)
|
||||
}
|
||||
|
||||
func TestIndexAllTags(t *testing.T) {
|
||||
indexer := NewTxIndex(db.NewMemDB(), IndexAllEvents())
|
||||
|
||||
txResult := txResultWithEvents([]abci.Event{
|
||||
{Type: "account", Attributes: []kv.Pair{{Key: []byte("owner"), Value: []byte("Ivan")}}},
|
||||
{Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}},
|
||||
})
|
||||
|
||||
err := indexer.Index(txResult)
|
||||
require.NoError(t, err)
|
||||
|
||||
results, err := indexer.Search(query.MustParse("account.number >= 1"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, results, 1)
|
||||
assert.Equal(t, []*types.TxResult{txResult}, results)
|
||||
|
||||
results, err = indexer.Search(query.MustParse("account.owner = 'Ivan'"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, results, 1)
|
||||
assert.Equal(t, []*types.TxResult{txResult}, results)
|
||||
}
|
||||
|
||||
func txResultWithEvents(events []abci.Event) *types.TxResult {
|
||||
|
||||
Reference in New Issue
Block a user