Skip to content

Commit ba0992f

Browse files
committed
simplify go oneOf
1 parent ca6b9ec commit ba0992f

File tree

6 files changed

+35
-394
lines changed

6 files changed

+35
-394
lines changed

clients/algoliasearch-client-go/algolia/utils/utils.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,8 @@ func ParameterToString(obj any) string {
9696

9797
return fmt.Sprintf("%v", obj)
9898
}
99+
100+
func HasKey[T any](m map[string]T, key string) bool {
101+
_, ok := m[key]
102+
return ok
103+
}

generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
108108
Map<String, ModelsMap> models = super.postProcessAllModels(objs);
109109
OneOf.updateModelsOneOf(models, modelPackage);
110110
GenericPropagator.propagateGenericsToModels(models);
111+
OneOf.addOneOfMetadata(models);
111112

112113
for (Map.Entry<String, ModelsMap> entry : models.entrySet()) {
113114
String modelName = entry.getKey();

generators/src/main/java/com/algolia/codegen/utils/OneOf.java

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ private static void markOneOfChildren(Map<String, ModelsMap> models, CodegenMode
7575
markCompounds(models, oneOf, oneOfModel, model);
7676
oneOfList.add(oneOfModel);
7777
}
78-
oneOfList.sort(comparator); // have fields with "discriminators" in the start of the list
7978
model.vendorExtensions.put("x-one-of-list", oneOfList);
8079
}
8180

@@ -121,29 +120,6 @@ private static boolean isNumberType(String typeName) {
121120
return typeName.equals("Int") || typeName.equals("Double") || typeName.equals("Long");
122121
}
123122

124-
public static final Comparator<Map<String, Object>> comparator = (mapA, mapB) -> {
125-
boolean hasDiscriminatorA = mapA.containsKey("discriminators");
126-
boolean hasDiscriminatorB = mapB.containsKey("discriminators");
127-
// Maps with "discriminators" come first
128-
if (hasDiscriminatorA && !hasDiscriminatorB) {
129-
return -1;
130-
} else if (!hasDiscriminatorA && hasDiscriminatorB) {
131-
return 1;
132-
} else {
133-
// If both maps have or don't have "discriminators," compare their list lengths
134-
if (hasDiscriminatorA && hasDiscriminatorB) {
135-
List<?> discriminatorsA = (List<?>) mapA.get("discriminators");
136-
List<?> discriminatorsB = (List<?>) mapB.get("discriminators");
137-
138-
// Compare the lengths of the lists
139-
return discriminatorsB.size() - discriminatorsA.size();
140-
}
141-
142-
// If the lengths are the same or both maps don't have "discriminators," return 0
143-
return 0;
144-
}
145-
};
146-
147123
/**
148124
* Add metadata about oneOfs models (e.g., if it has at least one model, if it has more than one
149125
* array-subtype, etc.)
@@ -156,6 +132,7 @@ public static void addOneOfMetadata(Map<String, ModelsMap> models) {
156132
if (isMultiArrayOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-array", true);
157133
if (isMultiMapOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-map", true);
158134
if (hasAtModelOrEnum(oneOfs)) model.vendorExtensions.put("x-has-model", true);
135+
if (hasDiscriminators(oneOfs)) model.vendorExtensions.put("x-has-discriminator", true);
159136
markOneOfModels(oneOfs);
160137
sortOneOfs(oneOfs);
161138
}
@@ -195,6 +172,14 @@ private static boolean hasAtModelOrEnum(List<CodegenProperty> oneOfs) {
195172
return false;
196173
}
197174

175+
/** Return true if at least one oneOf has discriminators */
176+
private static boolean hasDiscriminators(List<CodegenProperty> oneOfs) {
177+
for (var prop : oneOfs) {
178+
if (prop.vendorExtensions.containsKey("x-discriminator-fields")) return true;
179+
}
180+
return false;
181+
}
182+
198183
/** Mark oneOf models */
199184
private static void markOneOfModels(List<CodegenProperty> oneOfs) {
200185
for (var prop : oneOfs) {
@@ -218,7 +203,7 @@ private static void sortOneOfs(List<CodegenProperty> oneOfs) {
218203
return 1;
219204
} else if (hasDiscriminatorA && hasDiscriminatorB) {
220205
List<?> discriminatorsA = (List<?>) propA.vendorExtensions.get("x-discriminator-fields");
221-
List<?> discriminatorsB = (List<?>) propA.vendorExtensions.get("x-discriminator-fields");
206+
List<?> discriminatorsB = (List<?>) propB.vendorExtensions.get("x-discriminator-fields");
222207
return discriminatorsB.size() - discriminatorsA.size();
223208
} else {
224209
return 0;

specs/abtesting/common/schemas/AddABTestsVariant.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ customSearchParams:
3434
type: object
3535
required:
3636
- customSearchParameters
37+
x-discriminator-fields:
38+
- customSearchParameters

0 commit comments

Comments
 (0)