OpenCatalogi / .github

Eén centrale plek voor hergebruik van informatietechnologie binnen de overheid
2 stars 1 forks source link

Als gebruiker wil ik kunnen filteren op array values #137

Closed rubenvdlinde closed 5 months ago

rubenvdlinde commented 2 years ago

Zodat ik kan zoeken binnen array's van waardes, in de praktijk komt het nogal vaak voor dat ik alle objecten wil hebben die X of Y in hun waarde hebben.

Dit probleem loopt al een tijdje rond en komt eigenlijk voort uit hoe doctrine met array's werkt. Ze worden opgeslagen emt de serialize fucntie en daardoor feitenlijk een onleesbare blob in de database. Een leuke uitleg van hoe de verschillende types van array's gedragen vind je hier [https://www.doctrine-project.org/projects/doctrine-dbal/en/2.7/reference/types.html#array-types|https://www.doctrine-project.org/projects/doctrine-dbal/en/2.7/reference/types.html#array-types|smart-link] .

Interessante observatie hier, als we simple_array gaan gebruiken ipv array lost dit probleem waarschijnlijk zichzelf op, met dat nadeel dat simpel array maar 1 dimensie ondersteund, geen key/value pairs en geen objecten. Dat is best een drain maar gaat vermoedelijk voor het merendeel van de data die wij opslaan prima werken. Sterker nog we zouden aan de hand van het type data waar een atribute uit bestaan nog kunnen kiezen wat voor array type we gebruiken.

Huidige array property in de value entity

{code:php}/**

Nieuwe (extra) simpel array value

{noformat}/*   @var array Array if the value is type array    @Groups({"read", "write"})   @ORM\Column(type="simple_array", nullable=true)  /

private $simpleArrayValue;{noformat}

Let er op dat er dan nog een kleine aanpassing nodig is in de getValue en setValue functies van de value entity om te zorgen dat de juiste dingen naar het juiste array type worden weggeschreven. (overigens valt me daar op dat we op dit moment date en datetime niet in array’s opslaan. Maar als we die proper parsen kan dat natuurlijk prima.

Okey, maar wat nou als het nu nog steeds niet by default werkt? (het searchen dan)

Wel dan hebben we met simple array een B route. Omdat met simple array de array wordt omgeslagen naar een imploded tekst e.g. “brood,eieren,kaas” kunnen we de sql like operator met wildcard gebruiken om in de waarde kolom te zoeken naar een specifieke waarde. Ofwel like ‘%eieren%’ levert een hit op.

Opmerkingen

·         Het is mij onduidelijk wat er gebeurd als er een , in een waarde zit die worde geimplode/explode. Dat kan nog wel eens een issue geven.

rubenvdlinde commented 2 years ago

Ruben van der Linde commented: Grappige bijvangst, op dit moment kunnen we niet omgaan met arrays van date en datetime. Wierdly enough lost deze oplossing dat ook op

rubenvdlinde commented 2 years ago

Ruben van der Linde commented: Kijk een aan, vanuit de search functie

{code:php} /**

We doen dus gewoon al per definitie zoeken met een like….. mits search partial aan staat. Met andere woorden de code uit [https://github.com/ConductionNL/commonground-gateway/pull/662|https://github.com/ConductionNL/commonground-gateway/pull/662|smart-link] zou in theorie gewoon al moeten werken mits op atribute search partial is aangezet. Om te voorkomen dat dat altijd moet een kleine aanpassing in de code klaargezet.

{code:php} ->andWhere('valueSearch.stringValue LIKE :search AND (valueSearchAttribute.searchPartial IS NOT NULL OR valueSearchAttribute.multiple IS NOT NULL)'){code}

That should do it for search

Then for normal operations we used to do

{code:php}// Check the actual value (example: key = value) // NOTE: we always use stringValue to compare, but this works for other type of values, as long as we always set the stringValue in Value.php $query->andWhere("$prefix$key.stringValue = :$key") ->setParameter($key, $value);{code}

Changing that to

{code:php}// Check the actual value (example: key = value) // NOTE: we always use stringValue to compare, but this works for other type of values, as long as we always set the stringValue in Value.php $query->andWhere("$prefix$key.stringValue LIKE :$key") ->setParameter($key, $value);{code}

Automaticly alows the use of wildcard operations in query questions