Forum Discussion

Henchway's avatar
Henchway
Contributor
4 years ago

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

8 Replies

  • 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'
    
  • bojanvelevski's avatar
    bojanvelevski
    Valued Contributor

    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

    • Henchway's avatar
      Henchway
      Contributor

      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

      • alex_panganiban's avatar
        alex_panganiban
        Contributor

        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.

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

  • 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:

    And the SQL Server Execute settings:

    Produce this result:

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