Elegant way for String interpolation

Hello,
I’m wondering if there is any elegant way in the Snaplogic Expression Language to achieve String interpolation? E.g. similar to f-strings in Python?

f"This is a test string including a {variable}"

The method I’m using at the moment is string concatenation, e.g.:

"SELECT " + [lib.env.salesforceGPDeliveryNumberField,lib.env.salesforceGPOperationsNumberField,"Id"].toString() + " FROM Opportunity WHERE " + lib.env.salesforceOpportunityIdField + " = '" +  _opportunityId + "'"

This becomes fairly tedious with longer queries and prone to overlooking the one or other space or quote.
Concat might be a bit better than that, but still is somewhat tedious in comparison to string interpolation.
Is there a feature that I’ve overlooked or is there just no user-friendly method available?

Best regards
Thomas

1 Like

Hey @Henchway,

Try adding a mapper in front of the SQL Execute, and map all of the configuration fields in there. Than you can simply use those fields in the query itself without using expressions. So you can understand me better, here’s your query transformed in the way I’m suggesting:

SELECT $salesforceGPDeliveryNumberField,$salesforceGPOperationsNumberField,Id FROM Opportunity WHERE $salesforceOpportunityIdField = $opportunityId

Regards,
Bojan

1 Like

Hi @Henchway,

You can also use the built-in function .sprintf().
For example, you could use the following expression:

"SELECT %s,%s,Id FROM Opportunity WHERE %s =\'%s\'".sprintf("one", "two", "someId", "123")

Which translates to:

SELECT one,two,Id FROM Opportunity WHERE someId ='123'
4 Likes

Thank you both, I’ll give both solutions a try once i’m back in the office.

Could you elaborate this one a bit?
When i specify this in a mapper beforehand, i could only do it in a non-expression field, therefore plaintext only. I’m putting this in a variable ‘query’, of course then it’s solely text.

When using this in a REST GET snap , it won’t evaluate the lib piece, but simply fail with http 400. I suppose the difference here could be that you’re strictly referring to a SQL Snap, but i’m sending the SQL statement via REST to Salesforce.

When activating the expression evaluation in the mapper, it fails as it won’t recognize e.g. ‘SELECT’ as a proper command.

Best regards
Thomas

It seems like you need to encapsulate the static portions of your expression in quotation marks, and then concatenate your lib expression by turning on the equal sign toggle button to the left of your expression. Anything that needs to be evaluated should not be surrounded by quotation marks. In the end, your element called, $query, should contain a valid SQL statement. It should look something like this.

That defeats the purpose of my question. I wanted to find an elegant way of doing that, string concatenation isn’t really what i’m looking for.

Would using eval() work for you? There’s still some concatenation involved, but I’m not really sure how you could get away from it entirely.

I think that @j.angelevski has a great solution for you with using the sprintf() String method.

Alternatively, if you are querying from a database using an Execute snap (e.g. SQL Server - Execute), you can use variable names without enabling the expression evaluation in the SQL Statement expression box. For example, here is my input document to a SQL Server Execute snap:
image
And the SQL Server Execute settings:
image
Produce this result:
image

Note that the database snaps are some of the only snaps that do this (to my knowledge).