Ändringar i GraphQL-hantering av null-värden | AEM

Beskrivning

Miljö
Experience Manager as a Cloud Service

Problem/symtom
I version 2023.02.11382 har vissa förbättringar gjorts i implementeringen av GraphQL (Open-Source Query Language) som kan orsaka oväntade beteenden i programkoden, om den förlitade sig på det felaktiga beteendet i de äldre versionerna. Upplösningen nedan gör att Adobe Experience Manager (AEM) GraphQL nu returnerar innehåll med null-värden på ett konsekvent sätt för alla filteråtgärder.

Upplösning

CONTAINS_NOT och null values
 
Den första ändringen påverkar filtervillkoren som använder CONTAINS_NOT -operator. I tidigare versioner CONTAINS_NOT returnerade inte innehållsfragment som innehåller null värden i fältet som filtervillkoret tillämpades på. Detta är inkonsekvent med liknande operatorer som EQUALS_NOT eller NOT_AT.
Kontrollera att klientprogrammet kan hantera null värden som returneras av AEM när de använder CONTAINS_NOT.
 
Exempel:

Filterfragment Data Resultat före 2023.02.11382 Resultat från och med 2023.02.11382
myField: {
    värde: "frag", 
    _op: CONTAINS_NOT
}
[
    {
        myField: null
    }, 
    {
        myField: "Viss text"
    },
    {
        myField: "Textfragment"
    }
]
[
    {
        myField: "Viss text"
    }
]
[
    {
        myField: null
    },
    {
        myField: "Viss text"
    }
]

Använd lägen ALL_OR_EMPTY/ALL och null values
Ett annat problem som korrigerades 2023.02.11382 har att göra med null värden i filtervillkor i flervärdesfält. Läget Använd ALL_OR_EMPTY (på matriser/fält med flera värden) returnerade inte fragment med null värden för fältet i fråga, därför fungerade det som du förväntade dig för ALL använd metod. Filtrera samtidigt ett flervärdesfält med tillämpningsläge ALL skulle innehålla fragment med tomt innehåll för det fältet, men det borde inte det. Vi rekommenderar att du testar frågor som använder något av dessa tillämpningslägen och ändrar dem om de inte längre returnerar det förväntade resultatet som angavs i 2023.02.11382.

Observera att problemet bara fanns för vissa operatorer (före 2023.02.11382).
Till exempel: EQUALS_NOT fungerade som förväntat för tillämpningsmetoden ALL_OR_EMPTY, medan CONTAINS inte.
Exempel:

Filterfragment Data Resultat före 2023.02.11382 Resultat från och med 2023.02.11382
myArray: {
  _uttryck: {
    värde: "1.3"
    _operator: EQUALS_NOT
    _använd: ALLA
  }
}
[
  {
    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: {
  _uttryck: {
    värde: "2."
    _operator: INNEHÅLLER
    _använd: ALL_OR_EMPTY
  }
}
[
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]
[
  {
    myArray: null
  },
  {
    myArray: [ "2.1", "2.2", "2.3" ]
  }
]

Använd lägen: INSTANCES, _instances: 0 och null values
Den sista utgåvan är också relaterad till null värden i filtervillkor i flervärdesfält. Läget Använd INSTANCES med_instances: 0 matchar inte innehållsfragmenten som innehåller null värden i respektive fält före 2023.02.11382, men börjar med 2023.02.11382. Vi rekommenderar att du testar frågor som använder den här konstellationen och ändrar dem om de inte returnerar det förväntade resultatet som angavs i 2023.02.11382 längre.
Exempel:

Filterfragment Data Resultat före 2023.02.11382 Resultat från och med 2023.02.11382
myArray: {
  _uttryck: {
    värde: "2."
    _operator: INNEHÅLLER
    _använd: INSTANSER
    _instanser: 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" ]
  }
]

Förbättringar som kan påverka kunder med ft-sites-97 aktiverad
Kunder som hade ft-sites-97(GraphQL paginering och optimerad filtrering) funktionsflagga aktiverad föreversion 2023.02.11382 kan uppleva en eller flera av följande beteendeförändringar efter uppgradering till 2023.02.11382. Kunder som inte har den här funktionsflaggan aktiverad påverkas inte av det här avsnittet.
null-hantering med villkor som söker efter icke-likhet
Fragmentfält med null värden matchades inte ibland av de filter som kontrollerar om de inte är lika.

Om koden är beroende av att dessa fragment inte returneras måste du justera koden så att den passar det förväntade beteendet.

Filterfragment Data Resultat från mellanliggande implementering Resultat från slutlig implementering
myField: {
  värde: "Some text",
  _op: EQUALS_NOT
}
[
  {
    myField: null
  },
  {
    myField: "Viss text"
  },
  {
    myField: "Textfragment"
  }
]
[
  {
    myField: "Viss text"
  }
]
[
  {
    myField: null
  },
  {
    myField: "Viss text"
  }
]

Filteroperator NOT_AT med datum/tid-värden
Filteroperator NOT_AT ibland inte fungerade korrekt med data/tidpunkter-värden. Istället fungerade det mer som AFTER villkor.
Om koden använder fel beteende bör du växla filtervillkoret till AFTER.
Arrayer: INSTANCES med _instances: 0 fungerar inte korrekt
Filtervillkor INSTANCES (på arrayer/flervärdesfält) med _instances med värdet 0 ibland fungerade inte som förväntat, det returnerade ingenting där det faktiskt borde ha varit.

Filterfragment som påverkas av det här problemet ser ut så här: doubleArray: { _expressions: { value: 0, _operator: GREATER, _apply: INSTANCES, _instances: 0 } }

Om du förlitar dig på det felaktiga beteendet måste du skriva om frågan för att returnera samma resultat som tidigare.

Filterfragment Data Resultat från mellanliggande implementering Resultat från slutlig implementering
myArray: {
  _uttryck: {
    värde: 20
    _operator: LIKA
    _använd: INSTANSER
    _instanser: 0
  }
}
[
  {
    myArray: null
  },
  {
    myArray: [ 10, 20, 30 ]
  },
  {
    myArray: [ 11, 12, 13 ]
  }
]
[ ] [
  {
    myArray: null
  },
  {
    myArray: [ 11, 12, 13 ]
  }
]

På denna sida