Skip to content

Commit 96a8e0c

Browse files
authored
Find the right discriminator index (Azure#22523)
* find the right discriminator index * reserve work * discriminator index * fix format and update test * fix eslint issue * use BFS instead of DFS
1 parent 6078ee2 commit 96a8e0c

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

sdk/core/core-client/src/serializer.ts

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,13 +1097,44 @@ function deserializeSequenceType(
10971097
return responseBody;
10981098
}
10991099

1100+
function getIndexDiscriminator(
1101+
discriminators: Record<string, CompositeMapper>,
1102+
discriminatorValue: string,
1103+
typeName: string
1104+
): CompositeMapper | undefined {
1105+
const typeNamesToCheck = [typeName];
1106+
while (typeNamesToCheck.length) {
1107+
const currentName = typeNamesToCheck.shift();
1108+
const indexDiscriminator =
1109+
discriminatorValue === currentName
1110+
? discriminatorValue
1111+
: currentName + "." + discriminatorValue;
1112+
if (Object.prototype.hasOwnProperty.call(discriminators, indexDiscriminator)) {
1113+
return discriminators[indexDiscriminator];
1114+
} else {
1115+
for (const [name, mapper] of Object.entries(discriminators)) {
1116+
if (
1117+
name.startsWith(currentName + ".") &&
1118+
mapper.type.uberParent === currentName &&
1119+
mapper.type.className
1120+
) {
1121+
typeNamesToCheck.push(mapper.type.className);
1122+
}
1123+
}
1124+
}
1125+
}
1126+
1127+
return undefined;
1128+
}
1129+
11001130
function getPolymorphicMapper(
11011131
serializer: Serializer,
11021132
mapper: CompositeMapper,
11031133
object: any,
11041134
polymorphicPropertyName: "clientName" | "serializedName"
11051135
): CompositeMapper {
11061136
const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
1137+
11071138
if (polymorphicDiscriminator) {
11081139
let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
11091140
if (discriminatorName) {
@@ -1112,13 +1143,14 @@ function getPolymorphicMapper(
11121143
discriminatorName = discriminatorName.replace(/\\/gi, "");
11131144
}
11141145
const discriminatorValue = object[discriminatorName];
1115-
if (discriminatorValue !== undefined && discriminatorValue !== null) {
1116-
const typeName = mapper.type.uberParent || mapper.type.className;
1117-
const indexDiscriminator =
1118-
discriminatorValue === typeName
1119-
? discriminatorValue
1120-
: typeName + "." + discriminatorValue;
1121-
const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];
1146+
const typeName = mapper.type.uberParent ?? mapper.type.className;
1147+
1148+
if (typeof discriminatorValue === "string" && typeName) {
1149+
const polymorphicMapper = getIndexDiscriminator(
1150+
serializer.modelMappers.discriminators,
1151+
discriminatorValue,
1152+
typeName
1153+
);
11221154
if (polymorphicMapper) {
11231155
mapper = polymorphicMapper;
11241156
}

sdk/core/core-client/test/serializer.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ describe("Serializer", function () {
538538

539539
it("should correctly serialize object version of polymorphic discriminator", function () {
540540
const serializer = createSerializer(Mappers);
541-
const mapper = Mappers.SawShark;
541+
const mapper = Mappers.Shark;
542542
const sawshark = {
543543
fishtype: "sawshark",
544544
age: 22,

sdk/core/core-client/test/testMappers1.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ internalMappers.SawShark = {
848848
serializedName: "fish.type",
849849
clientName: "fishtype",
850850
},
851-
uberParent: "Fish",
851+
uberParent: "Shark",
852852
className: "Sawshark",
853853
modelProperties: {
854854
species: {
@@ -1037,7 +1037,7 @@ internalMappers.SubProduct = {
10371037
internalMappers.discriminators = {
10381038
Fish: internalMappers.Fish,
10391039
"Fish.shark": internalMappers.Shark,
1040-
"Fish.sawshark": internalMappers.SawShark,
1040+
"Shark.sawshark": internalMappers.SawShark,
10411041
Pet: internalMappers.Pet,
10421042
"Pet.Cat": internalMappers.Cat,
10431043
"Pet.Dog": internalMappers.Dog,

0 commit comments

Comments
 (0)