enhancement
major
minor
defect
critical
major
minor
minor
#30089
TL-Script-Funktionen `binarySize()` und `modelHealthReset()` liefern Ganzzahl statt Double und protokollieren bei jedem Aufruf einen Fehler
Beschreibung
Die TL-Script-Funktion binarySize() (Klasse BinaryFunctions, Präfix binary) gibt die Größe eines Binärwerts als java.lang.Long zurück. TL-Script verlangt für Zahlen aber Double. SearchExpression.internalCheckValue() wandelt den Wert zwar um, protokolliert aber bei jedem Aufruf einen Fehler mit Stacktrace:
Numbers in TL-Script must be represented as Double only. Use SearchExpression.toNumber() before returning a number from a TL-Script function.
Das Ergebnis der Funktion selbst ist korrekt. Weil der Fehler aber im Log landet, bricht jeder Test ab, der Fehler im Log als Fehlschlag wertet, z.B. ScriptedTest / ApplicationTestSetup ("An error was logged during the test execution!").
Dasselbe gilt für die TL-Script-Funktion modelHealthReset() (Klasse AIScriptFunctions, tl-ai-core), die die Anzahl der zurückgesetzten Markierungen als int liefert.
Ursache
com.top_logic.model.search/src/main/java/com/top_logic/model/search/expr/config/operations/BinaryFunctions.java, Zeile 76f.:
{{{#!java public static Long size(@Mandatory BinaryDataSource data) { return data == null ? null : Long.valueOf(data.getSize()); } }}}
Prüfung in com.top_logic.model.search/src/main/java/com/top_logic/model/search/expr/SearchExpression.java, Zeile 141ff. (internalCheckValue): Integer, Long, Short und Byte werden als Fehler protokolliert.
Reproduktion
- Ein Modelltyp mit einem Attribut data vom Typ tl.core:Binary und einem abgeleiteten Attribut:
{{{#!xml <property name="size" type="tl.core:Long"> <annotations> <storage-algorithm> <query expr="d -> binarySize($d.get(my.module:Document#data))"/> </storage-algorithm> </annotations> </property> }}}
- Ein Objekt mit einer hochgeladenen Datei anlegen und size anzeigen, z.B. als Tabellenspalte.
- Im Log steht für jede Berechnung der oben genannte Fehler.
Direkt reproduzierbar auch mit einem beliebigen TL-Script-Ausdruck, z.B. binarySize(binary("x")).
Erwartetes Verhalten
binarySize() liefert einen Double (bzw. -1.0, wenn die Größe unbekannt ist), ohne dass ein Fehler protokolliert wird.
Workaround
Spalte "Size" nicht anzeigen.
Lösung
- BinaryFunctions.size() (binarySize()) liefert Double über SearchExpression.toNumber().
- AIScriptFunctions.modelHealthReset() liefert die Anzahl der zurückgesetzten Markierungen ebenfalls als Double. Eine Durchsicht aller TLScriptFunctions-Unterklassen ergab keine weitere Funktion mit ganzzahligem Rückgabetyp.
- AbstractSearchExpressionTest.evalWithoutErrors() wertet einen Ausdruck aus und schlägt fehl, wenn dabei ein Fehler protokolliert wurde; damit fallen Vertragsverletzungen auf, die das Ergebnis nicht verändern, sondern nur im Log landen.
Test: TestBinaryFunctions.testSize (tl-model-search).