blob: 2e72b321b73779c4178117e055d25b10bc9b164a [file] [log] [blame] [view]
## Function
User-defined functions (UDF) enable users to create user code written in JSR-232 compliant scripting
languages that can be evaluated in CQL queries. [SchemaBuilder] offers API methods for creating
and dropping UDFs.
### Creating a Function (CREATE FUNCTION)
To start a `CREATE FUNCTION` query, use `createFunction` in [SchemaBuilder]:
```java
import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.*;
CreateFunctionStart create = createFunction("log");
```
Like all other `CREATE` queries, one may supply `ifNotExists()` to require that the UDF should only
be created if it doesn't already exist, i.e.:
```java
CreateFunctionStart create = createFunction("cycling", "log").ifNotExists();
```
You may also specify that you would like to replace an existing function by the same signature if it
exists. In this case, use `orReplace`:
```java
CreateFunctionStart create = createFunction("cycling", "log").orReplace();
```
One may also specify the parameters of a function using `withParameter`:
```
createFunction("cycling", "left")
.withParameter("colName", DataTypes.TEXT)
.withParameter("num", DataTypes.DOUBLE)
```
There are a number of steps that must be executed to complete a function:
* Specify whether the function is called on null input (`calledOnNull`) or if it should simply
return null (`returnsNullOnNull`).
* Specify the return type of the function using `returnsType`
* Specify language of the function body using `withJavaLanguage`, `withJavaScriptLanguage`, or
`withLanguage`
* Specify the function body with `as` or `asQuoted`
For example, the following defines a complete `CREATE FUNCTION` statement:
```java
createFunction("cycling", "log")
.withParameter("input", DataTypes.DOUBLE)
.calledOnNull()
.returnsType(DataTypes.DOUBLE)
.withJavaLanguage()
.asQuoted("return Double.valueOf(Math.log(input.doubleValue()));");
// CREATE FUNCTION cycling.log (columnname text,num int) CALLED ON NULL INPUT RETURNS double LANGUAGE java
// AS 'return Double.valueOf(Math.log(input.doubleValue()));'
```
Note that when providing a function body, the `as` method does not implicitly quote your function
body. If you would like to have the API handle this for you, use `asQuoted`. This will surround
your function body in single quotes if the body itself does not contain a single quote, otherwise it
will surround your function body in two dollar signs (`$$`) mimicking a postgres-style string
literal, i.e.:
```java
createFunction("sayhi")
.withParameter("input", DataTypes.TEXT)
.returnsNullOnNull()
.returnsType(DataTypes.TEXT)
.withJavaScriptLanguage()
.asQuoted("'hi ' + input;");
// CREATE FUNCTION sayhi (input text) RETURNS NULL ON NULL INPUT RETURNS text LANGUAGE javascript AS $$ 'hi ' + input; $$
```
### Dropping a Function (DROP FUNCTION)
To create a `DROP FUNCTION` query, use `dropFunction`:
```java
dropFunction("cycling", "log");
// DROP FUNCTION cycling.log
```
You may also specify `ifExists`:
```java
dropFunction("log").ifExists();
// DROP FUNCTION IF EXISTS log
```
[SchemaBuilder]: https://docs.datastax.com/en/drivers/java/4.3/com/datastax/oss/driver/api/querybuilder/SchemaBuilder.html