.contains verhält sich wie ?contains (Feldtyp MultipleValue)

Hi Team,

ich habe aktuell ein sehr bedenkliches Verhalten und weiß nicht wie ich damit umgehen soll.

Folgendes Setup. Gesucht werden Elemente mit enthaltenem Value 29

ID | MultipleValueColumn
123 | 0815;29;10
456 | 4711;129;1
789 | 11;129

SearchDatastore
|
v
Filter (Argument: MultipleValueColumn.contains(‚29‘)
|
v
Mapper

Ich erwarte, dass lediglich ID 123 ausgespuckt wird, es werden jedoch auch die anderen beiden IDs im positiven Ergebnis des Filters weitergegeben.

Gebe ich in der Gegenprobe das Freemarker Script direkt im Datastore ein, bekomme ich wirklich nur alle Elemente angezeigt, die als MultipleValue den Value 29 auch hinterlegt haben.

Edit:

Fürs Debugging: Zur Kontrolle habe ich jetzt vor dem Filter nochmal einen Mapper mit einer true/false Prüfung gesetzt, ob Wert 29 enthalten ist.

<#if MultipleValueColumn.contains('29')>true<#else>false</#if>

Für ID 456 habe ich true zurück bekommen.

Wende ich jedoch den Code

<#if VariationTagIDs?split(';')?seq_contains('29')>true<#else>false</#if>

an, erhalte ich false zurück. Was natürlich richtig ist.

Hi @Marc

Das ist auch die korrekte Lösung.

Hier wird ein contains check auf jedes einzelne Element im Sinne eines „enthält der ein String-Element der Liste einen Teilstring“.
Und 29 kommt in 129 vor.

Wäre dein Feld kein MULTIPLEVALUE sondern ein einfacher String, wäre .contains (mit .) es analog dazu. Es wird auf Teilstring geprüft.
„Unser“ .contains() verhält sich wie ?contains bei Freemarker.
Ein ?seq_contains haben wir bei unseren internen Funktionen nicht.

Ich merke auch gerade, dass wir das in der Doku nicht gut dokumentiert haben. Das überarbeiten wir.

1 Like

Danke für die schnelle Rückmeldung! Da muss ich dann doch erstmal kontrollieren, ob das nicht ungewünschte Verhalten auslöst bei uns.

Hallo @Marc ,

wir haben uns nochmal intern besprochen:

Du kannst unsere interne .equalsAll() Funktion verwenden, die für MULTIPLEVALUE Felder aus Datastores funktioniert.

Input: MultipleValue=0815;29;10
Script: <#if MultipleValueColumn.equalsAll('29')>true<#else>false</#if>
Ergebnis: true

Input: MultipleValue=0815;129;10
Script: <#if MultipleValueColumn.equalsAll('29')>true<#else>false</#if>
Ergebnis: false

Input: MultipleValue=0815;29;10
Script: <#if MultipleValueColumn.equalsAll('29', '10')>true<#else>false</#if>
Ergebnis: true

Input: MultipleValue=0815;29;10
Script: <#if MultipleValueColumn.equalsAll('29', '1')>true<#else>false</#if>
Ergebnis: false

<#if colors.equalsAll("green")>Grün</#if>

.equalsAll() ist eine Synesty-eigene Funktion, die MULTIPLEVALUE Spalten nach exakter Übereinstimmung durchsucht. Beim ersten Treffer liefert der Test true . Vergleichbar ist das mit der Freemarker-Funktion ?seq_contains().

.equalsAll() akzeptiert aber auch mehrere Werte (.equalsAll(wert1 [,wert2]) ) und liefert true nur wenn ALLE Werte in der Liste enthalten sind.

<#if colors.equalsAll("green", "red")>Grün und rot</#if>

<#if colors.equalsAll("green", "blue")>Grün und blau<#else>mindestens eins davon ist nicht enthalten</#if>

Wir werden das auch noch im Handbuch ergänzen.
Wir haben einige interne Funktionen wie diese bisher spärlich dokumentiert, da es oft passende Wege in Freemarker gibt und einige dieser Funktionen aus einer Zeit stammen, als Freemarker noch nicht so viel konnte. Da wir aber „leider“ .contains() schon dokumentiert haben, und das damit in der Welt ist, werden wir jetzt auch noch einige anderen Funktionen nachdokumentieren.

Update: Die aktualisierte Dokumentation ist live. (Auf der Seite nach MULTIPLEVALUE suchen.)

Eure Geschwindigkeit und Art und Weise fasziniert mich immer wieder aufs neue :blush:

Vielen Dank!

Gruß,
Marc