Skip to content

Commit

Permalink
Merge pull request #5749 from heshanpadmasiri/feat/raw-template
Browse files Browse the repository at this point in the history
Update raw-template BBE to remove external dependency
  • Loading branch information
MaryamZi authored Oct 30, 2024
2 parents adff5b6 + 26e37b0 commit 4354864
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 43 deletions.
2 changes: 0 additions & 2 deletions examples/raw-templates/Ballerina.toml

This file was deleted.

47 changes: 22 additions & 25 deletions examples/raw-templates/raw_templates.bal
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
import ballerina/io;
import ballerinax/java.jdbc;
import ballerina/sql;

jdbc:Client dbClient = check new (url = "jdbc:h2:file:./master/orderdb",
user = "test", password = "test");
function col3() returns boolean {
return false;
}

public function main() returns error? {
// Uses a raw template to create the `Orders` table.
_ = check dbClient->execute(`CREATE TABLE IF NOT EXISTS Orders
(orderId INTEGER NOT NULL, customerId INTEGER, noOfItems INTEGER,
PRIMARY KEY (orderId))`);
// Uses a raw template to insert values to the `Orders` table.
_ = check dbClient->execute(`INSERT INTO Orders (orderId, customerId, noOfItems)
VALUES (1, 1, 20)`);
_ = check dbClient->execute(`INSERT INTO Orders (orderId, customerId, noOfItems)
VALUES (2, 1, 15)`);
type MyCSVRawTemplate object {
*object:RawTemplate;
public (string[] & readonly) strings;
public [int, int, boolean] insertions;
};

stream<record {| anydata...; |}, sql:Error?> strm = getOrders(1);
record {|record {} value;|}|sql:Error? v = strm.next();
while (v is record {|record {} value;|}) {
record {} value = v.value;
io:println(value);
v = strm.next();
}
}
public function main() {
int col1 = 5;
int col2 = 10;

// Any value is allowed as an interpolation when defining a value of the `object:RawTemplate` type
// since it has `(any|error)[]` as the `insertions` type.
object:RawTemplate rawTemplate = `${col1}, fixed_string1, ${col2}, ${col3()}, fixed_string3`;
io:println(rawTemplate.strings);
io:println(rawTemplate.insertions);

function getOrders(int customerId) returns stream<record {| anydata...; |}, sql:Error?> {
// In this raw template, the `customerId` variable is interpolated in the literal.
return dbClient->query(`SELECT * FROM orders WHERE customerId = ${customerId}`);
// With the custom `MyCSVRawTemplate ` raw template type, the compiler
// expects two integers followed by a boolean value as interpolations.
MyCSVRawTemplate myCSVRawTemplate = `fixed_string4, ${col1}, ${col2}, fixed_string_5, ${col3()}`;
io:println(myCSVRawTemplate.strings);
io:println(myCSVRawTemplate.insertions);
}
22 changes: 8 additions & 14 deletions examples/raw-templates/raw_templates.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
# Raw templates

A raw template is a backtick template without a tag. Exposes result of phase 1 without further processing. Raw template is evaluated by evaluating each expression and creating an object containing.
Raw template expressions are backtick templates without a tag (such as `string` or `xml`). This is a sequence of characters interleaved with interpolations within a pair of backticks (in the form `${expression}`). The result of evaluating such a raw template is an `object:RawTemplate` object that has two fields `(readonly & string[]) strings` and `(any|error)[] insertions`. The `strings` array will have string literals in the backtick string broken at interpolations and the `insertions` array will have the resultant values of evaluating each interpolation.

- an `array` of the `strings` separated by insertions
- an `array` of the results of expression evaluation and an `array` of `strings` separating
If you want to control the type of the strings or the interpolations more precisely, you can define an object type that includes the `object:RawTemplate` type and override the relevant field(s) with narrower types. Then, the compiler will statically validate the values against the expected type(s).

>**Important use case:** SQL parameters.
>**Note:** The relevant database driver JAR should be defined in the `Ballerina.toml` file as a dependency. This sample is based on an H2 database and the H2 database driver JAR need to be added to `Ballerina.toml` file. This sample is written using H2 2.1.210 and it is recommended to use H2 JAR with versions higher than 2.1.210.
For a sample configuration and more information on the underlying module, see the [`jdbc` module](https://lib.ballerina.io/ballerinax/java.jdbc/latest/).
An important use case of custom raw templates is SQL parameterized queries.

::: code raw_templates.bal :::

Add the relevant database driver JAR details to the `Ballerina.toml` file.

::: code Ballerina.toml :::

Build and run the project using the `bal run` command.
::: out raw_templates.out :::

::: out raw_templates.out :::
## Related links
- [Backtick templates](https://ballerina.io/learn/by-example/backtick-templates/)
- [Object type inclusion](https://ballerina.io/learn/by-example/object-type-inclusion/)
- [Database Access - Simple query](https://ballerina.io/learn/by-example/mysql-query-operation/)
6 changes: 4 additions & 2 deletions examples/raw-templates/raw_templates.out
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
$ bal run
{"ORDERID":1,"CUSTOMERID":1,"NOOFITEMS":20}
{"ORDERID":2,"CUSTOMERID":1,"NOOFITEMS":15}
["",", fixed_string1, ",", ",", fixed_string3"]
[5,10,false]
["fixed_string4, ",", ",", fixed_string_5, ",""]
[5,10,false]

0 comments on commit 4354864

Please sign in to comment.