Merge PR #7121: Support Event Indexing
This commit is contained in:
@@ -199,3 +199,30 @@ func StringifyEvents(events []abci.Event) StringEvents {
|
||||
|
||||
return res.Flatten()
|
||||
}
|
||||
|
||||
// MarkEventsToIndex returns the set of ABCI events, where each event's attribute
|
||||
// has it's index value marked based on the provided set of events to index.
|
||||
func MarkEventsToIndex(events []abci.Event, indexSet map[string]struct{}) []abci.Event {
|
||||
updatedEvents := make([]abci.Event, len(events))
|
||||
for i, e := range events {
|
||||
updatedEvent := abci.Event{
|
||||
Type: e.Type,
|
||||
Attributes: make([]abci.EventAttribute, len(e.Attributes)),
|
||||
}
|
||||
|
||||
for j, attr := range e.Attributes {
|
||||
_, index := indexSet[fmt.Sprintf("%s.%s", e.Type, attr.Key)]
|
||||
updatedAttr := abci.EventAttribute{
|
||||
Key: attr.Key,
|
||||
Value: attr.Value,
|
||||
Index: index,
|
||||
}
|
||||
|
||||
updatedEvent.Attributes[j] = updatedAttr
|
||||
}
|
||||
|
||||
updatedEvents[i] = updatedEvent
|
||||
}
|
||||
|
||||
return updatedEvents
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
)
|
||||
|
||||
func TestAppendEvents(t *testing.T) {
|
||||
@@ -69,3 +70,89 @@ func TestStringifyEvents(t *testing.T) {
|
||||
expectedJSONStr := "[{\"type\":\"message\",\"attributes\":[{\"key\":\"sender\",\"value\":\"foo\"},{\"key\":\"module\",\"value\":\"bank\"}]}]"
|
||||
require.Equal(t, expectedJSONStr, string(bz))
|
||||
}
|
||||
|
||||
func TestMarkEventsToIndex(t *testing.T) {
|
||||
events := []abci.Event{
|
||||
{
|
||||
Type: "message",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("sender"), Value: []byte("foo")},
|
||||
{Key: []byte("recipient"), Value: []byte("bar")},
|
||||
},
|
||||
},
|
||||
{
|
||||
Type: "staking",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("deposit"), Value: []byte("5")},
|
||||
{Key: []byte("unbond"), Value: []byte("10")},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
testCases := map[string]struct {
|
||||
events []abci.Event
|
||||
indexSet map[string]struct{}
|
||||
expected []abci.Event
|
||||
}{
|
||||
"empty index set": {
|
||||
events: events,
|
||||
expected: events,
|
||||
indexSet: map[string]struct{}{},
|
||||
},
|
||||
"index some events": {
|
||||
events: events,
|
||||
expected: []abci.Event{
|
||||
{
|
||||
Type: "message",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("sender"), Value: []byte("foo"), Index: true},
|
||||
{Key: []byte("recipient"), Value: []byte("bar")},
|
||||
},
|
||||
},
|
||||
{
|
||||
Type: "staking",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("deposit"), Value: []byte("5"), Index: true},
|
||||
{Key: []byte("unbond"), Value: []byte("10")},
|
||||
},
|
||||
},
|
||||
},
|
||||
indexSet: map[string]struct{}{
|
||||
"message.sender": {},
|
||||
"staking.deposit": {},
|
||||
},
|
||||
},
|
||||
"index all events": {
|
||||
events: events,
|
||||
expected: []abci.Event{
|
||||
{
|
||||
Type: "message",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("sender"), Value: []byte("foo"), Index: true},
|
||||
{Key: []byte("recipient"), Value: []byte("bar"), Index: true},
|
||||
},
|
||||
},
|
||||
{
|
||||
Type: "staking",
|
||||
Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("deposit"), Value: []byte("5"), Index: true},
|
||||
{Key: []byte("unbond"), Value: []byte("10"), Index: true},
|
||||
},
|
||||
},
|
||||
},
|
||||
indexSet: map[string]struct{}{
|
||||
"message.sender": {},
|
||||
"message.recipient": {},
|
||||
"staking.deposit": {},
|
||||
"staking.unbond": {},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range testCases {
|
||||
tc := tc
|
||||
t.Run(name, func(t *testing.T) {
|
||||
require.Equal(t, tc.expected, MarkEventsToIndex(tc.events, tc.indexSet))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user