Skip to content

Commit

Permalink
Use type from type map before type from Metadata (#2697)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexshtin committed Apr 1, 2022
1 parent 306eda8 commit 232ea21
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 24 deletions.
5 changes: 3 additions & 2 deletions common/searchattribute/encode.go
Expand Up @@ -27,6 +27,7 @@ package searchattribute
import (
commonpb "go.temporal.io/api/common/v1"
enumspb "go.temporal.io/api/enums/v1"

"go.temporal.io/server/common/payload"
)

Expand Down Expand Up @@ -63,8 +64,8 @@ func Encode(searchAttributes map[string]interface{}, typeMap *NameTypeMap) (*com
}

// Decode decodes search attributes to the map of search attribute values using (in order):
// 1. type from MetadataType field,
// 2. type from typeMap (can be nil).
// 1. type from typeMap,
// 2. if typeMap is nil, type from MetadataType field is used.
// In case of error, it will continue to next search attribute and return last error.
func Decode(searchAttributes *commonpb.SearchAttributes, typeMap *NameTypeMap) (map[string]interface{}, error) {
if len(searchAttributes.GetIndexedFields()) == 0 {
Expand Down
12 changes: 4 additions & 8 deletions common/searchattribute/encode_value.go
Expand Up @@ -46,15 +46,11 @@ func EncodeValue(val interface{}, t enumspb.IndexedValueType) (*commonpb.Payload
}

// DecodeValue decodes search attribute value from Payload using (in order):
// 1. type from MetadataType field,
// 2. passed type t.
// 1. passed type t.
// 2. type from MetadataType field, if t is not specified.
func DecodeValue(value *commonpb.Payload, t enumspb.IndexedValueType) (interface{}, error) {
valueTypeMetadata, metadataHasValueType := value.Metadata[MetadataType]
if metadataHasValueType {
if ivt, ok := enumspb.IndexedValueType_value[string(valueTypeMetadata)]; ok {
// MetadataType field has priority over passed type.
t = enumspb.IndexedValueType(ivt)
}
if t == enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED {
t = enumspb.IndexedValueType(enumspb.IndexedValueType_value[string(value.Metadata[MetadataType])])
}

switch t {
Expand Down
27 changes: 13 additions & 14 deletions common/searchattribute/encode_value_test.go
Expand Up @@ -25,7 +25,6 @@
package searchattribute

import (
"errors"
"testing"
"time"

Expand All @@ -41,21 +40,14 @@ func Test_DecodeValue_FromMetadata_Success(t *testing.T) {

payloadStr := payload.EncodeString("qwe")
payloadStr.Metadata["type"] = []byte("Text")
decodedStr, err := DecodeValue(payloadStr, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED)
decodedStr, err := DecodeValue(payloadStr, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED) // MetadataType is used.
assert.NoError(err)
assert.Equal("qwe", decodedStr)

payloadInt, err := payload.Encode(123)
assert.NoError(err)
payloadInt.Metadata["type"] = []byte("Int")
decodedInt, err := DecodeValue(payloadInt, enumspb.INDEXED_VALUE_TYPE_TEXT) // MetadataType should be used anyway
assert.NoError(err)
assert.Equal(int64(123), decodedInt)

payloadBool, err := payload.Encode(true)
assert.NoError(err)
payloadBool.Metadata["type"] = []byte("Bool")
decodedBool, err := DecodeValue(payloadBool, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED)
decodedBool, err := DecodeValue(payloadBool, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED) // MetadataType is used.
assert.NoError(err)
assert.Equal(true, decodedBool)
}
Expand All @@ -76,7 +68,14 @@ func Test_DecodeValue_FromParameter_Success(t *testing.T) {

payloadInt, err = payload.Encode(123)
assert.NoError(err)
payloadInt.Metadata["type"] = []byte("UnknownType") // should not be used because incorrect
payloadInt.Metadata["type"] = []byte("String") // MetadataType is not used.
decodedInt, err = DecodeValue(payloadInt, enumspb.INDEXED_VALUE_TYPE_INT)
assert.NoError(err)
assert.Equal(int64(123), decodedInt)

payloadInt, err = payload.Encode(123)
assert.NoError(err)
payloadInt.Metadata["type"] = []byte("UnknownType") // MetadataType is not used.
decodedInt, err = DecodeValue(payloadInt, enumspb.INDEXED_VALUE_TYPE_INT)
assert.NoError(err)
assert.Equal(int64(123), decodedInt)
Expand All @@ -94,23 +93,23 @@ func Test_DecodeValue_Error(t *testing.T) {
payloadStr := payload.EncodeString("qwe")
decodedStr, err := DecodeValue(payloadStr, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED)
assert.Error(err)
assert.True(errors.Is(err, ErrInvalidType))
assert.ErrorIs(err, ErrInvalidType)
assert.Nil(decodedStr)

payloadInt, err := payload.Encode(123)
assert.NoError(err)
payloadInt.Metadata["type"] = []byte("UnknownType")
decodedInt, err := DecodeValue(payloadInt, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED)
assert.Error(err)
assert.True(errors.Is(err, ErrInvalidType))
assert.ErrorIs(err, ErrInvalidType)
assert.Nil(decodedInt)

payloadInt, err = payload.Encode(123)
assert.NoError(err)
payloadInt.Metadata["type"] = []byte("Text")
decodedInt, err = DecodeValue(payloadInt, enumspb.INDEXED_VALUE_TYPE_UNSPECIFIED)
assert.Error(err)
assert.True(errors.Is(err, converter.ErrUnableToDecode), err.Error())
assert.ErrorIs(err, converter.ErrUnableToDecode, err.Error())
assert.Nil(decodedInt)
}

Expand Down

0 comments on commit 232ea21

Please sign in to comment.