Modifiche nella gestione di GraphQL dei valori nulli | AEM

Ultimo aggiornamento: 2023-05-09

Descrizione

Ambiente
Experience Manager as a Cloud Service

Problema/Sintomi
Nella versione 2023.02.11382 sono stati apportati alcuni miglioramenti nell’implementazione di GraphQL (Open-Source Query Language) che potrebbero causare un comportamento imprevisto nel codice dell’applicazione, nel caso in cui si basasse sul comportamento errato delle versioni precedenti. La risoluzione di seguito indicata aiuta a ottenere che Adobe Experience Manager (AEM) GraphQL restituisce ora il contenuto con valori nulli in modo coerente in tutte le operazioni del filtro.

Risoluzione

CONTAINS_NOT e null values
 
La prima modifica influisce sulle condizioni del filtro che sfruttano CONTAINS_NOT operatore. Nelle versioni precedenti, questo CONTAINS_NOT non ha restituito frammenti di contenuto contenenti null nel campo a cui è stata applicata la condizione del filtro. Ciò non è coerente con operatori simili come EQUALS_NOT o NOT_AT.
Assicurati che l'applicazione client sia in grado di gestire null valori restituiti da AEM quando si utilizza CONTAINS_NOT.
 
Esempio:

Filtro frammento Dati Risultato prima del 2023.02.11382 Risultato a partire da 2023.02.11382
myField: {
    valore: "frag", 
    _op: CONTAINS_NOT
}
[
    {
        myField: null
    }, 
    {
        myField: "Testo"
    },
    {
        myField: "Frammento di testo"
    }
]
[
    {
        myField: "Testo"
    }
]
[
    {
        myField: null
    },
    {
        myField: "Testo"
    }
]

Applicare le modalità ALL_OR_EMPTY/ALLnull values
Un altro problema risolto nel 2023.02.11382 è relativo a null in condizioni di filtro per campi con più valori. Modalità Applica ALL_OR_EMPTY (su array/campi multivalore) non restituiva frammenti con null valori per il campo in questione, quindi funzionava effettivamente come previsto per il ALL metodo di applicazione. Allo stesso tempo, filtrare un campo con più valori con modalità di applicazione ALL includerebbe frammenti con contenuto vuoto per quel campo, ma non dovrebbe. Si consiglia di testare le query che utilizzano una di queste modalità di applicazione e modificarle se non restituiscono più il risultato previsto impostato nel 2023.02.11382.

Il problema esisteva solo per alcuni operatori (prima del 2023.02.11382).
Ad esempio: EQUALS_NOT ha funzionato come previsto per il metodo di applicazione ALL_OR_EMPTY, considerando che CONTAINS No.
Esempio:

Filtro frammento Dati Risultato prima del 2023.02.11382 Risultato a partire da 2023.02.11382
myArray: {
  _espressioni: {
    valore: "1.3"
    _operatore: EQUALS_NOT
    _applica: TUTTO
  }
}
[
  {
    myArray: null
  },
  {
    myArray: [ "1.1", "1.2", "1.3" ]
  },
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
[
  {
    myArray: null
  },
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
[
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
myArray: {
  _espressioni: {
    valore: "2."
    _operatore: CONTENITORI
    _applica: ALL_OR_EMPTY
  }
}
[
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
[
  {
    myArray: null
  },
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]

Applicare le modalità: INSTANCES, _instances: 0 e null values
L'ultimo problema riguarda anche null in condizioni di filtro per campi con più valori. Modalità Applica INSTANCES con_instances: 0 non corrispondono ai frammenti di contenuto che contengono null valori nel rispettivo campo prima di 2023.02.11382, ma inizierà con 2023.02.11382. Si consiglia di testare le query che utilizzano questa costellazione e modificarle se non restituiscono il risultato previsto impostato nel 2023.02.113 Ancora 82.
Esempio:

Filtro frammento Dati Risultato prima del 2023.02.11382 Risultato a partire da 2023.02.11382
myArray: {
  _espressioni: {
    valore: "2."
    _operatore: CONTENITORI
    _applica: ISTANZE
    _istanze: 0
  }
}
[
  {
    myArray: null
  },
  {
    myArray: [ "1.1", "1.2", "1.3" ]
  },
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
[
  {
    myArray: [ "1.1", "1.2", "1.3" ]
  }
]
[
  {
    myArray: null
  },
  {
    myArray: [ "1.1", "1.2", "1.3" ]
  }
]

Miglioramenti che possono influenzare i clienti con ft-sites-97 abilitato
Clienti che avevano ft-sites-97(Paginazione GraphQL e filtro ottimizzato) flag di funzione abilitato primadopo l’aggiornamento alla versione 2023.02.11382 potrebbe verificarsi una o più delle seguenti modifiche al comportamento dopo l’aggiornamento alla versione 2023.02.11382. I clienti che non dispongono di questo flag di funzionalità abilitato non sono interessati da questa sezione.
gestione null con condizioni che verificano la non uguaglianza
Campi frammento con null i valori non corrispondevano a intermittenza ai filtri che verificavano la non uguaglianza.

Se il codice si basa su questi frammenti che non vengono restituiti, sarà necessario regolare il codice per adattarlo al comportamento previsto.

Filtro frammento Dati Risultato dell'implementazione intermedia Risultato dell'implementazione finale
myField: {
  valore: "un testo",
  _op: EQUALS_NOT
}
[
  {
    myField: null
  },
  {
    myField: "Testo"
  },
  {
    myField: "Frammento di testo"
  }
]
[
  {
    myField: "Testo"
  }
]
[
  {
    myField: null
  },
  {
    myField: "Testo"
  }
]

Operatore filtro NOT_AT con valori data/ora
Operatore filtro NOT_AT non funzionava in modo corretto con i valori data/ora. Invece stava funzionando più come il AFTER condizione.
Se il codice si basa su un comportamento non corretto, devi impostare la condizione del filtro su AFTER.
Array: INSTANCES con _instances: 0 non funziona correttamente
Condizione del filtro INSTANCES (su array/campi multivalore) con _instances impostato su 0 a intermittenza non funzionava come previsto, non restituiva nulla dove effettivamente avrebbe dovuto essere.

I frammenti filtrati interessati da questo problema saranno simili a: doubleArray: { _expressions: { value: 0, _operator: GREATER, _apply: INSTANCES, _instances: 0 } }

Se ti affidavi al comportamento errato, devi riscrivere la query per restituire gli stessi risultati di prima.

Filtro frammento Dati Risultato dell'implementazione intermedia Risultato dell'implementazione finale
myArray: {
  _espressioni: {
    valore: 20
    _operatore: UGUALE
    _applica: ISTANZE
    _istanze: 0
  }
}
[
  {
    myArray: null
  },
  {
    myArray: [ 10, 20, 30 ]
  },
  {
    myArray: [ 11, 12, 13 ]
  }
]
[ ] [
  {
    myArray: null
  },
  {
    myArray: [ 11, 12, 13 ]
  }
]

In questa pagina