Skip to content

Commit fc2b695

Browse files
authored
fix(codec): use index to determine array struct member value (#1775)
Where the STRUCT value is an array, always determine inner member value using field index. STRUCT value is represented by var 'decoded'. Refs: #1774
1 parent 030115e commit fc2b695

File tree

2 files changed

+57
-6
lines changed

2 files changed

+57
-6
lines changed

src/codec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ function decode(value: Value, type: spannerClient.spanner.v1.Type): Value {
411411
case 'STRUCT':
412412
fields = type.structType!.fields!.map(({name, type}, index) => {
413413
const value = decode(
414-
decoded[name!] || decoded[index],
414+
(!Array.isArray(decoded) && decoded[name!]) || decoded[index],
415415
type as spannerClient.spanner.v1.Type
416416
);
417417
return {name, value};

test/codec.ts

+56-5
Original file line numberDiff line numberDiff line change
@@ -631,15 +631,22 @@ describe('codec', () => {
631631
assert(decoded[0] instanceof codec.Int);
632632
});
633633

634-
it('should decode STRUCT and inner members', () => {
634+
it('should decode object STRUCT value and inner members', () => {
635635
const value = {
636-
fieldName: '1',
636+
keys: 1,
637+
fieldName: '2',
637638
};
638639

639640
const decoded = codec.decode(value, {
640641
code: google.spanner.v1.TypeCode.STRUCT,
641642
structType: {
642643
fields: [
644+
{
645+
name: 'keys',
646+
type: {
647+
code: google.spanner.v1.TypeCode.JSON,
648+
},
649+
},
643650
{
644651
name: 'fieldName',
645652
type: {
@@ -650,11 +657,55 @@ describe('codec', () => {
650657
},
651658
});
652659

653-
const expectedStruct = new codec.Struct({
654-
name: 'fieldName',
655-
value: new codec.Int(value.fieldName),
660+
const expectedStruct = new codec.Struct(
661+
{
662+
name: 'keys',
663+
value: value.keys,
664+
},
665+
{
666+
name: 'fieldName',
667+
value: new codec.Int(value.fieldName),
668+
}
669+
);
670+
671+
assert(decoded instanceof codec.Struct);
672+
assert.deepStrictEqual(decoded, expectedStruct);
673+
});
674+
675+
it('should decode array STRUCT value and inner members', () => {
676+
const value = ['1', '2'];
677+
678+
const decoded = codec.decode(value, {
679+
code: google.spanner.v1.TypeCode.STRUCT,
680+
structType: {
681+
fields: [
682+
{
683+
name: 'keys',
684+
type: {
685+
code: google.spanner.v1.TypeCode.JSON,
686+
},
687+
},
688+
{
689+
name: 'fieldName',
690+
type: {
691+
code: google.spanner.v1.TypeCode.INT64,
692+
},
693+
},
694+
],
695+
},
656696
});
657697

698+
const expectedStruct = new codec.Struct(
699+
{
700+
name: 'keys',
701+
value: JSON.parse(value[0]),
702+
},
703+
{
704+
name: 'fieldName',
705+
value: new codec.Int(value[1]),
706+
}
707+
);
708+
658709
assert(decoded instanceof codec.Struct);
659710
assert.deepStrictEqual(decoded, expectedStruct);
660711
});

0 commit comments

Comments
 (0)