Skip to content

Commit 4cbbce5

Browse files
shortcutsmillotp
andauthoredAug 21, 2024··
fix(clients): highlight and snippet results e2e (#3567)
Co-authored-by: Pierre Millot <pierre.millot@algolia.com>
1 parent 3f3e462 commit 4cbbce5

File tree

24 files changed

+341
-260
lines changed

24 files changed

+341
-260
lines changed
 

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

+5
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+
}

‎clients/algoliasearch-client-kotlin/client/src/commonMain/kotlin/com/algolia/client/extensions/internal/Json.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ internal val JsonElement.isString: Boolean
5959
* Returns true if [JsonElement] is a [JsonArray] of primitives, false otherwise.
6060
*/
6161
internal val JsonElement.isJsonArrayOfPrimitives: Boolean
62-
get() = this is JsonArray && first() is JsonPrimitive
62+
get() = this is JsonArray && (isEmpty() || first() is JsonPrimitive)
6363

6464
/**
6565
* Returns true if [JsonElement] is a [JsonArray] of objects, false otherwise.
6666
*/
6767
internal val JsonElement.isJsonArrayOfObjects: Boolean
68-
get() = this is JsonArray && first() is JsonObject
68+
get() = this is JsonArray && (isEmpty() || first() is JsonObject)

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

+1
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

+29-27
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ private OneOf() {
1212
}
1313

1414
public static void updateModelsOneOf(Map<String, ModelsMap> models, String modelPackage) {
15+
// first, propagate the discriminator of allOf to the parent
16+
for (ModelsMap modelContainer : models.values()) {
17+
var model = modelContainer.getModels().get(0).getModel();
18+
if (model.getComposedSchemas() != null && model.getComposedSchemas().getAllOf() != null) {
19+
for (CodegenProperty prop : model.getComposedSchemas().getAllOf()) {
20+
if (prop.vendorExtensions.containsKey("x-discriminator-fields")) {
21+
model.vendorExtensions.put("x-discriminator-fields", prop.vendorExtensions.get("x-discriminator-fields"));
22+
}
23+
}
24+
}
25+
}
26+
1527
for (ModelsMap modelContainer : models.values()) {
1628
// modelContainers always have 1 and only 1 model in our specs
1729
var model = modelContainer.getModels().get(0).getModel();
@@ -63,7 +75,6 @@ private static void markOneOfChildren(Map<String, ModelsMap> models, CodegenMode
6375
markCompounds(models, oneOf, oneOfModel, model);
6476
oneOfList.add(oneOfModel);
6577
}
66-
oneOfList.sort(comparator); // have fields with "discriminators" in the start of the list
6778
model.vendorExtensions.put("x-one-of-list", oneOfList);
6879
}
6980

@@ -86,8 +97,13 @@ public static void markCompounds(Map<String, ModelsMap> models, String oneOf, Ma
8697
//noinspection unchecked
8798
var values = (List<String>) compoundModel.vendorExtensions.get("x-discriminator-fields");
8899
if (values != null) {
89-
List<Map<String, String>> newValues = values.stream().map(value -> Collections.singletonMap("field", value)).toList();
90-
oneOfModel.put("discriminators", newValues);
100+
oneOfModel.put("x-discriminator-fields", values);
101+
// find the matching composed schema and assign the discriminator
102+
for (var m : model.getComposedSchemas().getOneOf()) {
103+
if (m.openApiType.equals(compoundModel.classname)) {
104+
m.vendorExtensions.put("x-discriminator-fields", values);
105+
}
106+
}
91107
}
92108
}
93109

@@ -104,29 +120,6 @@ private static boolean isNumberType(String typeName) {
104120
return typeName.equals("Int") || typeName.equals("Double") || typeName.equals("Long");
105121
}
106122

107-
public static final Comparator<Map<String, Object>> comparator = (mapA, mapB) -> {
108-
boolean hasDiscriminatorA = mapA.containsKey("discriminators");
109-
boolean hasDiscriminatorB = mapB.containsKey("discriminators");
110-
// Maps with "discriminators" come first
111-
if (hasDiscriminatorA && !hasDiscriminatorB) {
112-
return -1;
113-
} else if (!hasDiscriminatorA && hasDiscriminatorB) {
114-
return 1;
115-
} else {
116-
// If both maps have or don't have "discriminators," compare their list lengths
117-
if (hasDiscriminatorA && hasDiscriminatorB) {
118-
List<?> discriminatorsA = (List<?>) mapA.get("discriminators");
119-
List<?> discriminatorsB = (List<?>) mapB.get("discriminators");
120-
121-
// Compare the lengths of the lists
122-
return discriminatorsB.size() - discriminatorsA.size();
123-
}
124-
125-
// If the lengths are the same or both maps don't have "discriminators," return 0
126-
return 0;
127-
}
128-
};
129-
130123
/**
131124
* Add metadata about oneOfs models (e.g., if it has at least one model, if it has more than one
132125
* array-subtype, etc.)
@@ -139,6 +132,7 @@ public static void addOneOfMetadata(Map<String, ModelsMap> models) {
139132
if (isMultiArrayOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-array", true);
140133
if (isMultiMapOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-map", true);
141134
if (hasAtModelOrEnum(oneOfs)) model.vendorExtensions.put("x-has-model", true);
135+
if (hasDiscriminators(oneOfs)) model.vendorExtensions.put("x-has-discriminator", true);
142136
markOneOfModels(oneOfs);
143137
sortOneOfs(oneOfs);
144138
}
@@ -178,6 +172,14 @@ private static boolean hasAtModelOrEnum(List<CodegenProperty> oneOfs) {
178172
return false;
179173
}
180174

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+
181183
/** Mark oneOf models */
182184
private static void markOneOfModels(List<CodegenProperty> oneOfs) {
183185
for (var prop : oneOfs) {
@@ -201,7 +203,7 @@ private static void sortOneOfs(List<CodegenProperty> oneOfs) {
201203
return 1;
202204
} else if (hasDiscriminatorA && hasDiscriminatorB) {
203205
List<?> discriminatorsA = (List<?>) propA.vendorExtensions.get("x-discriminator-fields");
204-
List<?> discriminatorsB = (List<?>) propA.vendorExtensions.get("x-discriminator-fields");
206+
List<?> discriminatorsB = (List<?>) propB.vendorExtensions.get("x-discriminator-fields");
205207
return discriminatorsB.size() - discriminatorsA.size();
206208
} else {
207209
return 0;

‎specs/abtesting/common/schemas/ABTest.yml

-5
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@ ABTest:
9494
- createdAt
9595
- endAt
9696
- updatedAt
97-
- conversionSignificance
98-
- clickSignificance
99-
- purchaseSignificance
100-
- addToCartSignificance
101-
- revenueSignificance
10297
- abTestID
10398
- variants
10499

‎specs/abtesting/common/schemas/AddABTestsVariant.yml

+2
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

‎specs/abtesting/common/schemas/Variant.yml

-5
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,7 @@ variant:
118118
- noResultCount
119119
- index
120120
- description
121-
- conversionRate
122121
- conversionCount
123-
- clickThroughRate
124122
- clickCount
125-
- averageClickPosition
126-
- addToCartRate
127123
- addToCartCount
128-
- purchaseRate
129124
- purchaseCount

‎specs/common/schemas/HighlightResult.yml

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ highlightResultOption:
2020
- value
2121
- matchLevel
2222
- matchedWords
23+
x-discriminator-fields:
24+
- matchLevel
25+
- matchedWords
2326

2427
highlightedValue:
2528
type: string

‎specs/common/schemas/SnippetResult.yml

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ snippetResultOption:
1010
required:
1111
- value
1212
- matchLevel
13+
x-discriminator-fields:
14+
- matchLevel
1315

1416
snippetResultOptionMap:
1517
type: object

‎specs/ingestion/common/schemas/authentication.yml

+20
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ AuthGoogleServiceAccountPartial:
127127
privateKey:
128128
type: string
129129
description: Private key of the Google service account. This field is `null` in the API response.
130+
x-discriminator-fields:
131+
- clientEmail
130132

131133
AuthBasicPartial:
132134
type: object
@@ -139,6 +141,8 @@ AuthBasicPartial:
139141
password:
140142
type: string
141143
description: Password. This field is `null` in the API response.
144+
x-discriminator-fields:
145+
- username
142146

143147
AuthAPIKeyPartial:
144148
type: object
@@ -148,6 +152,8 @@ AuthAPIKeyPartial:
148152
key:
149153
type: string
150154
description: API key. This field is `null` in the API response.
155+
x-discriminator-fields:
156+
- key
151157

152158
AuthOAuthPartial:
153159
type: object
@@ -167,6 +173,8 @@ AuthOAuthPartial:
167173
type: string
168174
default: ''
169175
description: OAuth scope.
176+
x-discriminator-fields:
177+
- url
170178

171179
AuthAlgoliaPartial:
172180
type: object
@@ -211,6 +219,9 @@ AuthGoogleServiceAccount:
211219
required:
212220
- clientEmail
213221
- privateKey
222+
x-discriminator-fields:
223+
- clientEmail
224+
- privateKey
214225

215226
AuthBasic:
216227
type: object
@@ -226,6 +237,9 @@ AuthBasic:
226237
required:
227238
- username
228239
- password
240+
x-discriminator-fields:
241+
- username
242+
- password
229243

230244
AuthAPIKey:
231245
type: object
@@ -237,6 +251,8 @@ AuthAPIKey:
237251
description: API key. This field is `null` in the API response.
238252
required:
239253
- key
254+
x-discriminator-fields:
255+
- key
240256

241257
AuthOAuth:
242258
type: object
@@ -260,6 +276,10 @@ AuthOAuth:
260276
- url
261277
- client_id
262278
- client_secret
279+
x-discriminator-fields:
280+
- url
281+
- client_id
282+
- client_secret
263283

264284
AuthAlgolia:
265285
type: object

‎specs/ingestion/common/schemas/source.yml

+7
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,11 @@ SourceDocker:
366366
- image
367367
- imageType
368368
- configuration
369+
x-discriminator-fields:
370+
- registry
371+
- image
372+
- imageType
373+
- configuration
369374

370375
SourceUpdateDocker:
371376
type: object
@@ -387,6 +392,8 @@ SourceUpdateDocker:
387392
description: Configuration of the spec.
388393
required:
389394
- configuration
395+
x-discriminator-fields:
396+
- configuration
390397

391398
DockerRegistry:
392399
type: string

‎specs/ingestion/common/schemas/task.yml

+9
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ ScheduleTriggerInput:
302302
required:
303303
- type
304304
- cron
305+
x-discriminator-fields:
306+
- cron
305307

306308
ScheduleTrigger:
307309
type: object
@@ -444,6 +446,9 @@ MappingInput:
444446
required:
445447
- format
446448
- actions
449+
x-discriminator-fields:
450+
- format
451+
- actions
447452

448453
StreamingInput:
449454
type: object
@@ -454,6 +459,8 @@ StreamingInput:
454459
$ref: '#/MappingInput'
455460
required:
456461
- mapping
462+
x-discriminator-fields:
463+
- mapping
457464

458465
DockerStreamsInput:
459466
description: The selected streams of a singer or airbyte connector.
@@ -465,6 +472,8 @@ DockerStreamsInput:
465472
$ref: '#/DockerStreams'
466473
required:
467474
- streams
475+
x-discriminator-fields:
476+
- streams
468477

469478
DockerStreams:
470479
type: object

‎specs/search/paths/rules/common/schemas.yml

+4
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ promoteObjectID:
151151
required:
152152
- position
153153
- objectID
154+
x-discriminator-fields:
155+
- objectID
154156

155157
promoteObjectIDs:
156158
title: objectIDs
@@ -174,6 +176,8 @@ promoteObjectIDs:
174176
required:
175177
- position
176178
- objectIDs
179+
x-discriminator-fields:
180+
- objectIDs
177181

178182
promotePosition:
179183
type: integer

0 commit comments

Comments
 (0)
Please sign in to comment.