FreeMarker: Hash Containers

Hallo synesty Team

Im FreeMarker Manual wird folgende Aussage gemacht:
Note that hash concatenation is not to be used for many repeated concatenations,
like for adding items to a hash inside a loop.
While adding together hashes is fast and is constant time (independent of the size of the hashes added),
the resulting hash is a bit slower to read than the hashes added together.
Thus after tens or hundreds of additions the result can be impractically slow to read.

Frage an Euch:
Gibt es in synesty eine effizienter Möglichkeit, um in einem Loop ein Hash Container um Keys und Values zu erweitern ?
Z.B. wie in Java HashMap Class:
put(K key, V value) Associates the specified value with the specified key in this map.

Gruss, Rolf Dätwyler

An welcher Stelle (in welchem Step) brauchen Sie denn diese Map? Können Sie mal den Usecase beschreiben?

Wir prüfen dann mal, was man machen kann.

Hallo synesty Team

Mit einem TextHTMLWriter bereite ich ein Fixed-length Textfile für eine Host Applikation auf.
Den Hash Container setze ich ein, um Artikle Info zu sammeln und am Ende vom Textfile auszugeben.
Die Frage ist nun, kann man die hash concatenation unten effizienter schreiben ?
<#assign TMP_articleHash = TMP_articleHash + {"x", "y"}

<#assign TMP_articleHash = { } >
<#list spreadsheet@SpreadsheetMapper_2.getRows() as row>
.......
<#assign TMP_articleHash = TMP_articleHash + { row.get("purchaseOrderItems_articleNumber"), row.get("purchaseOrderItems_articleTitle") } >
.......
</#list>

<#list TMP_articleHash as key, value>
.......
${
key[0..*15]?right_pad(15) +
value[0..*35]?right_pad(35)
}
.......
</#list>

Gruss, Rolf Dätwyler

Wäre ein KeyValueSpreadsheet (unter der Haube eine Java Map) hilfreich? Dieses würde man mit dem spreadsheet@SpreadsheetMapper_2 befüllen (mit den Spalten purchaseOrderItems_articleNumber und purchaseOrderItems_articleTitle), was genau der ersten <#list> Schleife entsprechen sollte. Ist aber wesentlich effizienter.


Da der Output des KeyValueSpreadsheets auch ein Spreadsheet ist, könnte man die 2. <#list> Schleife dann fast wie die erste bauen, nur eben über das Output-Spreadsheet von KeyValueSpreadsheet.


Allerdings wird aus dem Code-Schnippsel nicht ganz klar, warum die Werte erst in die Map gepackt werden, nur um dann wieder drüber zu listen. Man könnte das ja auch theoretisch gleich in der ersten Schleife machen.


#list spreadsheet@SpreadsheetMapper_2.getRows() as row> 
.......

${row.get("purchaseOrderItems_articleNumber")![0..*15]?right_pad(15)} ${row.get("purchaseOrderItems_articleTitle")![0..*35]?right_pad(35)}
.......
</#list>



Aber vielleicht fehlt hier etwas Kontext.



Das Benutzen von einem KeyValueSpreadsheet ist ein netter Lögungsansatz.
Mit dem Einsatz vom Hash Container innerhalb vom Freemarker Code bin ich aber viel flexibler.
Darum werde ich nicht auf ein KeyValueSpreadsheet umsteigen.

Falls es keine andere Lösung für die hash concatenation gibt, dann werde ich den Ansatz unten so belassen.
<#assign TMP_articleHash = TMP_articleHash + {"x", "y"}

Gruss, Rolf