@@ -193,21 +193,36 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
193
193
194
194
final JsonObject preDefinedExtraFields =
195
195
JsonObject .of (signalHeaders .get (DittoHeaderDefinition .PRE_DEFINED_EXTRA_FIELDS_OBJECT .getKey ()));
196
- final JsonObject filteredPreDefinedExtraFieldsReadGranted =
197
- filterPreDefinedExtraReadGrantedObject (jsonFieldSelector , dittoHeaders , signalHeaders ,
198
- preDefinedExtraFields );
196
+ final JsonObject preDefinedExtraFieldsReadGrantObject = JsonObject .of (
197
+ signalHeaders .get (DittoHeaderDefinition .PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT .getKey ())
198
+ );
199
+ final boolean preDefinedExtraFieldsAuthAvailable = !preDefinedExtraFieldsReadGrantObject .isEmpty ();
200
+
201
+ final JsonObject filteredPreDefinedExtraFieldsReadGranted = filterPreDefinedExtraReadGrantedObject (
202
+ jsonFieldSelector , dittoHeaders , preDefinedExtraFieldsReadGrantObject , preDefinedExtraFields );
199
203
200
- final boolean allExtraFieldsPresent =
201
- allConfiguredPredefinedExtraFields .containsAll (jsonFieldSelector .getPointers ());
202
- if (allExtraFieldsPresent ) {
204
+ final boolean allExtraFieldsPresent = jsonFieldSelector .getPointers ().stream ()
205
+ .allMatch (requiredField ->
206
+ allConfiguredPredefinedExtraFields .contains (requiredField ) ||
207
+ allConfiguredPredefinedExtraFields .stream ()
208
+ .anyMatch (configuredField ->
209
+ requiredField .toString ().startsWith (configuredField .toString ())
210
+ )
211
+ );
212
+
213
+ if (allExtraFieldsPresent && preDefinedExtraFieldsAuthAvailable ) {
203
214
LOGGER .withCorrelationId (dittoHeaders )
204
215
.debug ("All asked for extraFields for thing <{}> were present in pre-defined fields, " +
205
216
"skipping cache retrieval: <{}>" , thingId , jsonFieldSelector );
206
217
return CompletableFuture .completedStage (filteredPreDefinedExtraFieldsReadGranted );
207
218
} else {
208
219
// optimization to only fetch extra fields which were not pre-defined
209
220
final List <JsonPointer > missingFieldsPointers = new ArrayList <>(jsonFieldSelector .getPointers ());
210
- missingFieldsPointers .removeAll (allConfiguredPredefinedExtraFields );
221
+ if (preDefinedExtraFieldsAuthAvailable ) {
222
+ // only if we have a proper authorization, we can apply the optimization and remove existing fields
223
+ // to not load them via cache
224
+ missingFieldsPointers .removeAll (allConfiguredPredefinedExtraFields );
225
+ }
211
226
final JsonFieldSelector missingFieldsSelector = JsonFactory .newFieldSelector (missingFieldsPointers );
212
227
final var cachingParameters =
213
228
new CachingParameters (missingFieldsSelector , thingEvents , true , 0 );
@@ -228,12 +243,9 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
228
243
private static JsonObject filterPreDefinedExtraReadGrantedObject (
229
244
final JsonFieldSelector jsonFieldSelector ,
230
245
final DittoHeaders dittoHeaders ,
231
- final DittoHeaders signalHeaders ,
246
+ final JsonObject preDefinedExtraFieldsReadGrant ,
232
247
final JsonObject preDefinedExtraFields
233
248
) {
234
- final JsonObject preDefinedExtraFieldsReadGrant = JsonObject .of (
235
- signalHeaders .get (DittoHeaderDefinition .PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT .getKey ())
236
- );
237
249
final JsonFieldSelector grantedReadJsonFieldSelector = filterAskedForFieldSelectorToGrantedFields (
238
250
jsonFieldSelector ,
239
251
preDefinedExtraFieldsReadGrant ,
0 commit comments