## Flowletの関数・演算子

- 論理演算子
- 比較演算子
- 算術演算子
- 算術関数
- 三角関数
- 文字列演算子
- 文字列関数
- 日付関数
- パターンマッチング
- 条件式
- 型変換関数

## 論理演算子

ブール値(boolean)に対する演算子として、and、or、notが使えます。 SQLとは違い、nullというブール値はありません。

演算 | 結果
--- | ---
true and true | true
true and false | false
true or true | true
true or false | true
not true | false
not false | true

andの方がorよりも優先されます。例えば、true or false and falseの結果は、 trueになります。
true or (false and false) -> true or false -> true
となるためです。
()を使って、優先順位を変えることができます。
(true or false) and false -> true and false -> false

aaa or bbbの場合、aaaがtrueならbbbは評価されずに結果はtrueになります。
また、aaa and bbbの場合、aaaがfalseならbbbは評価されずに結果はfalseになります。

## 比較演算子

x 比較演算子 y の構文で使える以下の演算子があります。

演算子 | 説明
--- | ---
< | 小なり
lt | 小なり
> | 大なり
gt | 大なり
<= | 以下
le | 以下
>= | 以上
ge | 以上
= | 等しい
eq | 等しい
!= | 等しくない
ne | 等しくない
<> | 等しくない

< >をXMLに記述する場合は、&lt; &gt;のように記述します。
間違えやすいので、lt,gt,le,geの比較演算子を使った方がいいでしょう。

nullがある場合、以下のようになります。
<,>,<=,>=は、x,yどちらかにnullがあると結果はfalseになります。
=は、x,yどちらもnullあるいは、x,yどちらもnullではなくて等しい場合に、trueになります。
!=,<>は、x,yどちらもnullの場合はfalse、x,yどちらかがnullの場合は、trueになります。

#### BETWEEN

x between y and z は、以下の構文と同じ意味です。
x >= y and x <= z

#### NOT BETWEEN

x not between y and z は、以下の構文と同じ意味です。
x < y or x > z

#### IN

x in(y, z) は、以下の構文と同じ意味です。
x = y or x = z

#### NOT IN

x not in(y, z) は、以下の構文と同じ意味です。
x != y and x != z

#### nullの検証

値がnullかnullでないかを検証するには次の構文を使います。

    x is null
    x is not null

標準的なSQLとは異なり、次の構文も同じ意味になります。

    x = null
    x != null

#### Booleanの検証

to_boolean()でBooleanに変換した変数をtrueと比較するには、
Boolean変数 is trueを使います。
同様にfalseと比較するには、Boolean変数 is falseを使います。

## 算術演算子

Nazunaには、以下の算術演算子があります。

演算子 | 説明 | 例 | 結果
--- | --- | --- | ---
+ | 和 | 1 + 2 | 3
- | 差 | 1 - 2 | -1
* | 積 | 2 * 3 | 6
/ | 商 ※1 | 4 / 2 | 2
% | 余り | 5 / 2 | 1

※1 整数の割り算では、余りを切り捨て

## 算術関数

Flowletには、以下の算術関数があります。

関数 | 戻り値の型 | 説明 | 例 | 結果
--- | --- | --- | --- | ---
abs(Integer) | Integer | 絶対値 | abs(-1) | 1
abs(Long) | Long | 絶対値 | abs(-10000000000) | 10000000000
abs(BigDecimal) | BigDecimal | 絶対値 | abs(-1.0) | 1.0
ceil(BigDecimal) | BigDecimal | 引数より小さくない最小の整数 | ceil(-1.5) | -1.0
degrees(BigDecimal) | BigDecimal | 度に対応するラジアン | degrees(0.5) | 28.6478897565412
exp(BigDecimal) | BigDecimal | 指数 | exp(1.0) | 2.71828182845905
floor(BigDecimal) | BigDecimal | 引数より大きくない最大の整数 | floor(-42.8) | -43
ln(BigDecimal) | BigDecimal | 自然対数 | ln(2.0) | 0.693147180559945
pow(BigDecimal base, BigDecimal e) | BigDecimal | baseのe乗 | pow(9.0, 3.0) | 729
radians(BigDecimal) | BigDecimal | ラジアンに対応する度 | radians(45.0) | 0.785398163397448
random() | BigDecimal | 0.0 〜 1.0 の乱数 | random() |
round(BigDecimal) | Long | 四捨五入 | round(42.4) | 42
sign(Integer) | Integer | 引数の符号(-1, 0, 1) | sign(-3) | -1
sign(Long) | Integer | 引数の符号(-1, 0, 1) | sign(-30000000000) | -1
sign(BigDecimal) | Integer | 引数の符号(-1, 0, 1) | sign(-3.0) | -1
sqrt(BigDecimal) | BigDecimal | 平方根 | sqrt(2.0) | 1.4142135623731
trunc(BigDecimal) | BigDecimal | 切捨て | trunc(42.8) | 42

## 三角関数

Flowletには、以下の三角関数があります。

関数 | 戻り値の型 | 説明
--- | --- | ---
acos(BigDecimal) | BigDecimal | 逆余弦関数
asin(BigDecimal) | BigDecimal | 逆正弦関数
atan(BigDecimal) | BigDecimal | 逆正接関数
atan2(BigDecimal x, BigDecimal y) | BigDecimal | y/x の逆正接関数
cos(BigDecimal) | BigDecimal | 余弦関数
sin(BigDecimal) | BigDecimal | 正弦関数
tan(BigDecimal) | BigDecimal | 正接関数

## 文字列演算子

Flowletには、以下の文字列演算子があります。

演算子 | 戻り値の型 | 説明 | 例 | 結果
--- | --- | --- | --- | ---
String || String | String | 文字列の連結 | 'Hello ' || 'Nazuna' | 'Hello Nazuna'

## 文字列関数

Flowletには、以下の文字列関数があります。

関数 | 戻り値の型 | 説明 | 例 | 結果
--- | --- | --- | --- | ---
ascii(String) | Integer | 引数の第一文字のASCIIコード | ascii('x') | 120
btrim(String str[, String trim]) | String | trim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭と末尾から削除します。 | btrim('aabxyzbba', 'ab') | 'xyz'
chr(Integer) | String | ASCIIコードに対応する文字 | chr(120) | 'x'
length(String) | Integer | 文字数 | length('なずな') | 3
lower(String) | String | 文字列を小文字に変換 | lower('NAZUNA') | 'nazuna'
lpad(String str, Integer length[, String fill]) | String | fill(デフォルトはスペース)をstrの先頭に追加してlengthの長さにします。strがlengthの長さを越えている場合は(右側が)切り捨てられます。 | lpad('abc', 6, 'xy') | 'xyxabc'
ltrim(String str[, String trim]) | String | trim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭から削除します。 | ltrim('aabxyz', 'ab') | 'xyz'
position(String:str2 in String:str) | Integer | str中のstr2の位置(最初の文字は1)。 | position('cd' in 'abcde') | 3
repead(String str, Integer num) | String | strをnum回繰り返します。 | repead('Nz', 4) | 'NzNzNzNz'
rpad(String str, Integer length[, String fill]) | String | fill(デフォルトはスペース)をstrの末尾に追加してlengthの長さにします。strがlengthの長さを越えている場合は(右側が)切り捨てられます。 | rpad('abc', 6, 'xy') | 'abcxyx'
rtrim(String str[, String trim]) | String | trim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの末尾から削除します。 | rtrim('xyzaab', 'ab') | 'xyz'
strpos(String str, String str2) | Integer | str中のstr2の位置。positionと引数の順序が逆になります。 | strpos('abcde', 'cd') | 3
substr(String str, Integer pos[, Integer num]) | String | str中のpos番目(最初の文字は1)からnum文字を取り出します。numを指定しない場合は、最後の文字まで取り出します。 | substr('abcdef', 3, 2) | 'cd'
substring(String:str from Integer:pos [for Integer:num]) | String | substrと同じです。 | substr('abcdef' from 3 for 2) | 'cd'
trim([leading | trailing | both] [String:trim] from String:str) | String | trim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭、末尾、両側から削除します。 | trim(both 'ab' from 'aabxyzbba') | 'xyz'
upper(String) | String | 文字列を大文字に変換 | upper('nazuna') | 'NAZUNA'
translate(String str, String src, String dest) | String | str中のsrcで指定された文字列をdestで置き換えます。 | translate('abcdefgcd', 'cd', '12') | 'ab12efg12'

## 日付関数

Flowletには、以下の日付関数があります。

関数 | 戻り値の型 | 説明
--- | --- | ---
now() | Timestamp | 現在日時

## パターンマッチング

#### LIKE

Flowletでは、SQLのようにlikeを使ったパターンマッチングができます。

    String:str like String:pattern
    String:str not like String:pattern

patternは、文字列の集合です。 likeは、patternによって示される文字列の集合にstrが含まれていればtrueを返します。

patternがパーセント記号(%)もしくはアンダースコア(_)を含んでいない場合、 patternは文字列そのものです。
アンダースコア(_)は、任意の一文字とマッチし、 パーセント記号(%)は、0文字以上の任意の文字列とのマッチします。

    'xyz' like 'xyz' -> true
    'xyz' like 'abc' -> false
    'xyz' like 'x%'  -> true
    'xyz' like 'x_z' -> true
    'xyz' like '__z' -> true

#### 正規表現

Flowletでは、正規表現を使ったパターンマッチングもできます。

演算子 | 説明 | 例
--- | --- | ---
~ | 正規表現にマッチ、大文字小文字の区別あり | 'abcAde' ~ '[a-zA-Z]*'
~* | 正規表現にマッチ、大文字小文字の区別なし | 'abcAde' ~* '[a-z]*'
!~ | 正規表現にアンマッチ、大文字小文字の区別あり | 'abcAde' !~ '[a-zA-Z]*'
!~* | 正規表現にアンマッチ、大文字小文字の区別なし | 'abcAde' !~* '[a-z]*'

## 条件式

#### CASE

条件に応じた値を返したい場合、case式を使うことができます。

下記の形式のcase式は、Javaのif文に似ています。
最初のwhen句の式がtrueの場合、then句の値を返します。。
falseであれば、同じように後続のwhenが調べられます。
すべてのwhen句の式がfalseの場合、else句の値を返します。。
else句がない場合は、nullを返します。

    case when booleanを返す式 then 値
         [when booleanを返す式 then 値]
         [else 値]
    end

例(aは変数)

    case when a = 1 then 'one'
         when a = 2 then 'two'
         else 'other'
    end

下記の形式のcase式は、Javaのswitch文に似ています。
式と最初のwhen句の値が等しい場合、then句の値を返します。。
等しくない場合、同じように後続のwhenが調べられます。
すべてのwhen句の式がfalseの場合、else句の値を返します。
else句がない場合は、nullを返します。

    case 式
         when 値 then 値
         [when 値 then 値]
         [else 値]
    end

上記のcase式は、下記のcase式の簡略形です。

    case when 式 = 値 then 値
         [when 式 = 値 then 値]
         [else 値]
    end

#### COALESCE

coalesceは、nullでない最初の引数を返します。

    coalesce(value[, ...])

#### NULLIF

nullifは、value1とvalue2が等しい場合にnullを返します。 それ以外は、value1を返します。

    nullif(value1, value2)

## 型変換関数

Flowletには、以下の型変換関数があります。

関数 | 戻り値の型 | 説明
--- | --- | ---
to_string(Integer num, String pattern) | String | numをDecimalFormatのpatternでフォーマットします。
to_string(Long num, String pattern) | String | numをDecimalFormatのpatternでフォーマットします。
to_string(BigDecimal num, String pattern) | String | numをDecimalFormatのpatternでフォーマットします。
to_string(Timestamp ts, String pattern) | String | tsをSimpleDateFormatのpatternでフォーマットします。
to_integer(String str) | Integer | strをIntegerに変換します。
to_integer(Timestamp ts, String pattern) | Integer | tsをSimpleDateFormatのpatternでフォーマットしてIntegerに変換します。
to_integer(Long num) | Integer | numをIntegerに変換します。
to_integer(BigDecimal num) | Integer | numをIntegerに変換します。
to_long(String str) | Long | strをLongに変換します。
to_long(Timestamp ts, String pattern) | Long | tsをSimpleDateFormatのpatternでフォーマットしてLongに変換します。
to_long(Integer num) | Long | numをLongに変換します。
to_long(BigDecimal num) | Long | numをLongに変換します。
to_bigdecimal(String str) | BigDecimal | strをBigDecimalに変換します。
to_bigdecimal(Timestamp ts, String pattern) | BigDecimal | tsをSimpleDateFormatのpatternでフォーマットしてBigDecimalに変換します。
to_bigdecimal(Long num) | BigDecimal | numをBigDecimalに変換します。
to_bigdecimal(BigDecimal num) | BigDecimal | numをBigDecimalに変換します。
to_double(String str) | Double | strをDoubleに変換します。
to_double(Timestamp ts, String pattern) | Double | tsをSimpleDateFormatのpatternでフォーマットしてDoubleに変換します。
to_double(Long num) | Double | numをDoubleに変換します。
to_double(Integer num) | Double | numをDoubleに変換します。
to_double(BigDecimal num) | Double | numをDoubleに変換します。
to_boolean(boolean bool) | java.lang.Boolean | booleanをjava.lang.Booleanに変換します。