Since Groovy 4 we can parse TOML configuration data into a Map
. Once the TOML data is transformed into the Map
we can use all possibilities in Groovy to lookup keys and their values in maps. For example we can use GPath expressions to easily get the value of a (nested) key. To parse TOML configuration data we must use the TomlSlurper
class that is in the groovy.toml
package. We can use the parse
method when we have a file, reader or stream with our configuration. To parse a String
value with TOML configuration we use the parseText
method.
Continue reading →
Unfortunately Oracle databases aren’t compatible with the new Apple Silicon CPU architecture.
Due to this fact you’re not able to run an Oracle XE image with TestContainers on your brand-new MacBook, but there’s a workaround!
-
Install colima
-
Run colima start --arch x86_64 --memory 4
-
Set TestContainers env vars
export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
export DOCKER_HOST="unix://${HOME}/.colima/docker.sock"
-
Run your tests based on Gerald Venzl's Oracle XE image
Continue reading →
Unfortunately Oracle databases aren’t compatible with the new Apple Silicon CPU architecture.
Due to this fact you’re not able to run an Oracle XE database on your brand-new MacBook, but there’s a workaround!
Continue reading →
GINQ (Groovy-INtegrated Query) is added since Groovy 4.
With GINQ we can query in-memory collections with SQL like statements.
If we want to get the row numbers for each row in the query result set we can use the implicit variable _rn
.
We must specify _rn
in the select
expression of our GINQ query. We can even use as
to give it a meaningful name in the result set.
Continue reading →
Groovy supports more classifiers for a switch
case
statement than Java. Since Groovy 4 we can use switch
also as an expression. This means the switch
statement returns a value without having to use return
. Instead of using a colon (:
) and break
we use the →
notation for a case
. We specify the value that the switch
expressions returns after →
. When we need a code block we simply put the code between curly braces ({…}
).
Continue reading →
The dw::core::Strings
has a lot of functions to deal with strings. One of the functions is ordinalize
that takes a number as argument and returns the ordinal value as string.
Continue reading →
To check if a value is of a certain type in DataWeave we must use the is
operator. We must specify the type after the is
operator and the value before the is
operator. For example to check if the value 42
is a Number
we write 42 is Number
. The result is a Boolean
that is either true
or false
. In the previous example the result is true
.
Continue reading →
To calculate the modulo of two numbers in DataWeave we can use the mod
function from the dw::Core
module. We provide two arguments where the first argument is the number that needs to be divided by the number provided as second argument. The number that remains after a division of the input arguments is returned as a result.
Continue reading →
In a previous blog post we learned about the zip
function. DataWeave also gives us the unzip
function that will do the opposite for an array with arrays. The input argument of the unzip
function is an array where the elements are also arrays. This could be created by the zip
function or just defined as data structure directly. The unzip
function will take from each array the same index element and return it as an array with the index elements. For example with the input array [[1, "A"], [2, "B"]]
will be unzipped to [[1, 2], ["A", "B"]]
. When the number of elements in the arrays that need to unzipped are not equal, the unzip
function will only return the elements from the index with the most elements.
Continue reading →
DataWeave has a zip
function in the dw::Core
module. The function will merge two arrays into a new array. Each element in the new array is also an array and will have a value from the two original arrays from the same index grouped together. So for example we have an input array ["A", "B"]
and another input array [1, 2]
. The result of the zip
function will be [["A", 1], ["B", 2]]
. The size of the resulting array is the same as the minimal size of both input arrays. Any value from an array that cannot be merged is simply ignored and left out of the resulting array.
Continue reading →