compareForeignKeys compares two lists of foreign keys.
(oldFKs, newFKs []*storepb.ForeignKeyMetadata)
| 1016 | |
| 1017 | // compareForeignKeys compares two lists of foreign keys. |
| 1018 | func compareForeignKeys(oldFKs, newFKs []*storepb.ForeignKeyMetadata) []*ForeignKeyDiff { |
| 1019 | var changes []*ForeignKeyDiff |
| 1020 | |
| 1021 | oldFKMap := make(map[string]*storepb.ForeignKeyMetadata) |
| 1022 | for _, fk := range oldFKs { |
| 1023 | oldFKMap[fk.Name] = fk |
| 1024 | } |
| 1025 | |
| 1026 | newFKMap := make(map[string]*storepb.ForeignKeyMetadata) |
| 1027 | for _, fk := range newFKs { |
| 1028 | newFKMap[fk.Name] = fk |
| 1029 | } |
| 1030 | |
| 1031 | // Check for dropped foreign keys |
| 1032 | for fkName, oldFK := range oldFKMap { |
| 1033 | if _, exists := newFKMap[fkName]; !exists { |
| 1034 | changes = append(changes, &ForeignKeyDiff{ |
| 1035 | Action: MetadataDiffActionDrop, |
| 1036 | OldForeignKey: oldFK, |
| 1037 | }) |
| 1038 | } |
| 1039 | } |
| 1040 | |
| 1041 | // Check for new and modified foreign keys |
| 1042 | for fkName, newFK := range newFKMap { |
| 1043 | oldFK, exists := oldFKMap[fkName] |
| 1044 | if !exists { |
| 1045 | changes = append(changes, &ForeignKeyDiff{ |
| 1046 | Action: MetadataDiffActionCreate, |
| 1047 | NewForeignKey: newFK, |
| 1048 | }) |
| 1049 | } else if !foreignKeysEqual(oldFK, newFK) { |
| 1050 | // Drop the old FK and recreate the new one instead of altering |
| 1051 | changes = append(changes, &ForeignKeyDiff{ |
| 1052 | Action: MetadataDiffActionDrop, |
| 1053 | OldForeignKey: oldFK, |
| 1054 | }) |
| 1055 | changes = append(changes, &ForeignKeyDiff{ |
| 1056 | Action: MetadataDiffActionCreate, |
| 1057 | NewForeignKey: newFK, |
| 1058 | }) |
| 1059 | } |
| 1060 | } |
| 1061 | |
| 1062 | return changes |
| 1063 | } |
| 1064 | |
| 1065 | // foreignKeysEqual checks if two foreign keys are equal. |
| 1066 | func foreignKeysEqual(fk1, fk2 *storepb.ForeignKeyMetadata) bool { |
no test coverage detected