@@ -6,14 +6,15 @@ import (
66 "encoding/binary"
77 "errors"
88 "fmt"
9+ "github.com/feast-dev/feast/go/internal/feast/registry"
910 "sort"
1011 "strconv"
1112 "strings"
1213
1314 "github.com/go-redis/redis/v8"
1415 "github.com/golang/protobuf/proto"
1516 "github.com/spaolacci/murmur3"
16- timestamppb "google.golang.org/protobuf/types/known/timestamppb"
17+ "google.golang.org/protobuf/types/known/timestamppb"
1718
1819 "github.com/feast-dev/feast/go/protos/feast/serving"
1920 "github.com/feast-dev/feast/go/protos/feast/types"
@@ -37,10 +38,15 @@ type RedisOnlineStore struct {
3738
3839 // Redis client connector
3940 client * redis.Client
41+
42+ config * registry.RepoConfig
4043}
4144
42- func NewRedisOnlineStore (project string , onlineStoreConfig map [string ]interface {}) (* RedisOnlineStore , error ) {
43- store := RedisOnlineStore {project : project }
45+ func NewRedisOnlineStore (project string , config * registry.RepoConfig , onlineStoreConfig map [string ]interface {}) (* RedisOnlineStore , error ) {
46+ store := RedisOnlineStore {
47+ project : project ,
48+ config : config ,
49+ }
4450
4551 var address []string
4652 var password string
@@ -161,7 +167,7 @@ func (r *RedisOnlineStore) OnlineRead(ctx context.Context, entityKeys []*types.E
161167 redisKeyToEntityIndex := make (map [string ]int )
162168 for i := 0 ; i < len (entityKeys ); i ++ {
163169
164- var key , err = buildRedisKey (r .project , entityKeys [i ])
170+ var key , err = buildRedisKey (r .project , entityKeys [i ], r . config . EntityKeySerializationVersion )
165171 if err != nil {
166172 return nil , err
167173 }
@@ -270,16 +276,16 @@ func (r *RedisOnlineStore) Destruct() {
270276
271277}
272278
273- func buildRedisKey (project string , entityKey * types.EntityKey ) (* []byte , error ) {
274- serKey , err := serializeEntityKey (entityKey )
279+ func buildRedisKey (project string , entityKey * types.EntityKey , entityKeySerializationVersion int64 ) (* []byte , error ) {
280+ serKey , err := serializeEntityKey (entityKey , entityKeySerializationVersion )
275281 if err != nil {
276282 return nil , err
277283 }
278284 fullKey := append (* serKey , []byte (project )... )
279285 return & fullKey , nil
280286}
281287
282- func serializeEntityKey (entityKey * types.EntityKey ) (* []byte , error ) {
288+ func serializeEntityKey (entityKey * types.EntityKey , entityKeySerializationVersion int64 ) (* []byte , error ) {
283289 // Serialize entity key to a bytestring so that it can be used as a lookup key in a hash table.
284290
285291 // Ensure that we have the right amount of join keys and entity values
@@ -316,7 +322,7 @@ func serializeEntityKey(entityKey *types.EntityKey) (*[]byte, error) {
316322 offset := (2 * len (keys )) + (i * 3 )
317323 value := m [keys [i ]].GetVal ()
318324
319- valueBytes , valueTypeBytes , err := serializeValue (value )
325+ valueBytes , valueTypeBytes , err := serializeValue (value , entityKeySerializationVersion )
320326 if err != nil {
321327 return valueBytes , err
322328 }
@@ -341,7 +347,7 @@ func serializeEntityKey(entityKey *types.EntityKey) (*[]byte, error) {
341347 return & entityKeyBuffer , nil
342348}
343349
344- func serializeValue (value interface {}) (* []byte , types.ValueType_Enum , error ) {
350+ func serializeValue (value interface {}, entityKeySerializationVersion int64 ) (* []byte , types.ValueType_Enum , error ) {
345351 // TODO: Implement support for other types (at least the major types like ints, strings, bytes)
346352 switch x := (value ).(type ) {
347353 case * types.Value_StringVal :
@@ -354,10 +360,16 @@ func serializeValue(value interface{}) (*[]byte, types.ValueType_Enum, error) {
354360 binary .LittleEndian .PutUint32 (valueBuffer , uint32 (x .Int32Val ))
355361 return & valueBuffer , types .ValueType_INT32 , nil
356362 case * types.Value_Int64Val :
357- // TODO (woop): We unfortunately have to use 32 bit here for backward compatibility :(
358- valueBuffer := make ([]byte , 4 )
359- binary .LittleEndian .PutUint32 (valueBuffer , uint32 (x .Int64Val ))
360- return & valueBuffer , types .ValueType_INT64 , nil
363+ if entityKeySerializationVersion <= 1 {
364+ // We unfortunately have to use 32 bit here for backward compatibility :(
365+ valueBuffer := make ([]byte , 4 )
366+ binary .LittleEndian .PutUint32 (valueBuffer , uint32 (x .Int64Val ))
367+ return & valueBuffer , types .ValueType_INT64 , nil
368+ } else {
369+ valueBuffer := make ([]byte , 8 )
370+ binary .LittleEndian .PutUint64 (valueBuffer , uint64 (x .Int64Val ))
371+ return & valueBuffer , types .ValueType_INT64 , nil
372+ }
361373 case nil :
362374 return nil , types .ValueType_INVALID , fmt .Errorf ("could not detect type for %v" , x )
363375 default :
0 commit comments