@@ -274,9 +274,6 @@ var associativeListParserOld = func() *typed.Parser {
274274 - name: name
275275 type:
276276 scalar: string
277- - name: id
278- type:
279- scalar: numeric
280277 - name: value
281278 type:
282279 scalar: numeric
@@ -493,3 +490,221 @@ func TestAssociativeListSchemaChanges(t *testing.T) {
493490 })
494491 }
495492}
493+
494+ var associativeListParserPromoteKeyBefore = func () * typed.Parser {
495+ p , err := typed .NewParser (`types:
496+ - name: v1
497+ map:
498+ fields:
499+ - name: list
500+ type:
501+ namedType: associativeList
502+ - name: associativeList
503+ list:
504+ elementType:
505+ namedType: myElement
506+ elementRelationship: associative
507+ keys:
508+ - name
509+ - name: myElement
510+ map:
511+ fields:
512+ - name: name
513+ type:
514+ scalar: string
515+ - name: id
516+ type:
517+ scalar: numeric
518+ - name: value
519+ type:
520+ scalar: numeric
521+ ` )
522+ if err != nil {
523+ panic (err )
524+ }
525+ return p
526+ }()
527+
528+ var associativeListParserPromoteKeyAfter = func () * typed.Parser {
529+ p , err := typed .NewParser (`types:
530+ - name: v1
531+ map:
532+ fields:
533+ - name: list
534+ type:
535+ namedType: associativeList
536+ - name: associativeList
537+ list:
538+ elementType:
539+ namedType: myElement
540+ elementRelationship: associative
541+ keys:
542+ - name
543+ - id
544+ - name: myElement
545+ map:
546+ fields:
547+ - name: name
548+ type:
549+ scalar: string
550+ - name: id
551+ type:
552+ scalar: numeric
553+ - name: value
554+ type:
555+ scalar: numeric
556+ ` )
557+ if err != nil {
558+ panic (err )
559+ }
560+ return p
561+ }()
562+
563+ func TestPromoteFieldToAssociativeListKey (t * testing.T ) {
564+ tests := map [string ]TestCase {
565+ "identical item merges" : {
566+ Ops : []Operation {
567+ Apply {
568+ Manager : "one" ,
569+ Object : `
570+ list:
571+ - name: a
572+ id: 1
573+ value: 1
574+ ` ,
575+ APIVersion : "v1" ,
576+ },
577+ ChangeParser {Parser : associativeListParserPromoteKeyAfter },
578+ Apply {
579+ Manager : "one" ,
580+ Object : `
581+ list:
582+ - name: a
583+ id: 1
584+ value: 2
585+ ` ,
586+ APIVersion : "v1" ,
587+ },
588+ },
589+ Object : `
590+ list:
591+ - name: a
592+ id: 1
593+ value: 2
594+ ` ,
595+ APIVersion : "v1" ,
596+ Managed : fieldpath.ManagedFields {
597+ "one" : fieldpath .NewVersionedSet (_NS (
598+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 ))),
599+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "name" ),
600+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "id" ),
601+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "value" ),
602+ ), "v1" , true ),
603+ },
604+ },
605+ "distinct item added" : {
606+ Ops : []Operation {
607+ Apply {
608+ Manager : "one" ,
609+ Object : `
610+ list:
611+ - name: a
612+ id: 1
613+ value: 1
614+ ` ,
615+ APIVersion : "v1" ,
616+ },
617+ ChangeParser {Parser : associativeListParserPromoteKeyAfter },
618+ Apply {
619+ Manager : "one" ,
620+ Object : `
621+ list:
622+ - name: a
623+ id: 1
624+ value: 1
625+ - name: a
626+ id: 2
627+ value: 2
628+ ` ,
629+ APIVersion : "v1" ,
630+ },
631+ },
632+ Object : `
633+ list:
634+ - name: a
635+ id: 1
636+ value: 1
637+ - name: a
638+ id: 2
639+ value: 2
640+ ` ,
641+ APIVersion : "v1" ,
642+ Managed : fieldpath.ManagedFields {
643+ "one" : fieldpath .NewVersionedSet (_NS (
644+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 ))),
645+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "name" ),
646+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "id" ),
647+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "value" ),
648+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 ))),
649+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "name" ),
650+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "id" ),
651+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "value" ),
652+ ), "v1" , true ),
653+ },
654+ },
655+ "item missing new key field is distinct" : {
656+ Ops : []Operation {
657+ Apply {
658+ Manager : "one" ,
659+ Object : `
660+ list:
661+ - name: a
662+ value: 1
663+ ` ,
664+ APIVersion : "v1" ,
665+ },
666+ ChangeParser {Parser : associativeListParserPromoteKeyAfter },
667+ Apply {
668+ Manager : "one" ,
669+ Object : `
670+ list:
671+ - name: a
672+ value: 1
673+ - name: a
674+ id: 2
675+ value: 2
676+ ` ,
677+ APIVersion : "v1" ,
678+ },
679+ },
680+ Object : `
681+ list:
682+ - name: a
683+ value: 1
684+ - name: a
685+ id: 2
686+ value: 2
687+ ` ,
688+ APIVersion : "v1" ,
689+ Managed : fieldpath.ManagedFields {
690+ "one" : fieldpath .NewVersionedSet (_NS (
691+ _P ("list" , _KBF ("name" , "a" )),
692+ _P ("list" , _KBF ("name" , "a" ), "name" ),
693+ _P ("list" , _KBF ("name" , "a" ), "value" ),
694+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 ))),
695+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "name" ),
696+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "id" ),
697+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (2 )), "value" ),
698+ ), "v1" , true ),
699+ },
700+ },
701+ }
702+
703+ for name , test := range tests {
704+ t .Run (name , func (t * testing.T ) {
705+ if err := test .Test (associativeListParserPromoteKeyBefore ); err != nil {
706+ t .Fatal (err )
707+ }
708+ })
709+ }
710+ }
0 commit comments