ストリームデータ処理基盤

uCosminexus Stream Data Platform - Application Framework アプリケーション開発ガイド

手引・文法書

3020-3-V03-20

目　　次

前書き

変更内容

はじめに

第1編　お読みいただく前に

1.　Stream Data Platform - AFでのアプリケーション開発の概要

1.1　導入から運用までの流れ

1.2　このマニュアルの構成

1.3　アプリケーション開発の概要

1.3.1　クエリの定義でできること

1.3.2　カスタムアダプターの作成でできること

第2編　CQLプログラミング

2.　CQLによるクエリの定義

2.1　CQLの体系

2.2　ウィンドウ演算による入力リレーションの生成

2.2.1　ウィンドウ演算の種類

2.2.2　ウィンドウ演算の例

2.3　関係演算によるデータの抽出

2.3.1　関係演算の種類

2.3.2　結合処理の例

2.3.3　集合関数による演算処理の例

2.3.4　結合処理とROWSウィンドウを併用する場合の注意事項

2.4　ストリーム化演算による出力ストリームデータへの変換

2.4.1　ストリーム化演算の種類

2.4.2　ストリーム化演算の例

2.5　時刻解像度の指定によるメモリ使用量増加の抑止

2.6　定義例

2.6.1　基本的なクエリの定義例

2.6.2　時刻解像度を指定した定義例

3.　CQLの基本項目とデータ型

3.1　CQLによるクエリ定義

3.1.1　CQLの記述形式

3.1.2　CQLで使用できる文字

3.1.3　CQL文法説明で使用する記号

3.2　CQLの基本項目の指定方法

3.2.1　キーワードの指定

3.2.2　数値の指定

3.2.3　区切り文字の挿入

3.2.4　名前の指定

3.2.5　名前の修飾

3.2.6　定数の指定

3.3　CQLのデータ型

3.3.1　CQLのデータ型とJavaのデータ型のマッピング

3.3.2　DECIMAL型およびNUMERIC型についての注意事項

3.4　データの比較

3.4.1　比較できるデータ型の組み合わせ

3.4.2　データを比較する際の留意点

3.5　クエリ定義での注意事項および制限値

3.5.1　クエリ定義での注意事項

3.5.2　クエリ定義での制限値

4.　CQLリファレンス

4.1　CQL文法説明で使用する記述形式

4.2　CQLの一覧

4.3　定義系CQL

4.3.1　REGISTER STREAM句（ストリームの定義）

4.3.2　REGISTER QUERY句（クエリの定義）

4.3.3　REGISTER QUERY_ATTRIBUTE句（時刻解像度の指定）

4.4　操作系CQL

4.4.1　問い合わせ

4.4.2　ストリーム句

4.4.3　リレーション式

4.4.4　SELECT句

4.4.5　FROM句

4.4.6　WHERE句

4.4.7　GROUP BY句

4.4.8　HAVING句

4.4.9　UNION句

4.4.10　選択リスト

4.4.11　選択式

4.4.12　列指定リスト

4.4.13　リレーション参照

4.4.14　ウィンドウ指定

4.4.15　時間指定

4.4.16　探索条件

4.4.17　比較述語

4.4.18　値式

4.4.19　定数

4.4.20　集合関数

4.4.21　組み込み集合関数

4.4.22　スカラ関数

4.4.23　組み込みスカラ関数

4.4.24　ストリーム間演算関数

4.4.25　外部定義ストリーム間演算関数

5.　CQLで指定する組み込み関数

5.1　組み込み関数の一覧

5.2　統計関数の詳細

統計関数

CORREL関数

COVAR関数

COVAR_POP関数

STDDEV関数

STDDEV_POP関数

VAR関数

VAR_POP関数

5.3　数学関数の詳細

数学関数

ABS関数

ACOS関数

ASIN関数

ATAN関数

ATAN2関数

CEIL関数

COS関数

COSH関数

DISTANCE関数

DISTANCE3関数

EXP関数

FLOOR関数

LN関数

LOG関数

MOD関数

NAN関数

NEGATIVE_INFINITY関数

PI関数

POSITIVE_INFINITY関数

POWER関数

ROUND関数

SIN関数

SINH関数

SQRT関数

TAN関数

TANH関数

TODEGREES関数

TORADIANS関数

5.4　文字列関数の詳細

文字列関数

CONCAT関数

LENGTH関数

LEQ関数

LGE関数

LGT関数

LLE関数

LLT関数

REGEXP_FIRSTSEARCH関数

REGEXP_REPLACE関数

REGEXP_SEARCH関数

SPLENGTH関数

5.5　時刻関数の詳細

時刻関数

TIMEDIFF関数

TIMESTAMPDIFF関数

5.6　変換関数の詳細

変換関数

BIGINT_TOSTRING関数

DECIMAL_TOSTRING関数

DOUBLE_TOSTRING関数

INT_TOSTRING関数

NUMBER_TODATE関数

NUMBER_TOTIME関数

REAL_TOSTRING関数

TIME_TONUMBER関数

TIMESTAMP_TONUMBER関数

6.　クエリ定義のサンプル

6.1　クエリ定義のサンプルの種類

第3編　カスタムアダプター作成

7.　カスタムアダプターの作成

7.1　作成するカスタムアダプターの種類

7.1.1　データ送信APとデータ受信AP

7.1.2　データの送受信方法による分類（RMI連携カスタムアダプターとインプロセス連携カスタムアダプター）

7.2　RMI連携カスタムアダプターの作成

7.2.1　ストリームデータの送信（RMI連携カスタムアダプター）

7.2.2　クエリ結果データの受信（RMI連携カスタムアダプター）

7.3　インプロセス連携カスタムアダプターの作成

7.3.1　ストリームデータの送信（インプロセス連携カスタムアダプター）

7.3.2　クエリ結果データの受信（インプロセス連携カスタムアダプター）

7.3.3　注意事項

7.4　カスタムアダプターで実装する処理

7.4.1　データ受信APの終了契機の把握（データ処理終了の通知）

7.4.2　データソースモードでの時刻情報の設定

7.4.3　キューあふれの事前防止

7.5　コンパイル手順

7.6　カスタムアダプター作成時の留意事項

8.　データ送受信用API

8.1　データ送受信用APIの記述形式

8.2　データ送受信用APIの一覧

8.3　SDPConnectorインタフェース（共通API）

close()メソッド

isClosed()メソッド

openStreamInput(String group_name,String stream_name)メソッド

openStreamOutput(String group_name,String stream_name)メソッド

8.4　SDPConnectorFactoryクラス（RMI連携用）

connect()メソッド

8.5　StreamEventListenerインタフェース（インプロセス連携用）

onEvent(StreamTuple tuple)メソッド

8.6　StreamInprocessUPインタフェース（インプロセス連携用）

execute(SDPConnector con)メソッド

stop()メソッド

8.7　StreamInputインタフェース（共通API）

close()メソッド

getFreeQueueSize()メソッド

getMaxQueueSize()メソッド

isStarted()メソッド

put(ArrayList<StreamTuple> tuple_list)メソッド

put(StreamTuple tuple)メソッド

putEnd()メソッド

8.8　StreamOutputインタフェース（共通API）

close()メソッド

get()メソッド

get(int count)メソッド

get(int count, long timeout)メソッド

getAll()メソッド

getAll(long timeout)メソッド

getFreeQueueSize()メソッド

getMaxQueueSize()メソッド

registerForNotification(StreamEventListener n)メソッド

unregisterForNotification(StreamEventListener n)メソッド

8.9　StreamTimeクラス（共通API）

equals(StreamTime when)メソッド

getTimeMillis()メソッド

hashCode()メソッド

toString()メソッド

8.10　StreamTupleクラス（共通API）

StreamTuple(Object[] dataArray)コンストラクター

equals(Object obj)メソッド

getDataArray()メソッド

getSystemTime()メソッド

hashCode()メソッド

toString()メソッド

8.11　例外クラス（共通API）

SDPClientExceptionクラス（共通API）

SDPClientFreeInputQueueSizeThresholdOverExceptionクラス（共通API）

SDPClientFreeInputQueueSizeLackExceptionクラス（共通API）

9.　データ送受信用APIを使用したサンプルプログラム

9.1　サンプルプログラムの構成

9.2　RMI連携カスタムアダプターのサンプルプログラム

9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順

9.2.2　クエリグループの定義内容（RMI連携カスタムアダプター）

9.2.3　RMI連携データ送信APの内容

9.2.4　RMI連携データ受信APの内容

9.3　インプロセス連携カスタムアダプターのサンプルプログラム

9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順

9.3.2　クエリグループの定義内容（インプロセス連携カスタムアダプター）

9.3.3　インプロセス連携送受信制御APの内容

9.3.4　インプロセス連携データ送信APの内容

9.3.5　インプロセス連携データ受信APの内容（ポーリング方式）

第4編　外部定義関数作成

10.　外部定義関数の作成

10.1　外部定義関数の概要

10.2　外部定義関数の実装

10.2.1　外部定義関数のクラスの実装

10.2.2　外部定義関数のメソッドの実装

10.2.3　外部定義関数の変更

10.3　外部定義関数の作成例

11.　外部定義関数インタフェース

11.1　外部定義関数インタフェースの記述形式

11.2　外部定義関数インタフェースの一覧

11.3　SDPExternalStreamFunctionインタフェース

executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp)メソッド

initialize()メソッド

terminate()メソッド

付録

付録A　各バージョンの変更内容

付録B　このマニュアルの参考情報

付録B.1　関連マニュアル

付録B.2　このマニュアルでの表記

付録B.3　英略語

付録B.4　KB（キロバイト）などの単位表記について

索引

[他社商品名称に関する表示]

All Rights Reserved. Copyright (C) 2010, 2014, Hitachi, Ltd.

前書き

■ 対象製品

●適用OS：Windows Server 2008 R2 Standard，Windows Server 2008 R2 Enterprise，Windows Server 2008 R2 Datacenter

P-2964-9B14　 uCosminexus Stream Data Platform - Application Framework　 01-05※

●適用OS：Red Hat Enterprise Linux 5，Red Hat Enterprise Linux 6

P-9W64-9B11　 uCosminexus Stream Data Platform - Application Framework　 01-05

●適用OS：Red Hat Enterprise Linux 6

P-9W64-9V11　 uCosminexus Stream Data Platform - Application Framework　 01-50

注※　この製品については，サポート時期をご確認ください。
これらのプログラムプロダクトのほかにもこのマニュアルをご利用になれる場合があります。詳細は「リリースノート」でご確認ください。

■ 輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。
なお、不明な場合は、弊社担当営業にお問い合わせください。

■ 商標類

BSAFEは，EMC Corporationの米国およびその他の国における登録商標または商標です。
Microsoftは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
Linuxは，Linus Torvalds氏の日本およびその他の国における登録商標または商標です。
OracleとJavaは，Oracle Corporation 及びその子会社，関連会社の米国及びその他の国における登録商標です。
Red Hatは，米国およびその他の国でRed Hat, Inc. の登録商標もしくは商標です。
RSAは，EMC Corporationの米国およびその他の国における登録商標または商標です。
Windowsは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
Windows Serverは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
その他記載の会社名，製品名は，それぞれの会社の商標もしくは登録商標です。
Portions of this software were developed at the National Center for Supercomputing Applications (NCSA) at the University of Illinois at Urbana-Champaign.
Regular expression support is provided by the PCRE library package, which is open source software, written by Philip Hazel, and copyright by the University of Cambridge, England. The original software is available from ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
This product includes software developed by Andy Clark.
This product includes software developed by Ben Laurie for use in the Apache-SSL HTTP server project.
This product includes software developed by Daisuke Okajima and Kohsuke Kawaguchi (http://relaxngcc.sf.net/).
This product includes software developed by IAIK of Graz University of Technology.
This product includes software developed by Ralf S. Engelschall <rse@engelschall.com> for use in the mod_ssl project (http://www.modssl.org/).
This product includes software developed by the Apache Software Foundation (http://www.apache.org/).
This product includes software developed by the Java Apache Project for use in the Apache JServ servlet engine project (http://java.apache.org/).
This product includes software developed by the University of California, Berkeley and its contributors.
This software contains code derived from the RSA Data Security Inc. MD5 Message-Digest Algorithm, including various modifications by Spyglass Inc., Carnegie Mellon University, and Bell Communications Research, Inc (Bellcore).
uCosminexus Stream Data Platform - Application Frameworkは，米国EMC コーポレーションのRSA BSAFE(R)ソフトウェアを搭載しています。

■ マイクロソフト製品の表記について

このマニュアルでは，マイクロソフト製品の名称を次のように表記しています。

表記 | 製品名
Windows Server 2008またはWindows | Windows Server 2008 R2 Standard | Microsoft(R) Windows Server(R) 2008 R2 Standard x64
Windows Server 2008 R2 Enterprise | Microsoft(R) Windows Server(R) 2008 R2 Enterprise x64
Windows Server 2008 R2 Datacenter | Microsoft(R) Windows Server(R) 2008 R2 Datacenter x64

■ 発行

2014年 6月　3020-3-V03-20

■ 著作権

All Rights Reserved. Copyright (C) 2010, 2014, Hitachi, Ltd.

変更内容

変更内容(3020-3-V03-20)　uCosminexus Stream Data Platform - Application Framework　01-50

追加・変更内容 | 変更個所
バージョンの変更に伴い，01-50に対応した記述を追加した。 | -

単なる誤字・脱字などはお断りなく訂正しました。

はじめに

このマニュアルは，uCosminexus Stream Data Platform - Application Frameworkでデータを分析するために使用する，CQLの記述方法，およびカスタムアダプターの作成方法について説明したものです。

分析目的に合わせてCQLを記述できるようになること，およびAPIでカスタムアダプターを作成できるようになることを目的としています。

＜はじめにの構成＞

対象読者

適用OSの違いによる機能相違点の表記

図中で使用する記号

対象読者

CQLによるクエリの定義，およびアダプターとして使用するアプリケーションプログラムを作成するプログラマーの方を対象としています。

次の知識をお持ちの方を前提としています。

OSの基礎的な知識

Javaによるプログラミングの知識

なお，このマニュアルは，マニュアル「uCosminexus Stream Data Platform - Application Framework 解説」を前提としていますので，あらかじめお読みいただくことをお勧めします。

適用OSの違いによる機能相違点の表記

このマニュアルで説明する機能は，適用OSの種類（WindowsまたはLinux）によって，異なる場合があります。OSによって機能差がある場合，OS名を明記しています。

なお，Windowsのパスの区切り文字として使用している「¥」は，Linuxの場合には，特に断りのないかぎり，「/」に読み替えてください。

図中で使用する記号

このマニュアルの図中で使用する記号を次のように定義します。

1.　Stream Data Platform - AFでのアプリケーション開発の概要

この章では，このマニュアルを読み進める前に知っておいていただきたい内容として，Stream Data Platform - AFの導入から運用までの流れ，このマニュアルの構成，およびStream Data Platform - AFでのアプリケーション開発の概要について説明します。

＜この章の構成＞

1.1　導入から運用までの流れ

1.2　このマニュアルの構成

1.3　アプリケーション開発の概要

1.1　導入から運用までの流れ

Stream Data Platform - AFの導入から運用までの流れと関連マニュアルとの関係を，次の図に示します。

図1-1　導入から運用までの流れと関連マニュアルとの関係

このマニュアルでは，「システムの構築」作業のうち，「CQLによるクエリの定義」，「カスタムアダプターの作成」および「外部定義関数の作成」について説明します。

なお，このマニュアルを読む前に，マニュアル「uCosminexus Stream Data Platform - Application Framework 解説」を参照して，Stream Data Platform - AFの製品概要を理解しておいてください。

また，必要に応じて，各作業フェーズで関連マニュアルを参照してください。

1.2　このマニュアルの構成

このマニュアルの構成を紹介します。このマニュアルは，次のように四つの編と付録で構成されています。

第1編：お読みいただく前に
この編です。このマニュアルを読み進める前に知っておいていただきたい内容（Stream Data Platform - AFの導入から運用までの流れ，このマニュアルの構成，およびStream Data Platform - AFでのアプリケーション開発の概要）について説明しています。

第2編：CQLプログラミング
CQLによるクエリの定義方法，クエリ定義で使用するCQLの基本項目，CQLの文法などについて説明しています。

第3編：カスタムアダプター作成
カスタムアダプター作成時の実装内容，コンパイル方法，Stream Data Platform - AFが提供するAPIの文法などについて説明しています。

第4編：外部定義関数作成
外部定義関数の作成方法，外部定義関数インタフェースの文法について説明しています。

付録
このマニュアルの参考情報について説明しています。

それぞれの編に含まれる章と付録の記載内容について，次の表で説明します。

表1-1　各章と付録の記載内容

編
章・付録
記載内容

第1編
お読みいただく前に
第1章　Stream Data Platform - AFでのアプリケーション開発の概要
この章です。このマニュアルを読み進める前に知っておいていただきたい内容について説明しています。

第2編
CQLプログラミング
第2章　CQLによるクエリの定義
CQLによるクエリの定義方法について説明しています。

第3章　CQLの基本項目とデータ型
CQLの基本項目とデータ型について説明しています。

第4章　CQLリファレンス
CQLの文法について説明しています。

第5章　CQLで指定する組み込み関数
CQLで指定する組み込み関数の文法について説明しています。

第6章　クエリ定義のサンプル
クエリ定義のサンプルについて説明しています。

第3編
カスタムアダプター作成
第7章　カスタムアダプターの作成
カスタムアダプターの作成方法について説明しています。

第8章　データ送受信用API
カスタムアダプターの作成で使用するデータ送受信用APIの文法について説明しています。

第9章　データ送受信用APIを使用したサンプルプログラム
データ送受信APIを使用したサンプルプログラムについて説明しています。

第4編
外部定義関数作成
第10章　外部定義関数の作成
外部定義関数の作成方法について説明しています。

第11章　外部定義関数インタフェース
外部定義関数の作成で使用する外部定義関数インタフェースの文法について説明しています。

付録
付録A　このマニュアルの参考情報
このマニュアルを読むに当たっての参考情報について説明しています。

1.3　アプリケーション開発の概要

Stream Data Platform - AFでのアプリケーション開発の概要について説明します。

アプリケーション開発では，次の作業を実施します。

分析シナリオの定義（クエリの定義）

ストリームデータ処理エンジンとのデータ送受信用のアプリケーションの作成（カスタムアダプターの作成）

分析シナリオは，分析するデータや分析内容に合わせて定義する必要があります。

カスタムアダプターは，標準提供アダプターを使用するシステムでは不要なアプリケーションです。必要に応じて作成してください。

＜この節の構成＞

1.3.1　クエリの定義でできること

1.3.2　カスタムアダプターの作成でできること

1.3.1　クエリの定義でできること

Stream Data Platform - AFでは，ストリームデータ処理エンジンに入力されたストリームデータに対して，あらかじめ登録されたシナリオに沿った分析を実行し，目的に応じた分析結果を出力します。

シナリオは，クエリ定義ファイルに，クエリとして定義します。クエリに定義する内容を次に示します。

分析対象の特定方法
ストリームデータは，途切れることなく続く時系列順のデータです。分析するためには，分析対象とする範囲を特定する必要があります。
Stream Data Platform - AFでは，ウィンドウという概念を使用して，ストリームデータを時間またはタプルの個数で区切られた有限のデータとして扱い，分析対象の範囲を特定します。

分析処理の内容
ウィンドウで区切られたストリームデータに対して，目的に沿った分析処理を実施します。特定の列について値の推移を分析したり，複数のストリームデータの値を組み合わせて新たなストリームデータを生成して分析したりします。
分析処理の内容は，選択，結合などの関係演算や，集合関数を使用した集合演算などによって定義します。

分析結果の出力方法
分析した結果を新たなストリームデータとして出力します。
分析結果のストリームデータは，分析結果が増減したときに出力したり，一定間隔ですべての分析結果を出力したりできます。
分析結果の出力には，ストリーム化演算という演算を使用します。

ポイント

ストリーム間演算を使用すると，リレーションを生成しないで，直接ストリームデータに対して演算を実行し，演算の結果を別のストリームデータに変換できます。

ストリーム間演算では，入出力がストリームデータであること以外は特に規定がなく，入力されたストリームデータに対して実行する処理は任意です。ストリーム間演算関数の処理ロジックを，ユーザーがJavaで記述して作成するクラスファイルにメソッドとして実装することで，任意の処理を実行できます。

ストリーム間演算を使用する場合は，CQLでストリーム間演算関数を定義するほかに，外部定義関数の作成が必要です。外部定義関数の作成については，「10.　外部定義関数の作成」を参照してください。

クエリは，CQLというSQLに類似したクエリ言語を使用して定義します。

CQLを使用したクエリの定義方法については，「2.　CQLによるクエリの定義」で説明します。また，CQLの記述方法の詳細は，「3.　CQLの基本項目とデータ型」，「4.　CQLリファレンス」，および「5.　CQLで指定する組み込み関数」で説明します。なお，クエリ定義ファイルについては，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

また，クエリ定義ファイルは，サンプルを基に定義できます。サンプルの内容は，「6.　クエリ定義のサンプル」で説明します。

1.3.2　カスタムアダプターの作成でできること

Stream Data Platform - AFでは，ストリームデータの入出力に使用する機能として，標準提供アダプターを提供しています。標準提供アダプターを使用する場合，APIを使用したアプリケーションの開発は不要です。

ただし，標準提供アダプターには次のような制限があります。

標準提供アダプターの制限事項

扱えるストリームデータの形式は，ファイルまたはHTTPパケットだけです。

定義できるシナリオ（クエリグループ）の個数に制限があります。

ストリームデータ処理エンジンに対するデータ送信とデータ受信に使用するアダプター（アプリケーション）のプロセス構成を任意に決定できません（データ送信APをインプロセスで開始する場合は，データ受信APもインプロセスで開始する必要があるなど）。

標準提供アダプターについては，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

任意の形式のストリームデータを分析したい場合など，標準提供アダプターを使用できないときに，カスタムアダプターを作成してください。

カスタムアダプターは，Stream Data Platform - AFが提供するデータ送受信APIを使用したJavaアプリケーションとして作成します。データ送受信APIの使用方法，アプリケーション開発時の留意事項，コンパイル方法などについては，「7.　カスタムアダプターの作成」で説明します。データ送受信APIの詳細は，「8.　データ送受信用API」で説明します。

また，Stream Data Platform - AFでは，カスタムアダプター作成のためのサンプルプログラムを提供しています。サンプルプログラムの内容については，「9.　データ送受信用APIを使用したサンプルプログラム」で説明します。

2.　CQLによるクエリの定義

この章では，CQLによるクエリの定義方法について説明します。

なお，この章で示すCQLの記述方法の詳細は，「4.　CQLリファレンス」を参照してください。

＜この章の構成＞

2.1　CQLの体系

2.2　ウィンドウ演算による入力リレーションの生成

2.3　関係演算によるデータの抽出

2.4　ストリーム化演算による出力ストリームデータへの変換

2.5　時刻解像度の指定によるメモリ使用量増加の抑止

2.6　定義例

2.1　CQLの体系

Stream Data Platform - AFでは，ストリームデータ処理エンジンに入力されたストリームデータに対して，あらかじめ登録されたシナリオに沿った分析を実行し，目的に応じた分析結果を出力します。

シナリオは，CQLというクエリ言語を使用して定義します。

Stream Data Platform - AFで使用するCQLの体系を次の表に示します。

表2-1　Stream Data Platform - AFで使用するCQLの体系

項番
CQLの分類
用途
該当するCQLの例

1
定義系CQL
ストリームやクエリを定義して，ストリームデータ処理エンジンに登録します。
REGISTER STREAM
REGISTER QUERY　など

2
操作系CQL
クエリで実行するストリームデータの処理内容について定義します。REGISTER QUERY句に続けて記述します。
操作系CQLでは，次の4種類の演算実行をクエリに定義できます。

ウィンドウ演算

関係演算

ストリーム化演算

ストリーム間演算

SELECT
FROM
WHERE
GROUP BY
HAVING
UNION　など

CQLの詳細については，「4.　CQLリファレンス」で説明します。

CQLによるクエリの指定例を次の図に示します。

図2-1　CQLによるクエリの指定例

定義系CQLでは，ストリームデータ処理エンジンに，次の情報を登録します。

処理の対象になるストリームの情報

操作系CQLによって処理内容を記載したクエリ

操作系CQLでは，入力ストリームキューから入力されたデータに対してシナリオに沿った分析処理を実行するための，演算処理を定義します。

クエリで定義するウィンドウ演算，関係演算，ストリーム化演算，およびストリーム間演算の関係を次の図に示します。

図2-2　演算の関係

各演算での実施内容について説明します。

ウィンドウ演算

ウィンドウ演算によって，演算対象を特定します。時系列集合である入力ストリームデータまたは出力ストリームデータは，そのままの状態では演算の対象にできません。ウィンドウ演算によって，生存期間を持つ，n項組のタプルの集合（リレーション）として切り取ることで，演算の対象にできます。演算の対象として特定したリレーションを入力リレーションといいます。

ウィンドウ演算では，タプルの個数や時間などによって演算対象を特定するために，ROWSウィンドウ，RANGEウィンドウ，PARTITION BYウィンドウなどを使用します。

関係演算

関係演算によって，分析の目的に沿った処理を実行します。

関係演算では，選択，結合，集合関数といった演算を実行して，結果データをリレーションとして抽出します。このリレーションを出力リレーションといいます。

ストリーム化演算

ストリーム化演算によって，関係演算の結果データをストリームデータに変換します。出力リレーションの変化内容に応じて，追加分，削除分，集合などのデータをストリームデータとして出力できます。

ストリーム間演算

ストリーム間演算によって，ストリームデータに対して演算を実行し，別のストリームデータに変換します。

ストリーム間演算では，リレーションを生成しません。入力ストリームデータに対して演算を実行し，演算の結果を出力ストリームデータとして出力します。

また，入力されたストリームデータに対して実行する処理は任意です。ストリーム間演算関数の処理ロジックを，ユーザーがJavaで記述して作成するクラスファイルにメソッドとして実装することで，任意の処理を実行できます。

ストリーム間演算を使用する場合は，CQLでストリーム間演算関数を定義するほかに，外部定義関数の作成が必要です。外部定義関数の作成については，「10.　外部定義関数の作成」を参照してください。

2.2　ウィンドウ演算による入力リレーションの生成

この節では，ウィンドウ演算による入力リレーションの生成について説明します。

ウィンドウ演算は，ストリームデータの一部を切り取り，データ処理の対象を特定する演算です。タプルの数，時間など，異なる軸のウィンドウを組み合わせてデータ処理の対象を特定することもできます。

＜この節の構成＞

2.2.1　ウィンドウ演算の種類

2.2.2　ウィンドウ演算の例

2.2.1　ウィンドウ演算の種類

ウィンドウ演算では，4種類のウィンドウによって，処理対象を特定します。

それぞれのウィンドウによって生成される入力リレーションについて説明します。

＜この項の構成＞

(1)　データの数による指定（ROWSウィンドウ）

(2)　時間による指定（RANGEウィンドウ）

(3)　到着したタプルのタイムスタンプ時刻による指定（NOWウィンドウ）

(4)　データのグループによる指定（PARTITION BYウィンドウ）

(1)　データの数による指定（ROWSウィンドウ）

ROWSウィンドウは，タプルの数によって入力リレーションの範囲を特定するウィンドウです。

例えば，ストリームs1の入力ストリームデータの直前3個分を入力リレーションとして保持する場合，CQLは次のように定義します。

SELECT … FROM s1 [ROWS 3]…

この場合の入力リレーションの内容を次の図に示します。

図2-3　ROWSウィンドウの例

すでにリレーションにA，B，Cの三つのタプルがある場合に新たなタプルDが到着した場合，到着タプルを含む三つのタプルが入力リレーションの内容になります。このとき，いちばん古いタプルAは，入力リレーションの対象から外れます。

(2)　時間による指定（RANGEウィンドウ）

RANGEウィンドウは，時間によって入力リレーションの範囲を特定するウィンドウです。

例えば，ストリームs2の入力ストリームデータの直前3秒分を入力リレーションとして保持する場合，CQLは次のように定義します。

SELECT … FROM s2 [RANGE 3 SECOND]…

この場合の入力リレーションの内容を次の図に示します。

図2-4　RANGEウィンドウの例

タプルCの到着時，現在から直前3秒間分のタプルだけが入力リレーションに残ります。タプルC到着後，タプルBが3秒前のタプルとなり，それよりも前に到着していたタプルAは入力リレーションの対象から外れます。

(3)　到着したタプルのタイムスタンプ時刻による指定（NOWウィンドウ）

NOWウィンドウは，その時点で到着したタプルのタイムスタンプ時刻だけを演算の対象にするためのウィンドウです。

ほかのウィンドウで特定する入力リレーションが個数や時間の範囲を持つ「線」のリレーションであるのに対して，NOWウィンドウは到着したタプルと同時刻という「点」のリレーションになります。

例えば，ストリームs3の入力ストリームデータについて，到着したタプルと同時刻のタプルを演算の対象とする場合，CQLは次のように定義します。

SELECT … FROM s3 [NOW]

(4)　データのグループによる指定（PARTITION BYウィンドウ）

PARTITION BYウィンドウは，タプルの種類ごとに，タプルの個数によって入力リレーションの範囲を特定するウィンドウです。

例えば，ストリームs4の入力ストリームデータについて，列指定リストa1の各値について直前3個分を入力リレーションとして保持する場合，CQLは次のように定義します。

SELECT … FROM s4 [PARTITION BY a1 ROWS 3]

この場合の入力リレーションの内容を次の図に示します。

図2-5　PARTITION BYウィンドウの例

a1列の値として，xとyがあり，それぞれ直前3個分を入力リレーションとして保持しています。a1がyのタプルが到着すると，a1の値がyのタプル（タプルD）が一つ，入力リレーションの対象から外れます。

2.2.2　ウィンドウ演算の例

それぞれのウィンドウ演算の例を示します。

ここでは，次の図に示す構成のストリームデータが到着した場合を例に，それぞれのウィンドウの指定によって作成される入力リレーションについて説明します。

図2-6　ウィンドウ演算の例で使用するタプルの構成

図の横軸は時間軸です。右に行くほど時間が経過しています。t1～t6は，タプルが到着した時刻を示します。また，各タプルは，「銘柄名，値上がり率」で構成されています。

＜この項の構成＞

(1)　データの数による指定の例（[ROWS 3]の例）

(2)　時間による指定の例（[RANGE 1 SECOND]の例）

(3)　到着したタプルのタイムスタンプ時刻の指定による例（NOWの例）

(4)　データのグループによる指定の例（[PARTITION BY 銘柄名 ROWS 1]の例）

(1)　データの数による指定の例（[ROWS 3]の例）

ここでは，[ROWS 3]を指定した場合のウィンドウ演算の例について説明します。この指定は，入力リレーション内に同時に生存するタプル数が3であることを示します。

[ROWS 3]を指定した場合の入力リレーション内の各タプルの生存期間について，次の図に示します。

図2-7　 [ROWS 3]を指定した場合の入力リレーション内の各タプルの生存期間

時刻がt1，t2，t3と経過していく中で，「(A社,1.0)」「(A社,0.8)」「(B社,1.1)」のタプルが順次到着し，入力リレーションに生成されていきます。

時刻t4に「(A社,1.0)」のタプルが到着して，同時生存タプル数が3を超えた時点で，入力リレーション内でいちばん古いタプルの生存期間が終了します。この例では，時刻t1に生成された「(A社,1.0)」のタプルが入力リレーションから削除されて，時刻t4に到着した「(A社,1.0)」のタプルが新たに入力リレーションに生成されます。

(2)　時間による指定の例（[RANGE 1 SECOND]の例）

ここでは，[RANGE 1 SECOND]を指定した場合のウィンドウ演算の例について説明します。この指定は，入力リレーション内の各タプルの生存期間を1秒とすることを示します。

リレーション内に生成された各タプルは，その後到着するタプルの個数には関係なく，1秒たつと消滅します。

[RANGE 1 SECOND]を指定した場合の入力リレーション内の各タプルの生存期間について，次の図に示します。

図2-8　 [RANGE 1 SECOND]を指定した場合の入力リレーション内の各タプルの生存期間

t1～t4の時刻に到着したタプルは，ほかのタプルの到着状況に関係なく，1秒たつと消滅します。

(3)　到着したタプルのタイムスタンプ時刻の指定による例（NOWの例）

ここでは，[NOW]を指定した場合のウィンドウ演算の例について説明します。この指定は，入力リレーション内に現時刻のタプルだけを保持することを示します。

[NOW]を指定した場合の入力リレーション内の各タプルの生存期間について，次の図に示します。

図2-9　 [NOW]を指定した場合の入力リレーション内の各タプルの生存期間

[NOW]を指定した場合，入力リレーション内のタプルは到着した時刻にだけ生存しています。一度演算処理が実行されたタプルは入力リレーションから消滅します。

(4)　データのグループによる指定の例（[PARTITION BY 銘柄名 ROWS 1]の例）

ここでは，[PARTITION BY 銘柄名 ROWS 1]を指定した場合のウィンドウ演算の例について説明します。この指定は，入力リレーション内に銘柄ごとに，ROWSに指定した個数ずつのタプルを保持することを示します。

[PARTITION BY 銘柄名 ROWS 1]を指定した場合の入力リレーション内の各タプルの生存期間について，次の図に示します。

図2-10　 [PARTITION BY 銘柄名 ROWS 1]を指定した場合の入力リレーション内の各タプルの生存期間

この指定は，銘柄名A社およびB社ごとに，タプルを1個ずつ保存する指定です。

時刻t1に到着した「(A社,1.0)」のタプルが入力リレーションに生存している状態で時刻t2に「(A社,0.8)」のタプルが到着すると，t1に到着した「(A社,1.0)」のタプルが消滅して「(A社,0.8)」のタプルが入力リレーション内に生成されます。続いて時刻t3に「(B社,1.1)」のタプルが到着した場合は，銘柄名が異なるため，「(A社,0.8)」のタプルは消滅しないまま，新たに「(B社,1.1)」のタプルが生成されます。時刻t2に到着した「(A社,0.8)」のタプルは時刻t4に「(A社,1.0)」のタプルが到着するまで，時刻t3に到着した「(B社,1.1)」のタプルは時刻t6に「(B社,1.3)」のタプルが到着するまで，それぞれ入力リレーション内で保持されます。

2.3　関係演算によるデータの抽出

この節では，関係演算によるデータの抽出について説明します。

関係演算では，選択，結合，および集合関数によって入力リレーション内のストリームデータを操作して，結果のデータを出力リレーションとして抽出します。

＜この節の構成＞

2.3.1　関係演算の種類

2.3.2　結合処理の例

2.3.3　集合関数による演算処理の例

2.3.4　結合処理とROWSウィンドウを併用する場合の注意事項

2.3.1　関係演算の種類

関係演算では，次の3種類の操作によって結果を抽出します。

選択
n個のタプルを含む入力リレーションから，特定の条件を満たすタプルを抽出します。
例を示します。

REGISTER QUERY q1 SELECT s1.a FROM s1 [ROWS 10] WHERE s1.a > 10;

この例では，s1の入力リレーションから，WHERE句以下で指定した条件に該当するタプルを抽出します。

結合
n個のタプルを含む複数の入力リレーションから，同じデータの組み合わせを結合した結果を抽出します。
例を示します。

REGISTER QUERY q2 SELECT s1.a, s1.b, s2.b FROM s1 [ROWS 10], s2 [ROWS 10] WHERE s1.a = s2.a;

この例では，s1およびs2の入力リレーションから，WHERE句以下で指定した条件に該当するタプルを抽出します。

集合関数
n個のタプルを含む入力リレーションに対して集合関数による演算を実行した結果を抽出します。
例を示します。

REGISTER QUERY q3 SELECT SUM(s1.a) AS c1 FROM s1 [ROWS 10];

この例では，s1の入力リレーションに対して，集合関数SUMによる演算を実行した結果を抽出します。

関係演算での処理内容の詳細については，「4.　CQLリファレンス」を参照してください。

以降では，関係演算で実行する処理のうち，結合処理の例，および集合関数による演算処理の例を示します。

2.3.2　結合処理の例

ここでは，s1，s2の2種類の入力リレーションを銘柄ごとに結合した結果を出力リレーションとして抽出する例を示します。

CQLの定義例を次に示します。なお，実際のCQLの定義では，列名は半角英数字で指定してください。

REGISTER QUERY q
  SELECT s1.銘柄名, s1.値上がり率, s2.銘柄名, s2.GCフラグ
  FROM s1[PARTITION BY s1.銘柄名 ROWS 1],
       s2[PARTITION BY s2.銘柄名 ROWS 1]
  WHERE s1.銘柄名=s2.銘柄名;

このCQLを定義した場合の入力リレーションと出力リレーションの例を次の図に示します。

図2-11　結合処理の例

図の横軸は時間軸です。右に行くほど時間が経過しています。t1～t6は，タプルが到着した時刻を示します。また，入力リレーションのs1のタプルは，「銘柄名，値上がり率」で構成されており，s2のタプルは，「銘柄名，GCフラグ」で構成されています。なお，GCフラグの値は，「DC（Dead Cross）」，「GC（Golden Cross）」のどちらかです。

この例では，銘柄名によって結合処理を実行して出力します。

時刻tAでは，入力リレーションのs1にはタプル「(A社,1.0)」，s2にはタプル「(A社,GC)」があります。これらを銘柄名で結合した結果として，出力リレーションには，タプル「(A社,1.0,A社,GC)」が出力されます。

同様に，時刻tBでは，入力リレーションのs1のタプルとして「(A社,1.2)」「(B社,1.3)」があり，s2のタプルとして「(A社,DC)」「(B社,GC)」があります。これらを銘柄名で結合した結果として，出力リレーションには，タプル「(A社,1.2,A社,DC)」「(B社,1.3,B社,GC)」が出力されます。

このように，特定時刻での結合処理の結果は，入力リレーションのタプルの生存期間に応じたタプルとして，出力リレーションに抽出されます。

2.3.3　集合関数による演算処理の例

ここでは，「銘柄名」と「値上がり率」という内容を持つタプルに対して，GROUP BY句と集合関数AVGを使用して，銘柄名別に値上がり率の平均値を算出する関係演算の例を示します。

CQLの定義例を次に示します。なお，実際のCQLの定義では，列名は半角英数字で指定してください。また，AVGには相関名を指定してください。

REGISTER QUERY q
  SELECT AVG(値上がり率)
  FROM s1[ROWS 3] GROUP BY 銘柄名;

このCQLを定義した場合の入力リレーションと出力リレーションの例を次の図に示します。

図2-12　集合関数による演算処理の例

図の横軸は時間軸です。右に行くほど時間が経過しています。t1～t6は，タプルが到着した時刻を示します。

この例は，GROUP BY句で指定した銘柄別に，値上がり率を対象に集合演算AVG（平均値の算出）を指定しています。なお，入力リレーションは，[ROWS 3]の指定による，期間付きのリレーションです。

入力リレーションの時刻tAでの集合は「(A社,1.0)(A社,0.8)」となり，銘柄名別の平均値は「(A社,0.9)」となります。

同様に，時刻tBでの集合は「(A社,1.0)(A社,1.2)(B社,1.3)」となり，銘柄名別の平均値は，「(A社,1.1)(B社,1.3)」となります。

このように，特定時刻での銘柄名別の値上がり率の平均値は，入力リレーションのタプルの生存期間に応じたタプルとして，出力リレーションに抽出されます。

2.3.4　結合処理とROWSウィンドウを併用する場合の注意事項

ここでは，結合処理とROWSウィンドウを併用する場合の注意事項について説明します。

結合処理の結果として出力されるタプルの数がROWSウィンドウで指定したタプル数よりも多い場合，処理結果はROWSウィンドウで指定した数分だけ出力され，すべての処理結果が出力されません。

この問題は，次の二つの条件を満たすクエリを指定した場合に発生します。

あるクエリで，結合演算によって同一時刻を持つ複数のデータを生成する。

別のクエリで，1.のクエリの結果を入力して処理を実行するが，このクエリのROWSウィンドウで指定した生存タプル数が1.で生成されるデータ数よりも少ない。

この条件に該当するクエリの例を示します。

REGISTER STREAM s1 (c1 INT);
REGISTER STREAM s2 (c2 INT);
REGISTER QUERY q1 ISTREAM(　　　　　　　　条件1.のクエリ
 SELECT * FROM s1[ROWS 3], s2[ROWS 3]);
REGISTER QUERY q2 ISTREAM(　　　　　　　　条件2.のクエリ
 SELECT * FROM q1[ROWS 1]);

このクエリに対して，時刻tに，ストリームs1またはs2へのタプルが到着した場合を想定します。クエリq1では，二つのストリームデータを入力して，結合演算を実施します。入力ストリームデータとして[ROWS 3]を指定しているため，時刻tでの結合演算の結果としては，同一時刻を持つ三つのタプルが生成されます。

クエリq2でROWSウィンドウに指定した同時生存タプル数（1）は，クエリq1で生成されるデータ数（3）よりも少ないため，時刻tでの生存タプルは，ウィンドウに到着したタプルのうち最後の一つのタプルだけになります。クエリq1の処理結果のうち，残り二つに対するq2の処理結果は出力されません。

この例の場合，クエリq2のROWSウィンドウで3以上の数を指定するなど，CQLを見直す必要があります。

2.4　ストリーム化演算による出力ストリームデータへの変換

この節では，ストリーム化演算による出力ストリームデータへの変換について説明します。

ストリーム化演算は，出力リレーション内のデータの変化に応じて，分析結果をストリームデータとして出力する方法を指定する演算です。ストリーム化演算によって，次の3種類のタプルをストリームデータとして出力できます。

出力リレーションに追加されたタプル

出力リレーションから削除されたタプル

出力リレーション内のタプルの集合

ポイント

出力リレーション内のデータの変化とは，リレーションとしての変化を意味します。出力リレーション内のタプルが変化しても，結果の内容が同じであれば，変化したとは見なされません。

例を示します。

図2-13　リレーションが変化しない例

図の場合，時刻t3では，時刻t2の出力リレーション「(A社,0.9)」に対してタプル「(B社,1.1)」が追加されたことに伴い，出力リレーションが「(A社,0.9)(B社,1.1)」に変化します。一方，時刻t4では，t2に生成された「(A社,0.9)」が消滅しますが，同時に別のタプルとして「(A社,0.9)」が生成されるため，出力リレーションの内容は「(A社,0.9)(B社,1.1)」のままになります。この場合，時刻t4で出力リレーションは変化していないものと見なされます。

＜この節の構成＞

2.4.1　ストリーム化演算の種類

2.4.2　ストリーム化演算の例

2.4.1　ストリーム化演算の種類

ストリーム化演算の種類と指定方法について説明します。

＜この項の構成＞

(1)　出力リレーションに追加されたタプルを出力する指定（ISTREAM）

(2)　出力リレーションから削除されたタプルを出力する指定（DSTREAM）

(3)　出力リレーション内のタプルの集合を一定間隔で出力する指定（RSTREAM）

(1)　出力リレーションに追加されたタプルを出力する指定（ISTREAM）

ISTREAMは，出力リレーションにタプルが追加されたときに，そのタプルを出力する演算です。指定例を次に示します。

ISTREAM( SELECT … FROM s1 [ROWS 10] … )

(2)　出力リレーションから削除されたタプルを出力する指定（DSTREAM）

DSTREAMは，出力リレーションからタプルが削除されたときに，そのタプルを出力する演算です。指定例を次に示します。

DSTREAM( SELECT … FROM s2 [ROWS 10] … )

(3)　出力リレーション内のタプルの集合を一定間隔で出力する指定（RSTREAM）

RSTREAMは，出力リレーション内のタプルの集合を一定間隔で出力する演算です。指定例を次に示します。

RSTREAM[1 SECOND]( SELECT … FROM s3 [ROWS 10] … )

注意

タイムスタンプモードをデータソースモードにしている場合，RSTREAMを指定しても意図した内容が出力されないおそれがあります。

データソースモードでは，タプルが到着したタイミングでリレーションの時刻を進めます。例えば，RSTREAMで出力間隔を1分とした場合でも，「09:01:00」にタプルが到着したあと，次のタプルが「10:00:00」に到着した場合，09:02から09:59の間，ストリームデータは出力されません。「10:00:00」のタプルが到着したタイミングで，1時間分のタプルがまとめて出力されてしまいます。

データソースモードでRSTREAMを使用する場合は，この動作を理解した上で，注意して使用してください。

2.4.2　ストリーム化演算の例

ここでは，それぞれのストリーム化演算を指定した場合に，結果として出力されるストリームデータの例について説明します。なお，ここで示すのは，ウィンドウ演算に「PARTITION BY 銘柄名 ROWS 1」を指定した場合の例です。

＜この項の構成＞

(1)　出力リレーションに追加されたタプルを出力する指定の例（ISTREAM）

(2)　出力リレーションから削除されたタプルを出力する指定の例（DSTREAM）

(3)　出力リレーション内のタプルの集合を一定間隔で出力する指定の例（RSTREAM）

(1)　出力リレーションに追加されたタプルを出力する指定の例（ISTREAM）

ISTREAMを指定した場合の出力リレーションと結果ストリームデータの例を次の図に示します。

図2-14　ISTREAMを指定した場合の出力リレーションと結果ストリームデータの例

出力リレーションにタプルが追加されたときに，結果ストリームデータとして対応するタプルが出力されます。この例の場合は，出力リレーションの時刻t1にタプル「(A社,1.0)」が追加された時点で，結果ストリームデータにも時刻t1にタプル「(A社,1.0)」が出力されます。以降，時刻t2，時刻t3にタプルが追加されるたびに，結果ストリームデータに対応するタプルが出力されます。

なお，時刻t4では，タプル「(A社,0.9)」が追加されるのと同時に時刻t2で追加されたタプル「(A社,0.9)」が削除されるため，リレーションとしては変化しません。このため，結果ストリームデータには何も出力されません。

(2)　出力リレーションから削除されたタプルを出力する指定の例（DSTREAM）

DSTREAMを指定した場合の出力リレーションと結果ストリームデータの例を次の図に示します。

図2-15　DSTREAMを指定した場合の出力リレーションと結果ストリームデータの例

出力リレーションからタプルが削除されたときに，結果ストリームデータとしてタプルが出力されます。この例の場合は，出力リレーションのタプル「(A社,1.0)」が時刻t2で削除された時点で，結果ストリームデータにタプル「(A社,1.0)」が出力されます。

なお，時刻t4では，タプル「(A社,0.9)」が削除されるのと同時にタプル「(A社,0.9)」が追加されるため，リレーションとしては変化しません。このため，ISTREAMを指定した場合と同様に，結果ストリームデータには何も出力されません。

(3)　出力リレーション内のタプルの集合を一定間隔で出力する指定の例（RSTREAM）

RSTREAMを指定した場合の出力リレーションと結果ストリームデータの例を次の図に示します。

図2-16　RSTREAMを指定した場合の出力リレーションと結果ストリームデータの例

出力リレーション内の集合が，結果ストリームデータのタプルとして1秒間隔で出力されます。時刻tAには，出力リレーション内には「(A社,1.0)」だけしかないため，結果ストリームデータには「(A社,1.0)」だけが出力されます。1秒経過後の時刻tBでは，出力ストリームの集合が「(A社,0.9)(B社,1.1)」になっているため，結果ストリームデータには「(A社,0.9)(B社,1.1)」が出力されます。

以降，1秒ごとの出力リレーションの内容が，結果ストリームデータに出力されます。

2.5　時刻解像度の指定によるメモリ使用量増加の抑止

この節では，RANGEウィンドウを指定して大量の受信データを処理する場合などに，時刻解像度を指定することによってメモリ使用量の増加を抑止する方法について説明します。

RANGEウィンドウを指定したクエリの場合，一定時間内に受信したデータがすべて処理の対象になります。このため，指定する時間やデータの量によっては，メモリ使用量が増加して，システムの動作に影響が出るおそれがあります。

これに対して，時刻解像度を指定することで，RANGEウィンドウの処理対象となるデータの量を一定に抑えられます。

時刻解像度の指定とは，RANGEウィンドウで指定した範囲のリレーションを任意の単位時間に分割して，分割した時間ごとに演算処理を実行する機能のことです。なお，分割したリレーションのことをメッシュといいます。分割する間隔（ミリ秒単位）をメッシュ間隔といいます。

RANGEウィンドウで指定した時間の範囲で扱う受信データが多い場合，あらかじめメッシュ単位で演算を実行し，その結果を擬似タプルとして保持します。RANGEウィンドウでは，この擬似タプルを処理対象とすることで，RANGEウィンドウ内のタプル数を一定に保ちます。これによって，メモリ使用量の増加を抑止できます。

例えば，RANGEウィンドウ内のタプル数が10万個ある場合に，時刻解像度を指定して，10万個のタプルをあらかじめ8個の擬似タプルにしておけば，メモリ内に保持しておくタプルの個数は8個に抑えられます。

時刻解像度は，次の二つの条件を満たすクエリで指定できます。

RANGEウィンドウを使用している。

関係演算として，次のどれかの集合関数を使用している。

SUM（合計値の算出）

MAX（最大値の算出）

MIN（最小値の算出）

時刻解像度を指定しない場合と指定した場合の演算の違いを次に示します。

図2-17　時刻解像度を指定しない場合と指定した場合の演算の違い

時刻解像度を指定しない場合，演算の対象は，RANGEウィンドウ内のすべてのタプルになります。例えば，RANGEウィンドウの範囲として1分間を指定している場合に，1分間に到着するタプルの総数が10万個ある場合，演算の対象は10万個になります。最大値を求める演算の場合，10万個のタプルをすべて比較して，最大値を求める必要があります。

一方，時刻解像度を指定した場合，演算の対象は，擬似タプルになります。擬似タプルは，あらかじめ指定したメッシュ間隔に応じて演算処理が実行された結果です。例えば，メッシュ間隔の指定によってRANGEウィンドウを8個に分割していた場合，擬似タプルは8個作成されます。最大値を求める演算の場合，8個の擬似タプルの内容を比較すれば，最大値を求められます。このように，時刻解像度を指定することで，RANGEウィンドウ内に保持するタプル数を削減し，メモリ使用量の増加を抑えられます。

ポイント

時刻解像度は，ストリームデータの送信レートが高く，RANGEウィンドウ内に生存する到着タプルが多い場合に指定すると効果的です。

時刻解像度を指定することで，Javaヒープ領域内のメモリ使用量を一定に保つことができるので，メモリ使用量の単調増加を抑止できます。

時刻解像度は，単位時間当たりの最大値（MAX），最小値（MIN），合計値（SUM）を求める処理ロジックを持つクエリに適用できます。

時刻解像度の指定例については，「2.6.2　時刻解像度を指定した定義例」を参照してください。

2.6　定義例

この節では，CQLによるクエリの定義例について説明します。

＜この節の構成＞

2.6.1　基本的なクエリの定義例

2.6.2　時刻解像度を指定した定義例

2.6.1　基本的なクエリの定義例

ここでは，ウィンドウ演算，関係演算およびストリーム化演算を使用した，基本的なクエリの定義例として，株価情報を対象としたクエリの定義例を示します。

この例で扱う株価情報ストリームデータの例を次の図に示します。

図2-18　株価情報ストリームデータの例

この例で扱うストリームデータは，銘柄コード（stockID），銘柄名（stockName），株価（currentPrice）および出来高（tradingVolume）という株価情報を持つデータに対して，Stream Data Platform - AFでタイムスタンプを設定したストリームデータです。

このストリームデータを使用して，株価の値上がり率を計算します。値上がり率は，現在のデータと1分前のデータを比較して算出します。

値上がり率を算出するためには，次の2種類のクエリを使用します。

1分間データ算出クエリ

REGISTER QUERY stockDStream
DSTREAM ( SELECT * FROM stock[RANGE 1 MINUTE] );

範囲を1分間と指定したRANGEウィンドウによって，入力リレーションのタプルを1分間保持します。

DSTREAMを指定して，1分間の生存期間が終了したタプルを出力します。これによって，現在から1分前のデータが，ストリームデータとして出力されます。

値上がり率計算クエリ

REGISTER QUERY risingRate
ISTREAM ( SELECT stock.stockID, stock.stockName,
        stock.currentPrice / stockDStream.currentPrice AS stockRate
        FROM stock[PARTITION BY stock.stockID ROWS 1],
        stockDStream[PARTITION BY stockDStream.stockID ROWS 1]
        WHERE stock.stockID = stockDStream.stockID );

PARTITION BYウィンドウを使用して，銘柄ごとに最新の1件のタプルを保持します。

現在の株価情報ストリームデータと1分前のストリームデータを統合して，値上がり率を計算します。

これらのクエリを使用した演算処理の流れを次の図に示します。

図2-19　株価値上がり率を算出する演算処理の流れ

処理の流れについて説明します。説明の番号は図中の番号と対応しています。

［クエリstockDStreamのウィンドウ演算］
ウィンドウ演算を実行します。
「FROM stock」の指定によって入力したストリームstockを，「[RANGE 1 MINUTE]」の指定によって1分間保持します。

［クエリstockDStreamのストリーム化演算］
1分経過したデータは，ストリーム化演算「DSTREAM」によってストリームデータ（1分前データ）として出力されます。

［クエリrisingRateのウィンドウ演算］
ストリームstockと，2.で出力した結果ストリーム（1分前データ）の2種類のデータを「FROM stock…, stockDStream…」の指定によって入力します。
「[PARTITION BY… ROWS 1]」の指定によって，入力データを銘柄コード（stockID）ごとにグルーピングした上で，銘柄コードごとの最新1件のデータを保持します。これによって，銘柄コードごとに，次のデータが保持されます。

入力ストリームstockによる現在の株価データのうち，最新の1件

入力ストリームstockDStream（クエリstockDStreamの結果ストリーム）による1分前の株価データのうち，最新の1件

［クエリstockDStreamの関係演算］
銘柄コードごとに，銘柄コード，銘柄名，および値上がり率（現在の株価/1分前の株価）を結合します。

［クエリstockDStreamストリーム化演算］
同一銘柄の1分前データと現在データが到着したタイミングで，4.の結合データを結果ストリームとして出力します。

2.6.2　時刻解像度を指定した定義例

ここでは，時刻解像度を指定したクエリの定義例として，次の2種類の例について説明します。

一つの集合関数を定義する例

複数の集合関数を定義する例

この例では，1分間のRANGEウィンドウ内にある到着タプルに対して，集合関数による関係演算を実行します。この例で扱うストリームは次のとおりです。

時刻解像度の指定例で扱うストリーム

ストリーム名は「stock」である。

「price」という名称の列がある。

＜この項の構成＞

(1)　一つの集合関数を定義する例

(2)　複数の集合関数を定義する例

(1)　一つの集合関数を定義する例

ストリームstockに対して，RANGEウィンドウ内にある到着タプルから列名priceの合計値を求める場合の定義例を次に示します。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));　　　　…(1)
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=stock PERIOD=300MS TARGETS=SUM(price);　　　　…(2)
REGISTER QUERY q1　　　　…(3)
ISTREAM(
 SELECT name, SUM (price) AS s1
 FROM stock[RANGE 1 MINUTE]
 GROUP BY name
);

注

(1)～(3)は次に示す説明と対応している番号です。実際の定義には不要です。

時刻解像度を指定するクエリの名称は，(3)で指定しているq1です。このため，(2)のQUERY_ATTRIBUTE文でも，クエリ名としてq1を指定します。

この例は，(1)で指定しているストリーム名stockについて，時刻解像度を指定して列名priceの合計値を求める例です。このため，(2)のSTREAM_NAME=のデータ識別子にはstockを指定して，TARGETS=には集合関数SUM(price)を指定します。

合計値ではなく，最大値または最小値を求める場合には，集合関数MAXまたはMINを指定してください。

(2)　複数の集合関数を定義する例

ストリームstockに対して，RANGEウィンドウ内にある到着タプルから列名priceの合計値，最大値および最小値を求める場合の定義例を次に示します。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
 SELECT name, price AS price0, price AS price1, price AS price2
 FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=q0 PERIOD=300MS
TARGETS=SUM(price0),MAX(price1),MIN(price2);
REGISTER QUERY q1
ISTREAM(
 SELECT q0.name, SUM(q0.price0) AS sum_price,
   MAX(q0.price1) AS max_price, MIN(q0.price2) AS min_price
 FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);

時刻解像度を指定して複数の集合演算を実行する場合，同じデータ識別子を持つ同一名称の列名に対して，複数の集合演算は実行できません。例えば，データ識別子stockの列名priceのクエリに対して，「TARGETS=SUM(price),MAX(price),MIN(price)」のような指定はできません。

複数の集合関数を指定する場合は，集合関数の対象とする列名をそれぞれ用意する必要があります。この例では，SUM，MAX，MINそれぞれの対象とする列名として，列名priceをprice0，price1，price2という列名に置き換えた上で，それぞれの集合関数による演算を実行しています。

3.　CQLの基本項目とデータ型

この章では，CQLの基本項目とデータ型について説明します。

＜この章の構成＞

3.1　CQLによるクエリ定義

3.2　CQLの基本項目の指定方法

3.3　CQLのデータ型

3.4　データの比較

3.5　クエリ定義での注意事項および制限値

3.1　CQLによるクエリ定義

クエリは，CQLを使用して定義します。CQLは，次の項目（基本項目）を組み合わせて処理を記述します。

キーワード

数値

区切り文字

名前

定数

キーワードは，「SELECT」や「WHERE」のように，データ処理のための機能を示す文字列です。キーワードに対して，処理対象や処理範囲などを定義するために指定する数値，区切り文字，名前，定数などは，オペランドといいます。

これらの基本項目を指定する場合は，使用できる文字，データ型などに留意する必要があります。

ここでは，CQLでクエリを定義する際の，基本項目の記述形式および使用できる文字について説明します。また，以降のCQLの文法説明で使用する記号についても説明します。

＜この節の構成＞

3.1.1　CQLの記述形式

3.1.2　CQLで使用できる文字

3.1.3　CQL文法説明で使用する記号

3.1.1　CQLの記述形式

CQLは，次の内容に従って記述してください。

CQLは，フリーフォーマット形式です。オペランドは，各CQLの形式で記述している順序に従って指定します。CQLの形式については，「4.　CQLリファレンス」を参照してください。

CQLの文は，セミコロン（;）で区切って記述します。
一つの文は複数行にわたって記述できます。1行に複数の文を記述することはできません。
正しい記述例と誤った記述例を次に示します。
（正しい記述例）

 REGISTER STREAM
     s1(id INT,name VARCHAR(10));
 REGISTER QUERY q1
     SELECT s1.name FROM s1[ROWS 10];

（誤った記述例）

 REGISTER STREAM s1(id INT); REGISTER QUERY q1 SELECT * FROM s1[ROWS 10];

二つのREGISTER文を1行に記載しているので，誤りとなります。

注釈は，ダブルスラッシュ（//）で指定します。ダブルスラッシュを指定した場合，ダブルスラッシュを含めた以降の文は注釈として扱われます。この場合，注釈の有効範囲は1行です。一つの定義文の途中に注釈を挿入することはできません。
正しい記述例と誤った記述例を次に示します。
（正しい記述例）

 //  注釈
 REGISTER STREAM
     s1(id INT,name VARCHAR(10));   //  注釈

（誤った記述例）

 REGISTER QUERY q1   //  注釈
     SELECT s1.name FROM s1[ROWS 10];

REGISTER QUERY文の途中に注釈を挿入しているので，誤りとなります。
なお，文字列中に注釈以外の用途で「//」を指定する場合，「//」が行の先頭にならないように記述してください。正しい記述例と誤った記述例を次に示します。
（正しい記述例）

 REGISTER QUERY q1 SELECT * FROM s1[NOW] WHERE s1.c1='ab//cd';

（誤った記述例）

 REGISTER QUERY q1 SELECT * FROM s1[NOW] WHERE s1.c1='ab
 //cd';

行の先頭が「//」となっているため，誤りとなります（注釈行と見なされてしまいます）。

3.1.2　CQLで使用できる文字

ここでは，CQLで使用できる文字について説明します。

＜この項の構成＞

(1)　使用できる文字コード

(2)　使用できる文字

(1)　使用できる文字コード

CQLで使用できる文字コードを次に示します。

Windowsの場合：MS932

Linuxの場合：UTF-8

(2)　使用できる文字

CQLで使用できる文字を次の表に示します。

表3-1　CQLで使用できる文字

項番
種別
使用できる文字

1
名前
半角英数と下線（_）が使用できます。ただし，先頭に使用できる文字は，半角英文字だけです。名前の指定については，「3.2.4　名前の指定」を参照してください。

2
文字列定数
半角文字コードおよび全角文字コードが使用できます。

3
上記以外
次に示す半角文字コードの文字および特殊記号が使用できます。

半角文字コード
英大文字（A～Z），英小文字（a～z），数字（0～9），空白，下線文字（_）

特殊記号
コンマ（,）：選択リスト，値式など
ピリオド（.）：浮動小数点定数，列指定，日付／時刻データなど
コロン（:）：時刻／時刻印データ
ハイフン（-）：日付／時刻印データ
引用符（'）：文字列の囲み
左括弧（(），右括弧（)）：リレーション式，キャスト指定の囲みなど
小なり演算子（<），大なり演算子（>），等号演算子（=），感嘆符（!）：比較演算子
正符号（+），負記号（-），斜線（/）：算術演算子
アスタリスク（*）：算術演算子，すべての列出力等
セミコロン（;）：文の区切り
角括弧（[ ]）：時間指定の囲み，タブコード，改行コード，復帰コード
斜線（/）＋斜線（/）：注釈
ドル記号，アスタリスクの組み合わせ（$*）：外部定義関数

3.1.3　CQL文法説明で使用する記号

CQLの文法説明で使用する記号の用法を次の表に示します。以降，3章および4章では，これらの記号を使用してCQLの文法を説明します。

表3-2　CQLの文法説明で使用する記号

記号
意味
例

｛　｝
この記号で囲まれた複数の項目から，一つを選択することを示します。
｛文字列定数｜数定数｝
文字列定数，または数定数のどちらかを選択して記述します。

〔　〕
この記号で囲まれた項目は省略できることを示します。複数の項目が並べて記述されている場合は，すべてを省略するか，記号｛　｝と同じくどれか一つを選択します。
〔SECOND｜MILLISECOND〕
すべてを省略するか，SECONDまたはMILLISECONDのどちらかを選択して記述します。

…
この記号の直前に示された項目を繰り返し複数個指定できることを示します。
リレーション参照〔,リレーション参照〕…
リレーション参照を繰り返し複数個記述します。

'('　')'
この記号で囲まれた項目は，(　)を省略しないでそのまま記述することを示します。
'('TINYINT')'
TINYINTの前後を(　)で囲んで記述します。

'['　']'
この記号で囲まれた項目は，[　]を省略しないでそのまま記述することを示します。
'['ウィンドウ指定']'
ウィンドウ指定の前後を[　]で囲んで記述します。

::=
この記号の左にあるものを右にあるもので定義することを示します。
選択リスト::=選択式〔,選択リスト〕

▲n
n個以上の区切り文字を示します。nが省略されている場合，n=1を仮定します。
NOT｛▲₀'('探索条件')'｜▲比較述語｝
NOTと(探索条件)の間に0個以上の区切り文字，またはNOTと比較述語の間に1個以上の区切り文字を記述します。

3.2　CQLの基本項目の指定方法

この節では，CQLの基本項目の指定方法について説明します。

＜この節の構成＞

3.2.1　キーワードの指定

3.2.2　数値の指定

3.2.3　区切り文字の挿入

3.2.4　名前の指定

3.2.5　名前の修飾

3.2.6　定数の指定

3.2.1　キーワードの指定

CQL文の名称（SELECT，UNIONなど）のように，機能を使用するために指定する語をキーワードといいます。

キーワードの意味については，「4.　CQLリファレンス」を参照してください。

キーワードの指定例を次の図に示します。

図3-1　キーワードの指定例

ほとんどのキーワードは，システムの予約語として登録されているため，決められた位置以外には指定できません。

ただし，予約語として登録されていないキーワードの文字列は，名前としても使用できます。その場合，大文字，小文字の区別はされません。

予約語としてシステムに登録されている文字列を，先頭文字のアルファベットごとに次の表に示します。

表3-3　予約語としてシステムに登録されている文字列

先頭文字
予約語

A
ALL，AND，ANY，AS，ASC，AST，AVG

B
BETWEEN，BIGINT，BIGINT_TOSTRING，BINARY，BOOLEAN，BY

C
CASE，CHAR，CHARACTER，CON，CONCAT，CORREL，COUNT，COVAR，COVAR_POP

D
DABS，DACOS，DASIN，DATAN，DATAN2，DATE，DAY，DCEIL，DCOS，DCOSH，DDISTANCE，DDISTANCE3，DEC，DECIMAL，DECIMAL_TOSTRING，DEFAULT，DELETABLE，DELETE，DESC，DEXP，DFLOOR，DISTINCT，DLN，DLOG，DMOD，DNAN，DNEGATIVE_INFINITY，DOUBLE，DOUBLE_TOSTRING，DPI，DPOSITIVE_INFINITY，DPOWER，DROUND，DSIN，DSINH，DSQRT，DSTREAM，DTAN，DTANH，DTODEGREES，DTORADIANS

E
ELSE，END，EOF，EQ，EXISTS

F
FALSE，FLOAT，FROM

G
GE，GT，GROUP

H
HAVING，HOUR

I
IABS，IDSTREAM，IMOD，IN，INSERT，INSTANT，INT，INT_TOSTRING，INTEGER，IPOWER，IS，ISTREAM

J
予約語はありません。

K
予約語はありません。

L
LABS，LATEST，LE，LENGTH，LEQ，LGE，LGT，LIKE，LIMIT，LLE，LLP，LLT，LMOD，LP，LPOWER，LRP，LT

M
MAX，MILLISECOND，MIN，MINUTE，MIS

N
NE，NOT，NOW，NROUND，NULL，NUMBER_TODATE，NUMBER_TOTIME，NUMERIC

O
OR，ORDER，OTHER

P
P_INT，PARTITION，PLS，POM，PR，PREV

Q
予約語はありません。

R
RABS，RACOS，RANGE，RANKING，RASIN，RATAN，RATAN2，RCEIL，RCOS，RCOSH，RDISTANCE，RDISTANCE3，REAL，REAL_TOSTRING，RECENT，REGEXP_FIRSTSEARCH，REGEXP_REPLACE，REGEXP_SEARCH，RELATIONAL，REXP，RFLOOR，RLN，RLOG，RMOD，RNAN，RNEGATIVE_INFINITY，ROWS，RPI，RPOSITIVE_INFINITY，RPOWER，RROUND，RSIN，RSINH，RSQRT，RSTREAM，RTAN，RTANH，RTODEGREES，RTORADIANS

S
SECOND，SELECT，SMALLINT，SOME，SPLENGTH，SQU，STDDEV，STDDEV_POP，SUB，SUM

T
THEN，TIME，TIME_TONUMBER，TIMEDIFF，TIMESTAMP，TIMESTAMP_TONUMBER，TIMESTAMPDIFF，TINYINT，TRUE

U
UNBOUNDED，UNION，UNKNOWN，UPDATE

V
VAR，VAR_POP，VARBINARY，VARCHAR

W
WHEN，WHERE，WITH，WQU

X
予約語はありません。

Y
予約語はありません。

Z
予約語はありません。

3.2.2　数値の指定

CQL中に記述する値式以外の数値（データ型の括弧中の指定，時間，行数など）は，符号なし整数の表記法に従って指定します。

3.2.3　区切り文字の挿入

＜この項の構成＞

(1)　区切り文字の種類

(2)　区切り文字を挿入する位置

(3)　区切り文字を挿入できる位置

(4)　区切り文字を挿入できない位置

(1)　区切り文字の種類

区切り文字として指定できるのは，次の文字です。

半角空白

復帰コード

改行コード

タブコード

なお，区切り文字に空白を指定する場合は，半角空白を使用してください。全角空白は区切り文字とは見なされません。

(2)　区切り文字を挿入する位置

区切り文字を挿入する位置を次に示します。

キーワードとキーワードの間

キーワードと名前の間

キーワードと数値の間

区切り文字の挿入例を次の図に示します。

図3-2　区切り文字の挿入例

(3)　区切り文字を挿入できる位置

区切り文字は，次に示す特殊文字の前後で，かつ「(4)　区切り文字を挿入できない位置」で挿入を禁止されていない位置に挿入できます。

「,」「.」「-」「+」「*」「'」「(」「)」「<」「>」「=」「^」「!」「#」「$」「/」「[」「]」「復帰コード」「改行コード」「タブコード」「;」

ただし，「'」を使用する文字列定数部分，および「>=」などの比較演算子の場合は，特殊記号と特殊記号の間に区切り文字を挿入できません。

区切り文字を挿入できる位置の例を次に示します。

（例1）特殊文字（.）の前に空白を挿入

SCORE▲.NAME

（例2）特殊文字（=）のあとに空白を挿入

SCORE=▲1

(4)　区切り文字を挿入できない位置

区切り文字を挿入できない位置を次に示します。

キーワードの途中
（例）S▲ELECT

名前の途中
（例）ZA▲IKO

数定数の途中
（例）678▲9

演算子の途中
（例）<▲=

外部定義関数の記号「$*」の特殊記号と特殊記号の間
（例）$▲*

3.2.4　名前の指定

名前の指定についての規則を次に示します。

名前に使用できる文字は，半角英数字と下線（_）です。

名前の先頭に使用できる文字は，半角英文字だけです。数字や下線（_）は使用できません。

名前の指定では，大文字と小文字は区別されません。すべて半角大文字として扱われます。

名前に空白を含めることはできません。

CQLの予約語と重複した名前は指定できません（予約語でないキーワードとは重複できます）。

名前を引用符（"）で囲むことはできません。

名前として指定できる文字数は1～100文字です。

3.2.5　名前の修飾

名前の修飾は，「データ識別子.列名」のように，ピリオド（.）によってデータ識別子と列名を連結して，名前を一意にするときに使用します。なお，データ識別子と列名を連結した名前の指定方法を，列指定といいます。

＜この項の構成＞

(1)　データ識別子指定

(2)　列指定

(3)　範囲変数

(1)　データ識別子指定

データ識別子指定とは，一つのCQL文中に二つ以上のデータ識別子を指定する場合に，指定する列名がどのストリーム，リレーションまたは相関名に対応するかを一意にするための修飾子を使用した指定方法です。

次の指定形式に示すように，修飾子としてストリーム名，リレーション名，または相関名を指定します。

データ識別子の指定形式

データ識別子::={ストリーム名 | リレーション名 | 相関名}

ストリーム名およびリレーション名については，「4.4.13　リレーション参照」を参照してください。また，相関名については，「4.4.11　選択式」および「4.4.13　リレーション参照」を参照してください。

(2)　列指定

列指定とは，データ識別子で修飾された列名のことです。

複数のデータ識別子を指定した検索（二つ以上のデータ識別子を結合した検索）をする場合に，検索対象の複数のデータ識別子に同じ名称の列名があるとき，列指定によって指定した列がどのデータ識別子に対応する列なのかを明確にします。

指定形式を次に示します。

列指定の指定形式

列指定::=データ識別子.列名

データ識別子で列名を修飾する場合，指定するデータ識別子が有効な範囲内の列名を指定する必要があります。データ識別子の有効範囲は，FROM句に指定したリレーション参照のリレーション，ストリーム，または相関名で定義されている列名です。定義されていない列名を指定した場合，エラーとなります。

問い合わせの結果として取得されるストリームおよびリレーションの名前には，問い合わせを定義しているクエリ名と同じ名前が付けられます。

列名は，次のどちらかに含まれる必要があります。

列名を指定する位置が有効範囲であるデータ識別子によって示されるストリームまたはリレーション

問い合わせ結果として取得されるストリームまたはリレーション

ストリームおよびリレーションの列名は，次の規則に従って問い合わせ結果として取得されます。

UNION句を持つリレーション式で取得されるリレーションの場合，1番目に指定したリレーション式（UNION句を除く）の結果として取得されるリレーションの列名が，問い合わせ後の結果として取得されるリレーションの列名になります。
次の例では，q2のリレーション参照に指定したq1から導出される列名はc1だけです。d1およびe1は取得されません。

REGISTER QUERY q1
   SELECT s1.c1 FROM s1[NOW] …
   UNION
   SELECT s2.d1 FROM s2[NOW] …
   UNION
   SELECT s3.e1 FROM s3[NOW] …;

REGISTER QUERY q2
   SELECT q1.c1 FROM q1 …;

UNION句を持たないリレーション式で取得されるリレーションの場合，i番目の選択式によって取得される列名が，i番目に取得されるリレーションの列名になります。
次の例では，q2のリレーション参照に指定したq1から取得される列名は，q1の選択式に指定した順番に従い，列名c1，d1，e1の順に取得されます。

REGISTER QUERY q1
   SELECT s1.c1, s2.d1, s3.e1 FROM s1[NOW], s2[NOW], s3[NOW];

REGISTER QUERY q2
   SELECT * FROM q1;

ストリーム句で取得されるストリームの場合，ストリーム句で囲ったリレーション式の結果として取得されるリレーションの列名が，問い合わせ後の結果として取得されるストリームの列名になります。

ストリーム間演算関数で導出されるストリームの場合，ストリーム間演算の結果として導出されるストリームの列名が，問い合わせ後の結果として導出されるストリームの列名になります。

ストリーム句については，「4.4.2　ストリーム句」を参照してください。リレーション式については，「4.4.3　リレーション式」を参照してください。また，ストリーム間演算関数については，「4.4.24　ストリーム間演算関数」を参照してください。

(3)　範囲変数

列指定の修飾子となる識別子を範囲変数といいます。範囲変数は，有効範囲と名称を持ちます。また，範囲変数で指定されたデータ識別子は，表識別子ともいいます。

相関名は範囲変数です。相関名が指定された場合，相関名で指定された元のデータ識別子は，列名の有効範囲ではなくなります。

リレーション参照，選択式に相関名を指定した場合の列名の有効範囲について，例を次に示します。

リレーション参照に相関名を指定した場合
（正しい記述例）

 REGISTER QUERY q1 SELECT a1.a FROM s1[NOW] AS a1 WHERE a1.a > 1;

（誤った記述例）

 REGISTER QUERY q2 SELECT s1.a FROM s1[NOW] AS a1 WHERE s1.a > 1;

s1は相関名a1として定義されているため，列名aの有効範囲ではなくなっています。このため，SELECT句やWHERE句の列指定にs1は使用できません。

選択式に相関名を指定した場合
（正しい記述例）

 REGISTER QUERY q1 SELECT s1.a AS a1 FROM s1[NOW];
 REGISTER QUERY q2 SELECT a1 FROM q1 WHERE a1 > 1;

（誤った記述例）

 REGISTER QUERY q1 SELECT s1.a AS a1 FROM s1[NOW];
 REGISTER QUERY q3 SELECT q1.a FROM q1 WHERE q1.a > 1;
 REGISTER QUERY q4 SELECT a FROM q1 WHERE a > 1;

s1.aは相関名a1として定義されているため，列名aの有効範囲ではなくなっています。このため，SELECT句やWHERE句の列指定にq1.aやaは使用できません。

3.2.6　定数の指定

定数は，プログラム中で値を変更できないデータです。ここでは定数の指定について説明します。なお，定数で指定する値のデータ型については，「3.3　CQLのデータ型」を参照してください。

＜この項の構成＞

(1)　定数の種類と表記方法

(2)　日付データの規定の文字列表現

(3)　時刻データの規定の文字列表現

(4)　時刻印データの規定の文字列表現

(1)　定数の種類と表記方法

定数には，数値を表す数定数と文字列を表す文字列定数があります。

数定数には，次の種類があります。

整数定数

浮動小数点定数

10進定数

文字列定数には，次の種類があります。

文字列

日付データ

時刻データ

時刻印データ

なお，日付データおよび時刻データを指定する場合，指定値は，Stream Data Platform - AFが動作しているJavaVMのタイムゾーンに従った表現で指定する必要があります。

定数の表記方法を次の表に示します。

表3-4　定数の表記方法

項番
定数
表記方法
ストリームデータ処理エンジンが解釈するデータ型

1
数定数
整数定数
INTEGERの場合
〔符号〕整数
BIGINTの場合
〔符号〕整数〔L|l〕

（例）
-123
45
6789L
整数は，数字の並びで表します。
符号は，+または-で表します。
文字列Lまたはlを末尾に付けた定数のデータ型はBIGINT型になります。
INTEGER，BIGINT

浮動小数点定数
小数点形式
〔符号〕整数部.小数部

（例）
-12.3
456.0
0.789
整数部と小数部を整数で表して，小数点(.)で区切ります。整数部，小数部，および小数点(.)は必ず付けてください。
符号は，+または-で表します。
DOUBLE

10進定数
小数点形式
〔符号〕整数部〔.小数部〕 {D|d}

（例）
-12.3D
456.0d
0.789d
-123D
45d
整数部と小数部を整数で表して，小数点(.)で区切ります。
符号は+，または-で表します。
整数部，末尾の文字D，またはdは必ず付けてください。
小数部および小数点(.)は，省略できます。
DECIMAL
NUMERIC

2
文字列定数
'文字列'

（例）
'HITACHI'
'98'
'DB0002'
文字列は半角文字，および全角文字の列で表し，アポストロフィ（'）で囲みます※。
文字列にアポストロフィ（'）を含める場合は，1個のアポストロフィ（'）を表すのにアポストロフィ（'）を続けて2個記述してください。
例えば，文字列としてアポストロフィ'を指定する場合は，「''''」となります。
日付データ，時刻データおよび時刻印データの指定形式の詳細については，「(2) 日付データの規定の文字列表現」「(3) 時刻データの規定の文字列表現」および「(4) 時刻印データの規定の文字列表現」を参照してください。
VARCHAR

注※

文字の囲みに引用符（"）は使用できません。また，文字列中で引用符（"）は使用できません（文字列中の引用符（"）はエスケープできません）。

(2)　日付データの規定の文字列表現

日付データは，次の形式で指定します。

'YYYY-MM-DD'

YYYY

0001～9999（年）

MM

01～12（月）

DD

01～MMで指定した月の最終日（日）

日付を既定の文字列表現の定数にする場合，年（YYYY），月（MM），日（DD）をハイフン（-）でつないで表現します。年（YYYY），月（MM），日（DD）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。また，数字とハイフンの間には空白を挿入しないでください。

日付を規定の文字列表現の定数として指定した例を次に示します。

2010年3月25日の場合の指定例

'2010-03-25'

日付データを指定する際は，次の点に注意してください。

形式に従わないで指定した文字列は，日付データとして認識されません。単なる文字列定数として認識されます。

年，月，日に，範囲外の値を指定した場合，クエリグループ登録時にメッセージKFSP32014-Eがメッセージログファイルに出力されます。

(3)　時刻データの規定の文字列表現

時刻データは，次の形式で指定します。

'hh:mm:ss'

hh

00～23（時）

mm

00～59（分）

ss

00～59（秒）※

注※

うるう秒の場合は00～61（秒）です。

時刻を既定の文字列表現の定数にする場合，時（hh），分（mm），秒（ss）をコロン（:）でつないで表現します。時（hh），分（mm），秒（ss）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。また，数字とコロンの間には空白を挿入しないでください。

時刻を規定の文字列表現の定数として指定した例を次に示します。

午後10時8分26秒の場合の指定例

'22:08:26'

時刻データを指定する際は，次の点に注意してください。

形式に従わないで指定した文字列は，時刻データとして認識されません。単なる文字列定数として認識されます。

時，分，秒に，範囲外の値を指定した場合，次の例に示すように，値が繰り上げられて認識されます。

範囲外の値を指定した場合の例

表記：'25:08:26'

認識される時刻：午前1時8分26秒

(4)　時刻印データの規定の文字列表現

時刻印データは，次の形式で指定します。

'YYYY-MM-DD▲hh:mm:ss〔.SSSSSSSSS〕'

YYYY

0001～9999（年）

MM

01～12（月）

DD

01～MMで指定した月の最終日（日）

hh

00～23（時）

mm

00～59（分）

ss

00～59（秒）※

注※

うるう秒の場合は00～61（秒）です。

SSSSSSSSS

0～9けたの小数秒（S：0～9）

時刻印データを既定の文字列表現の定数にする場合，年（YYYY），月（MM），日（DD）をハイフンでつなぎ，半角空白を指定して，時（hh），分（mm），秒（ss）をコロン（：）でつないで表現します。その際，年（YYYY），月（MM），日（DD），時（hh），分（mm），秒（ss）のけた数に満たない場合，足りない数分だけ左側に0を補ってください。数字とハイフン，数字とコロンの間に空白を入れてはいけません。ただし，日（DD）と時（hh）の間には，半角空白を必ず入れてください。

時刻印データを文字列表現の定数として指定した例を次に示します。

2008年8月1日 午後10時8分26秒の場合の指定例

'2008-08-01 22:08:26'

時刻印データを指定する際は，次の点に注意してください。

形式に示した書式に従わないで指定した文字列は，時刻印データとして認識されません。単なる文字列定数として認識されます。

小数秒の精度を表現する場合，秒（ss）と小数秒（SSSSSSSSS）の間を，ピリオドでつないで指定してください。小数秒精度を省略した場合，小数秒精度が0のデータとして扱われます。小数秒が3けたの場合は1ミリ秒単位，6けたの場合は1マイクロ秒単位，9けたの場合は1ナノ秒単位の指定を意味します。

形式で示した範囲外の値を指定した場合，次の例に示すように，値が繰り上げられて認識されます。

範囲外の値を指定した場合の例

表記：'2008-02-30 25:08:26'

認識される時刻：2008年3月2日01時08分26秒

3.3　CQLのデータ型

ここでは，CQLのデータ型について説明します。

＜この節の構成＞

3.3.1　CQLのデータ型とJavaのデータ型のマッピング

3.3.2　DECIMAL型およびNUMERIC型についての注意事項

3.3.1　CQLのデータ型とJavaのデータ型のマッピング

CQLのデータ型は，Javaのデータ型にマッピングされます。

CQLのデータ型とJavaのデータ型のマッピングについて，次の表に示します。

表3-5　CQLのデータ型とJavaのデータ型のマッピング

分類
CQLのデータ型
データ形式
Javaのデータ型
データの範囲
備考

数データ
INT〔EGER〕
整数型4バイト
Integerクラス
-2,147,483,648～2,147,483,647
－

SMALLINT
整数型2バイト
Shortクラス
-32,768～32,767
－

TINYINT
整数型1バイト
Byteクラス
-128～127
－

BIGINT
整数型8バイト
Longクラス
-9,223,372,036,854,775,808～9,223,372,036,854,775,807
－

DEC〔IMAL〕〔'('m')'〕※1
10進形式
java.math.BigDecimalクラス
-10³⁸+1～10³⁸-1
精度（全体のけた数）がmけた（'+'，'-'の符号は含みません）の10進数です。
mは正整数で，1≦m≦38です。mを省略すると，15が仮定されます。

NUMERIC〔'('m')'〕※1

REAL
実数型4バイト
Floatクラス

-3.402823466​E+38～-1.175494351​E-38

0

1.175494351​E-38～3.402823466​E+38

入力データに指数表現は使用できません。

FLOAT
実数型8バイト
Doubleクラス

-1.7976931348623157​E+308～-2.2250738585072014​E-308

0

2.2250738585072014​E-308～1.7976931348623157​E+308

入力データに指数表現は使用できません。

DOUBLE

文字データ
CHAR〔ACTER〕〔'('n')'〕
固定長文字列（文字数n個）
java.lang.Stringクラス
1～255
nは正整数です。1≦n≦255です。nを省略すると，1が仮定されます。列には，列を埋めるために必要なだけ空白が追加されます。データの長さが指定文字数nを超えた場合は，エラーになります。

VARCHAR'('n')'
可変長文字列（最大文字数n個）
1～32,767
nは正整数です。1≦n≦32,767です。列には，列を埋めるための空白は追加されません。データの長さが指定文字数nを超えた場合は，エラーになります。

日付データ
DATE※2
日付（年月日）
java.sql.Dateクラス
YYYYMMDD

YYYY：
0001～9999（年）
MM：
01～12（月）
DD：
01～該当年月の最終日（日）
－

時刻データ
TIME※2
時間（時分秒）
java.sql.Timeクラス
hhmmss

hh：
00～23（時）
mm：
00～59（分）
ss：
00～59（秒）
－

時刻印データ
TIMESTAMP〔'('p')'〕※2
日時（年月日+時分秒+ナノ秒）
java.sql.Timestampクラス
YYYYMMDDhhmmss〔nn…n〕

YYYY：
0001～9999（年）
MM：
01～12（月）
DD：
01～該当年月の最終日（日）
hh：
00～23（時）
mm：
00～59（分）
ss：
00～59（秒）
nn…n：
pけたの小数秒（n：0～9）
pは正整数です。0≦n≦9です。pを省略すると，3が仮定されます。
pのけたは，3けたでミリ秒，6けたでマイクロ秒，9けたでナノ秒単位となります。pを超えた場合は，エラーになります。

（凡例）

－：該当しません。

注※1

DECIMAL型およびNUMERIC型についての注意事項は，「3.3.2　DECIMAL型およびNUMERIC型についての注意事項」を参照してください。

注※2

DATE型，TIME型およびTIMESTAMP型のデータには範囲外の値を指定しないように注意してください。これらのデータ型に範囲外の値を指定した場合，例外などは発生しないで，意図しない処理が実行されるおそれがあります。

なお，「データ型(n)」のように，データ型の後ろに(　)で囲んで記載する数値は，型の長さを示します。

参考

CQLのデータ型とJavaのデータ型とのマッピングは，SQLのデータ型とJavaのデータ型とのマッピングを定義したJDBC APIに従っています。

3.3.2　DECIMAL型およびNUMERIC型についての注意事項

DECIMAL型およびNUMERIC型のデータで，送信データが指定したけた数を超えた場合，エラーになります。

また，次の処理を実行した場合に，結果のけた数がquery.decimalMaxPrecisionパラメーターで指定したけた数を超えた場合，指定したけた数に丸められて表現されます（これらの処理を実行しない場合，値は丸められません）。

四則演算（2項演算）の演算項，または集合関数SUMもしくはAVGの引数にDECIMAL型（NUMERIC型）が含まれる演算を実行した場合

DECIMAL型（NUMERIC型）以外のデータ型からDECIMAL型（NUMERIC型）へのキャスト（暗黙的なキャストを含む）を実行した場合

値をどのように丸めて表現するかは，query.decimalRoundingModeパラメーターで指定します。パラメーターの詳細については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

値の丸め方の例を次の表に示します。なお，この例はquery.decimalMaxPrecisionパラメーターに「1」（けた数は1に丸める）と設定している場合です。

表3-6　値の丸め方の例（query.decimalMaxPrecision=1の場合）

演算結果
（けた数2）
query.decimalRoundingModeパラメーターの指定値

DOWN
HALF_UP

5.5
5
6

2.5
2
3

1.6
1
2

1.1
1
1

1.0
1
1

-1.0
-1
-1

-1.1
-1
-1

-1.6
-1
-2

-2.5
-2
-3

-5.5
-5
-6

なお，DECIMAL型（NUMERIC型）の数定数（10進定数）の場合，けた数のチェックは実行されません。値がデータの範囲外の場合，query.decimalMaxPrecisionパラメーターおよびquery.decimalRoundingModeパラメーターの指定値に関係なく，CQLに記述した値として表現されます。

DECIMAL型（NUMERIC型）の送信データ，演算結果，数定数について，けた数の指定方法と指定したけた数を超えた場合の動作を次の表に示します。

表3-7　DECIMAL型（NUMERIC型）のけた数の指定方法とけた数を超えた場合の動作

種類
けた数の指定方法
指定したけた数を超えた場合の動作

送信データ
スキーマ指定文字列の型名
データ送信時にけた数を超えていた場合，エラーになります。

演算結果

四則演算

集合関数SUM／AVG

キャスト

query.decimalMaxPrecisionパラメーター
query.decimalMaxPrecisionパラメーターで指定したけた数になるよう，query.decimalRoundingModeパラメーターで指定した方法で丸められます。

上記以外
演算結果がそのまま表示されます（値は丸められません）。

数定数（10進定数）
指定なし
CQLに記述した値で表現されます。

3.4　データの比較

この節では，クエリ内でのデータの比較について説明します。

＜この節の構成＞

3.4.1　比較できるデータ型の組み合わせ

3.4.2　データを比較する際の留意点

3.4.1　比較できるデータ型の組み合わせ

WHERE句，またはHAVING句に指定した探索条件の中で比較できるデータ型の組み合わせを次の表に示します。WHERE句については，「4.4.6　WHERE句」を，HAVING句については，「4.4.8　HAVING句」を参照してください。

なお，ここで説明する比較の規則は，GROUP BY句，および集合関数にも適用されます。

表3-8　比較できるデータ型の組み合わせ

項番 | データ型 | 数データ | 文字データ | 日付データ | 時刻データ | 時刻印データ
1 | 数データ | ○ | △ | × | × | ×
2 | 文字データ | △ | ○ | △ | △ | △
3 | 日付データ | × | △ | ○ | × | ×
4 | 時刻データ | × | △ | × | ○ | ×
5 | 時刻印データ | × | △ | × | × | ○

（凡例）

○：比較できます。

△：条件によっては比較できます。比較できる場合については，「3.4.2(2)　文字データの比較」を参照してください。

×：比較できません。

3.4.2　データを比較する際の留意点

ここでは，データを比較する際の留意点について説明します。

＜この項の構成＞

(1)　データ型一般の比較

(2)　文字データの比較

(3)　数データの比較

(4)　日付，時刻，および時刻印データの比較

(1)　データ型一般の比較

GROUP BY句を指定した検索では，列すべての結果の値が同一である行が，同じグループとして扱われます。

(2)　文字データの比較

文字データの比較は，JavaのString型データの比較に準じます。

文字データと日付，時刻，または時刻印データを比較する場合，日付，時刻，または時刻印データの形式に沿った文字列定数との比較だけが有効になります。

WHERE句の数データと文字データの比較では，文字データが明示的に数データの型にキャストされ，かつ，文字データの書式が比較対象の数データの型に従っている場合にだけ比較できます。

ポイント

文字データのキャストについて

比較に限らず，値式に現れた文字データについても同様にキャストができます。

キャストによって数データと比較できる文字データの書式について次の表に示します。

表3-9　キャストによって数データと比較できる文字データの書式

数データの型
キャスト指定
文字データの書式

規則
例

整数型
(TINYINT)
(SMALLINT)
(INT[EGER])
(BIGINT)

0～9の数字を指定します。

ピリオドを含んではいけません。

値は数データの範囲内に収まる必要があります。

正の値の場合，プラス（+）の符号を指定できません。

正常に比較できる例

'12'

'-1'　（マイナスの符号を付ける）

比較がエラーになる例

'12.0'　（ピリオドを含む）

'1b3'　（数字以外を含む）

'+1'　（プラスの符号を付ける）

実数型および10進数
(REAL)
(FLOAT)
(DOUBLE)
(DEC[IMAL])

0～9の数字を指定します。

ピリオドを含められます。

値は数データの範囲内に収まる必要があります。

値にプラス（+）またはマイナス（-）の符号を指定できます。

正常に比較できる例

'12'

'12.0'　（ピリオドを含む）

'-1.0'　（マイナスの符号を付ける）

'+1.0'　（プラスの符号を付ける）

比較がエラーになる例

'1b3.0'　（数字以外を含む）

注　正負の符号の付加は，java.lang.Numberクラスの実装方式に従います。

キャスト指定の形式については，「4.4.18　値式」を参照してください。

(3)　数データの比較

比較するデータのデータ型が異なる場合，範囲の広い方のデータ型に暗黙的にキャストして比較されます。範囲の広さを次に示します。

DECIMAL = NUMERIC > FLOAT = DOUBLE > REAL > BIGINT > INTEGER > SMALLINT > TINYINT

(4)　日付，時刻，および時刻印データの比較

日付，時刻，および時刻印データの比較は，Javaのjava.sql.Dateクラス，java.sql.Timeクラス，およびjava.sql.Timestampクラスの比較に準じます。

3.5　クエリ定義での注意事項および制限値

この節では，クエリを定義する際の注意事項と，クエリ定義での制限値について説明します。

＜この節の構成＞

3.5.1　クエリ定義での注意事項

3.5.2　クエリ定義での制限値

3.5.1　クエリ定義での注意事項

クエリ名およびストリーム名は，SDPサーバで一意になるように定義してください。登録済みの名前を定義した場合は，クエリグループの登録時にエラーになります。

あるクエリ定義ファイルで定義されたストリームまたはクエリについて，別のクエリ定義ファイルで定義されたクエリから参照することはできません。

3.5.2　クエリ定義での制限値

クエリ定義での制限値について次の表に示します。

表3-10　クエリ定義での制限値

項番 | 項目 | 値の範囲
1 | 1入力ファイルに記述できるCQLコマンド数 | 1～1,024
2 | 1CQLコマンドの長さ | 1～300,000文字
3 | 1ストリーム中の列数 | 1～3,000
4 | ストリームデータ1件の長さ（1行のサイズ） | 1～2,147,483,647バイト
5 | 名前の長さ（ストリーム名，リレーション名，クエリ名，列名，相関名） | 1～100文字
6 | 検索項目数（SELECT句の選択式の個数） | 1～3,000
7 | 列指定リスト | 1～255
8 | 探索条件内の比較述語および括弧の個数 | 1～255
9 | 1CQLクエリ中に指定できるストリームとリレーションの合計数 | 1～64
10 | ROWSウィンドウの生存する行数 | 1～100,000
11 | 時間指定 | SECOND | 1～2,678,400
12 | MILLISECOND | 1～86,400,000
13 | MINUTE | 1～44,640
14 | HOUR | 1～744
15 | DAY | 1～31

4.　CQLリファレンス

この章では，CQLの文法について説明します。

＜この章の構成＞

4.1　CQL文法説明で使用する記述形式

4.2　CQLの一覧

4.3　定義系CQL

4.4　操作系CQL

4.1　CQL文法説明で使用する記述形式

ここでは，CQL文法説明で使用する記述形式について説明します。

各CQLで説明する項目は次のとおりです。ただし，CQLによっては説明しない項目もあります。なお，CQLの文法で使用する記号については，「3.1.3　CQL文法説明で使用する記号」を参照してください。

形式

記述形式を説明しています。

機能

機能を説明しています。

オペランド

オペランドごとに，指定する項目や，どのような場合に指定するかを説明しています。

引数

引数ごとに，指定する項目や，どのような場合に指定するかを説明しています。

構文規則

構文規則を説明しています。

戻り値

関数の戻り値を説明しています。

注意事項

注意事項を説明しています。

使用例

使用例を説明しています。

4.2　CQLの一覧

CQLには，ストリームおよびクエリを定義するために使用する定義系CQLと，定義系CQLのREGISTER QUERY句やREGISTER QUERY_ATTRIBUTE句中に指定する操作系CQLがあります。

定義系CQLの一覧を次の表に示します。

表4-1　定義系CQLの一覧

項番 | CQL | 説明
1 | REGISTER STREAM句 | ストリームを定義します。
2 | REGISTER QUERY句 | クエリを定義します。
3 | REGISTER QUERY_ATTRIBUTE句 | クエリに時刻解像度を指定します。時刻解像度指定の対象となるクエリは，この句のあとに定義する必要があります。

操作系CQLの一覧を次の表に示します。

表4-2　操作系CQLの一覧

項番
種類
説明

1
問い合わせ
リレーションまたはREGISTER STREAM句で定義したストリームに対して，データの検索を実行します。

2
ストリーム句
出力されるデータをストリームに変換します。

3
リレーション式
一つ以上のリレーションからのデータ検索や検索結果のフィルタリングなどを実行します。

4
SELECT句
検索した結果を出力する項目（選択式）を指定します。検索結果はリレーションとして取得します。

5
FROM句
一つ以上のリレーション（リレーション参照）を指定します。FROM句で取得されるリレーションが，WHERE句またはHAVING句の対象となります。

6
WHERE句
FROM句によって取得されるリレーションに対する探索条件を指定します。

7
GROUP BY句
直前に指定する句によって取得されるリレーション中の列（グループ化列）を指定します。指定したグループ化列でグルーピングが実行されます。

8
HAVING句
FROM句，WHERE句，またはGROUP BY句によって取得されるリレーションに対して，探索条件を指定します。HAVING句の探索条件では，HAVING句中に指定した探索条件によって論理演算を実行し，真の結果だけをリレーションとして取得します。

9
UNION句
複数のSELECT句を結合して，一つのCQL文として実行します。

10
選択リスト
一つまたは複数の選択式を指定します。

11
選択式
検索結果として出力する項目を指定します。

12
列指定リスト
一つまたは複数の列を指定します。

13
リレーション参照
検索するリレーションを指定します。リレーション参照は，FROM句で指定します。

14
ウィンドウ指定
ストリームの生存期間を指定します。ウィンドウ指定は，リレーション参照で指定します。

15
時間指定
時間の単位を指定します。

16
探索条件
指定した条件に従って論理演算を実行し，真の結果だけをリレーションとして取得します。
探索条件は，WHERE句およびHAVING句で指定します。

17
比較述語
真または偽の論理値を与えるための条件を指定します。

18
値式
値を指定します。

19
定数
定数を指定します。

20
集合関数
複数行から算出される値を求めます。

21
組み込み集合関数

22
スカラ関数
単一行から算出される値を求めます。

23
組み込みスカラ関数

24
ストリーム間演算関数
ストリームデータ間の演算を行います。

25
外部定義ストリーム間演算関数

4.3　定義系CQL

ここでは定義系CQLについて説明します。

＜この節の構成＞

4.3.1　REGISTER STREAM句（ストリームの定義）

4.3.2　REGISTER QUERY句（クエリの定義）

4.3.3　REGISTER QUERY_ATTRIBUTE句（時刻解像度の指定）

4.3.1　REGISTER STREAM句（ストリームの定義）

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

REGISTER STREAM::=REGISTER▲STREAM▲＜ストリーム名＞
                                 ▲スキーマ指定文字列
   スキーマ指定文字列::='('＜列名＞▲＜型名＞〔,＜列名＞▲＜型名＞〕…')'

(2)　機能

ストリームを定義します。

ストリームは，ストリームの管理テーブルなどを格納する領域（システムカタログ）に登録され，同時にストリームの受付が開始されます。

(3)　オペランド

＜ストリーム名＞

ストリーム（入力ストリーム）の名称を，任意の名称で，ストリームデータ処理システム内で一意になるように指定します。名称の指定については，「3.2.4　名前の指定」を参照してください。

スキーマ指定文字列

ストリーム名で定義されるストリームに含まれる列名と，その型名を指定します。

＜列名＞

列名を任意の名称で，ストリームデータ処理システム内で一意になるように指定します。名称の指定については，「3.2.4　名前の指定」を参照してください。

列名に指定できる個数は，1～3,000個です。

＜型名＞

型名については，「3.3　CQLのデータ型」を参照してください。

(4)　構文規則

一つの定義で，スキーマ指定文字列をすべて指定してください。例えば，s1という名称でストリームを定義する場合は，次の例1で示すように，必要なスキーマ指定文字列をすべて指定します。

例1（正しい指定例）

REGISTER STREAM s1(id INT, name VARCHAR(10));

次の例2で示すように，s1という名称でストリームを定義する場合に，スキーマ指定文字列を分けて指定すると，同一名称のストリームの二重指定となるためエラーになります。

例2（誤った指定例）

REGISTER STREAM s1 (id INT);
REGISTER STREAM s1 (name VARCHAR(10));

(5)　注意事項

ありません。

(6)　使用例

スキーマとしてINT型の列id，および10個の文字データから構成される列nameを持つストリームs1をシステムカタログに登録します。

REGISTER STREAM s1(id INT, name VARCHAR(10));

4.3.2　REGISTER QUERY句（クエリの定義）

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

REGISTER QUERY::=REGISTER▲QUERY▲＜クエリ名＞▲＜問い合わせ＞

(2)　機能

クエリを定義します。

クエリは，クエリの管理テーブルなどを格納する領域（クエリリポジトリ）に登録され，同時にクエリ処理が開始されます。

(3)　オペランド

＜クエリ名＞

クエリの名称を任意の名称で，ストリームデータ処理システム内で一意になるように指定します。名称の指定については，「3.2.4　名前の指定」を参照してください。

ここで指定した名称は，問い合わせによって取得されるストリーム（出力ストリーム），またはリレーションの名称となります。

＜問い合わせ＞

問い合わせを定義します。定義内容については，「4.4.1　問い合わせ」を参照してください。

(4)　構文規則

一つの定義で，一つのクエリに対する問い合わせをすべて指定してください。例えば，q1としてクエリを定義する場合は，次の例1で示すように，必要な問い合わせをすべて指定します。

例1（正しい指定例）

REGISTER QUERY q1 SELECT s1.a, s1.b FROM s1[ROWS 10];

次の例2で示すように，q1として定義したクエリに対して，問い合わせを分けて指定すると，同一名称のクエリの二重指定となるためエラーになります。

例2（誤った指定例）

REGISTER QUERY q1 SELECT s1.a FROM s1[ROWS 10];
REGISTER QUERY q1 SELECT s1.b FROM s1[ROWS 10];

(5)　注意事項

ありません。

(6)　使用例

ストリームs1の列aのデータを出力するクエリq1を定義します。

REGISTER QUERY q1 SELECT s1.a FROM s1[ROWS 10];

4.3.3　REGISTER QUERY_ATTRIBUTE句（時刻解像度の指定）

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

REGISTER QUERY_ATTRIBUTE::=REGISTER▲QUERY_ATTRIBUTE▲＜クエリ名＞
                        ▲STREAM_NAME=＜データ識別子＞
                        ▲PERIOD=＜メッシュ間隔＞
                        ▲TARGETS=＜集合関数1＞'('＜列名1＞')',
                        …,＜集合関数N＞'('＜列名N＞')'

(2)　機能

クエリに時刻解像度を指定します。

(3)　オペランド

＜クエリ名＞

この句のあとに定義する時刻解像度指定の対象となるクエリ名を，ストリームデータ処理システム内で一意になるように指定します。名称の指定については，「3.2.4　名前の指定」を参照してください。

クエリ名は，ほかのREGISTER QUERY_ATTRIBUTE句で指定する名称と重複してはいけません。また，時刻解像度指定の対象となるクエリを定義するREGISTER QUERY句では，必ずRANGEウィンドウを指定してください。

＜データ識別子＞

時刻解像度を指定する列名が定義されている，ストリーム名またはクエリ名を指定します。指定するストリーム名またはクエリ名は，REGISTER QUERY_ATTRIBUTE句よりも前に定義されている必要があります。

＜メッシュ間隔＞

メッシュ間隔をミリ秒単位で任意に指定します。必ず，単位としてmsを記述してください。

100ミリ秒未満の値は設定できません。また，時刻解像度を指定するクエリ名の句に指定されるRANGEウィンドウの間隔がメッシュ間隔を超える場合は，メッシュ間隔はRANGEウィンドウの間隔に設定されます。

例えば，メッシュ間隔が1,000ミリ秒で，RANGEウィンドウの間隔が500ミリ秒の場合，メッシュ間隔は500ミリ秒に設定されます。また，メッシュ間隔がRANGEウィンドウより小さく，かつ86,400,000ミリ秒より大きい場合は，86,400,000ミリ秒に設定されます。

なお，100ミリ秒未満の値を指定した場合は，100ミリ秒に設定されます。

＜集合関数＞

集合関数を指定します。ここで指定できる集合関数を次の表に示します。

表4-3　指定できる集合関数

項番 | 集合関数 | 意味
1 | SUM | 合計値の計算に使用します。
2 | MAX | 最大値の計算に使用します。
3 | MIN | 最小値の計算に使用します。

指定できる集合関数の個数は，1～256個です。

＜列名＞

STREAM_NAMEで指定したデータ識別子が持つ列名を指定します。

列名は，重複してはいけません。

指定できる列名の個数は，1～256個です。

(4)　構文規則

ありません。

(5)　注意事項

REGISTER QUERY_ATTRIBUTE句では，クエリ名，データ識別子，列名がそれぞれ重複してはいけません。

STREAM_NAMEで指定するストリーム名またはクエリ名は，REGISTER QUERY_ATTRIBUTE句より前に定義しておくか，またはあらかじめ登録しておいてください。

TARGETSで指定する集合関数の引数に指定する列名は，データ識別子の列名に含まれている必要があります。

クエリ名，データ識別子，メッシュ間隔，集合関数，および列名に，特殊文字（セミコロンやピリオドなど）を含めてはいけません。

クエリ名，データ識別子，および列名として，「REGISTER」，「QUERY_ATTRIBUTE」，「STREAM_NAME」，「PERIOD」，「TARGETS」を指定してはいけません。

時刻解像度を指定するクエリの定義（REGISTER QUERY句）は，次の条件を満たす必要があります。

FROM句に複数のストリームを記述しない。

WHERE句を指定しない。

GROUP BY句を指定する。

REGISTER QUERY_ATTRIBUTE句のあとに定義する。

REGISTER QUERY_ATTRIBUTE句でTARGETS以下に指定する列名とSTREAM_NAMEに指定するデータ識別子の持つ列名は，1対1に対応させておく必要があります。また，時刻解像度を指定するクエリの列名とSTREAM_NAMEに指定するデータ識別子の持つ列名も，1対1に対応させる必要があります。
クエリq1に対して，時刻解像度を指定する場合を例に説明します。下線は，説明で示している個所です。

（正しい指定例）

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
SELECT name, price AS price0, price AS price1
FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1
STREAM_NAME=q0 PERIOD=300ms TARGETS=SUM(price0),MAX(price1);
REGISTER QUERY q1
ISTREAM(
SELECT q0.name, SUM(q0.price0) AS sum_price, MAX(q0.price1) AS max_price
FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);

「REGISTER QUERY q0」で指定した列名（price0，price1），「REGISTER QUERY_ATTRIBUTE q1」で指定した列名（price0，price1），「REGISTER QUERY q1」で指定した列名（price0，price1）が，1対1に対応しています。時刻解像度を指定する場合は，この例で示すように列名を対応させる必要があります。

（誤った指定例）

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
SELECT name, price AS price0, price AS price1, price AS price2, price AS price3
FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1
STREAM_NAME=q0 PERIOD=300ms TARGETS=SUM(price0),MAX(price1),MIN(price2);
REGISTER QUERY q1
ISTREAM(
SELECT q0.name, SUM(q0.price0) AS sum_price, MAX(q0.price1) AS max_price
FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);

「REGISTER QUERY q0」で指定した列名（price0，price1，price2，price3），「REGISTER QUERY_ATTRIBUTE q1」で指定した列名（price0，price1，price2），「REGISTER QUERY q1」で指定した列名（price0，price1）が，1対1に対応していないため，エラーとなります。

時刻解像度を指定したクエリでは，タプルをメッシュ間隔内で擬似タプルとして集約するため，集約結果の出力頻度が異なります。例えば，SUMを指定して集計する場合，集約した擬似タプルごとに結果が生成されるために，入力タプルごとに時々刻々と生成される結果の出力頻度とは異なります。

(6)　使用例

下線は，この例のポイントとなる個所です。

（例1）

RANGEウィンドウ内にあるタプルで，あらかじめ定義されているストリーム名stockの，列名priceの合計値を求めます。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=stock PERIOD=300ms TARGETS=SUM(price);
REGISTER QUERY q1
ISTREAM(
SELECT name, SUM (price) AS s1
FROM stock[RANGE 1 MINUTE]
GROUP BY name
);

REGISTER QUERY_ATTRIBUTE句で指定するクエリには，時刻解像度を指定するクエリq1を指定します。また，REGISTER STREAM句で定義したストリーム名stockの列名priceの合計を求めるため，データ識別子にstockを指定し，TARGETSにSUM(price)を指定します。なお，priceの合計値ではなく，最大値や最小値を求める場合には，MAX，MINを指定します。

（例2）

RANGEウィンドウ内にあるタプルで，あらかじめ定義されているストリーム名stockの，列名priceの合計値，最大値，最小値を求めます。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
SELECT name, price AS price0, price AS price1, price AS price2
FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=q0 PERIOD=300ms
TARGETS=SUM(price0),MAX(price1),MIN(price2);
REGISTER QUERY q1
ISTREAM(
SELECT q0.name, SUM(q0.price0) AS sum_price,
MAX(q0.price1) AS max_price, MIN(q0.price2) AS min_price
FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);

データ識別子stock，列名priceのクエリについて，複数の集合演算を実行する場合に，TARGETSに同一の列名priceは指定できません。例えば，「TARGETS=SUM(price), MAX(price), MIN(price)」のようには指定できません。

この場合，列名priceを合計値用，最大値用，最小値用にそれぞれ定義する必要があります。この例では，CQL文によって列名priceを置き換えた列名price0，price1，price2を持つデータ識別子（ここではq0）を定義しています。q0で定義した列名を使用してq1でそれぞれ演算を実行することで，複数の文の集合関数を実行できます。

4.4　操作系CQL

ここでは操作系CQLについて説明します。

＜この節の構成＞

4.4.1　問い合わせ

4.4.2　ストリーム句

4.4.3　リレーション式

4.4.4　SELECT句

4.4.5　FROM句

4.4.6　WHERE句

4.4.7　GROUP BY句

4.4.8　HAVING句

4.4.9　UNION句

4.4.10　選択リスト

4.4.11　選択式

4.4.12　列指定リスト

4.4.13　リレーション参照

4.4.14　ウィンドウ指定

4.4.15　時間指定

4.4.16　探索条件

4.4.17　比較述語

4.4.18　値式

4.4.19　定数

4.4.20　集合関数

4.4.21　組み込み集合関数

4.4.22　スカラ関数

4.4.23　組み込みスカラ関数

4.4.24　ストリーム間演算関数

4.4.25　外部定義ストリーム間演算関数

4.4.1　問い合わせ

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

問い合わせ::=｛＜リレーション式＞
            ｜｛＜ストリーム句＞'('＜リレーション式＞')'
            ｜＜ストリーム間演算関数＞｝｝

(2)　機能

リレーションまたはREGISTER STREAM句で定義したストリームに対して，データの検索を実行します。

(3)　オペランド

＜リレーション式＞

リレーション式の指定については，「4.4.3　リレーション式」を参照してください。

ストリーム句を指定しないでリレーション式を指定すると，問い合わせ結果はリレーションで取得されます。

＜ストリーム句＞

ストリーム句を指定する場合，ストリーム句に続けてリレーション式を括弧（(　)）で囲んで記述します。ストリーム句の指定については，「4.4.2　ストリーム句」を参照してください。

ストリーム句を指定すると，問い合わせ結果はストリームで取得されます。

＜ストリーム間演算関数＞

ストリーム間演算関数の指定については，「4.4.24　ストリーム間演算関数」を参照してください。

ストリーム間演算関数を指定すると，問い合わせ結果はストリームで取得されます。

(4)　構文規則

ありません。

(5)　注意事項

ありません。

(6)　使用例

リレーション式を指定し，ストリームs1の列aのデータをリレーションとして生成します。生成されたリレーションはリレーションq1として出力されます。下線部が問い合わせの部分です。

REGISTER QUERY q1 SELECT s1.a FROM s1[ROWS 10];

4.4.2　ストリーム句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

ストリーム句::=｛ISTREAM｜DSTREAM
              ｜RSTREAM〔'['＜整数定数＞〔▲＜時間指定＞〕']'〕｝

(2)　機能

出力されるデータをストリームに変換します。

(3)　オペランド

ISTREAM

出力リレーション内の増加分だけを出力します。

DSTREAM

出力リレーション内の減少分だけを出力します。

RSTREAM

出力リレーション内の集合すべてを一定間隔で出力します。

＜整数定数＞

時間の値そのものを指定します。整数定数の値の範囲については，「4.4.15　時間指定」を参照してください。

指定を省略した場合，指定値には1秒を仮定します。

＜時間指定＞

整数定数で指定した時間の単位を指定します。時間指定の指定については，「4.4.15　時間指定」を参照してください。

指定を省略した場合，整数定数で指定した値を秒単位として認識します。

(4)　構文規則

問い合わせに定義するストリーム句の詳細を記述します。ストリーム句のあとにリレーション式を括弧（(　)）で囲んで指定します。

(5)　注意事項

ありません。

(6)　使用例

リレーションs1の全データの増加時刻をタイムスタンプに持つストリームを生成します。生成されたストリームは，ストリームq1として出力されます。下線部がストリーム句の部分です。

REGISTER QUERY q1 ISTREAM (SELECT * FROM s1[ROWS 100]);

4.4.3　リレーション式

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

リレーション式::=＜SELECT句＞▲＜FROM句＞〔▲＜WHERE句＞〕
               〔▲＜GROUP BY句＞〔▲＜HAVING句＞〕〕〔▲＜UNION句＞〕

(2)　機能

一つ以上のリレーションからのデータ検索や検索結果のフィルタリングなどを実行します。

(3)　オペランド

＜SELECT句＞

SELECT句の指定については，「4.4.4　SELECT句」を参照してください。

＜FROM句＞

FROM句の指定については，「4.4.5　FROM句」を参照してください。

＜WHERE句＞

WHERE句の指定については，「4.4.6　WHERE句」を参照してください。

＜GROUP BY句＞

GROUP BY句の指定については，「4.4.7　GROUP BY句」を参照してください。

＜HAVING句＞

HAVING句の指定については，「4.4.8　HAVING句」を参照してください。

＜UNION句＞

UNION句の指定については，「4.4.9　UNION句」を参照してください。

(4)　構文規則

問い合わせのリレーション式の詳細を記述します。SELECT句，FROM句以降に検索方法やフィルタリング方法を指定します。

(5)　注意事項

ありません。

(6)　使用例

リレーションs1の列bの値が20より小さい列aのデータを出力します。下線部がリレーション式の部分です。

REGISTER QUERY q1 SELECT s1.a FROM s1[ROWS 100] WHERE s1.b < 20;

4.4.4　SELECT句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

SELECT句::=SELECT▲｛＜選択リスト＞｜*｝

(2)　機能

リレーションに対して検索した結果を出力する項目（選択式）を指定し，選択式をリレーションとして取得します。

(3)　オペランド

＜選択リスト＞

選択リストの指定については，「4.4.10　選択リスト」を参照してください。

*

リレーションのすべての列を出力します。

リレーション式のFROM句で指定したリレーションの順序に従い，すべての列を指定することを意味します。各リレーション中の列の順序は，ストリームを定義したときのスキーマ指定文字列，またはクエリを定義したときの選択リストに指定した順序です。

(4)　構文規則

ありません。

(5)　注意事項

ありません。

(6)　使用例

リレーションs1の全データを出力します。下線部がSELECT句の部分です。

REGISTER QUERY q1 SELECT * FROM s1[ROWS 10];

4.4.5　FROM句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

FROM句::=FROM▲＜リレーション参照＞〔,＜リレーション参照＞〕…

(2)　機能

一つ以上のリレーション（リレーション参照）を指定します。FROM句で取得されるリレーションが，WHERE句またはHAVING句の対象となります。

WHERE句およびHAVING句を指定しない場合は，FROM句で取得されるリレーションがSELECT句の対象となります。

複数のリレーションを指定した場合，指定したリレーションの順序で各リレーションから1行ずつ組み合わせて連結された行が，FROM句で取得されるリレーションの行になります。行数は，各リレーションの行数の積になります。

(3)　オペランド

＜リレーション参照＞

リレーション参照の指定については，「4.4.13　リレーション参照」を参照してください。

指定できるリレーション参照の個数は，1～64個です。

(4)　構文規則

ありません。

(5)　注意事項

FROM句で取得されるリレーションは，グループ化列を持たない一つのグループになります。

(6)　使用例

取得するリレーションs1を指定します。下線部がFROM句の部分です。

REGISTER QUERY q1 SELECT * FROM s1[ROWS 100];

4.4.6　WHERE句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

WHERE句::＝WHERE▲＜探索条件＞

(2)　機能

FROM句によって取得されるリレーションに対する探索条件を指定します。

WHERE句を指定し，かつHAVING句を指定しない場合は，WHERE句によって取得されるリレーションがSELECT句の対象となります。

WHERE句を省略すると，FROM句で取得されるリレーションに含まれるすべての行がSELECT句の対象となります。

(3)　オペランド

＜探索条件＞

探索条件の指定については，「4.4.16　探索条件」を参照してください。

先行するFROM句のリレーション参照が一つの場合，探索条件には列名だけを指定します。FROM句のリレーション参照が複数の場合，探索条件に指定する各列名は，データ識別子と列名を指定して，一意にしなければいけません。

(4)　構文規則

先行するFROM句で取得したリレーションをtとした場合，探索条件はtのそれぞれの行に適用されます。WHERE句で取得されるリレーションは，探索条件の結果が真となる，tの行の集合で構成されるリレーションです。

(5)　注意事項

WHERE句で取得されるリレーションは，グループ化列を持たない一つのグループになります。

(6)　使用例

リレーションs1の列bの値が10より大きい列a，bのデータを出力します。下線部がWHERE句の部分です。

REGISTER QUERY q1 SELECT s1.a,s1.b FROM s1[ROWS 100] WHERE s1.b > 10;

4.4.7　GROUP BY句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

GROUP BY句::=GROUP▲BY▲＜列指定リスト＞

(2)　機能

直前に指定する句によって取得されるリレーション中の列（グループ化列）を指定します。指定したグループ化列でグルーピングが実行されます。

グルーピングでは，GROUP BY句で指定した列の値が同一の行をグルーピングして，グループ単位に1行にまとめて出力します。

(3)　オペランド

＜列指定リスト＞

列指定リストの指定については，「4.4.12　列指定リスト」を参照してください。

列指定リストに指定する列指定は，同じ列指定を重複して指定できません。また，先行するFROM句のリレーション参照が一つの場合，列指定リストには列名だけを指定します。FROM句のリレーション参照が複数の場合，列指定リストに指定する各列名は，データ識別子と列名を指定して，一意にしなければいけません。

(4)　構文規則

ありません。

(5)　注意事項

リレーション式にGROUP BY句を指定した場合，SELECT句中の選択式にはGROUP BY句で指定された要素（グループ化列の名称）以外の列指定または列名を一次子とする値式は指定できません。

(6)　使用例

リレーションs1の列b，cをグループ化し，列a，b，cのデータを出力します。下線部がGROUP BY句の部分です。

REGISTER QUERY q1 SELECT s1.b,s1.c
                 FROM s1[ROWS 100] GROUP BY s1.b,s1.c;

4.4.8　HAVING句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

HAVING句::=HAVING▲＜探索条件＞

(2)　機能

FROM句，WHERE句，またはGROUP BY句によって取得されるリレーションに対して，探索条件を指定します。HAVING句の探索条件では，HAVING句中に指定した探索条件によって論理演算を実行し，真の結果だけをリレーションとして取得します。

HAVING句を指定する場合は，HAVING句によって取得されるリレーションがSELECT句の対象となります。

(3)　オペランド

＜探索条件＞

探索条件の指定については，「4.4.16　探索条件」を参照してください。

探索条件中に列指定を指定する場合は，グループ化列を指定するか，または集合関数の引数として指定してください。グループ化列については，「4.4.7　GROUP BY句」，集合関数については「4.4.20　集合関数」を参照してください。

(4)　構文規則

HAVING句中に指定した探索条件の結果が真となるグループが選択されます。

(5)　注意事項

HAVING句を省略すると，先行するGROUP BY句，またはFROM句の結果の全グループが選択されます。

(6)　使用例

リレーションs1の列b，cをグループ化し，列aの平均値が10より大きい列a，b，cのデータを出力します。下線部がHAVING句の部分です。

REGISTER QUERY q1 SELECT AVG(s1.a) AS a1,s1.b,s1.c FROM s1[ROWS 100]
                 GROUP BY s1.b,s1.c HAVING AVG(s1.a) > 10;

4.4.9　UNION句

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

UNION句::=UNION▲〔ALL▲〕＜リレーション式＞

(2)　機能

複数のSELECT句を結合して，一つのCQL文として実行します。

(3)　オペランド

ALL

指定した場合，行の重複を許可します。

ALLを指定しないでUNIONを指定した場合，行を重複排除します。

重複排除とは，検索結果に重複した行（選択式で指定した項目で一つ以上の行を構成し，その行が同一のもの）が存在する場合，重複した行を排除し，一つの行と見なして出力することをいいます。

＜リレーション式＞

リレーション式の指定については，「4.4.3　リレーション式」を参照してください。

(4)　構文規則

次の二つの条件を満たすクエリは，構文エラーになります。

UNION ALLオペランドを使用している

複数のSELECT句で，FROM句に同一ストリームまたはリレーションを一つだけ指定している

構文エラーとなる例を次に示します。下線部がエラーになる個所です。

REGISTER QUERY q1 ISTREAM(
   SELECT * FROM s1[RANGE 3 SECOND]
   UNION ALL SELECT * FROM s1[RANGE 5 SECOND]);

(5)　注意事項

UNION句で結合する場合，すべてのSELECT句の選択リストは，数，型，および文字データの文字数をすべて同じにしてください。

UNION句を持つリレーション式で取得されるリレーションの場合，1番目に指定したリレーション式（UNION句を除く）の結果として取得されるリレーションの列名が，問い合わせ後の結果として取得されるリレーションの列名になります。
詳細については，「3.2.5(2)　列指定」を参照してください。

FROM句で指定するストリームデータが同一の場合，入力したすべての列をそのまま出力するSELECT句をUNION ALLで結合することはできません。
誤った例を次に示します。下線部が該当するSELECT句です。

SELECT * FROM s1[RANGE 3 SECOND] UNION ALL SELECT * FROM s1[RANGE 5 SECOND];

どちらのSELECT句も同一のストリームs1を一つだけ入力し，オペランドに*を指定しているので，入力したすべての列をそのまま出力し，エラーとなります。

(6)　使用例

リレーションs1とリレーションs2の全データを出力します。下線部がUNION句の部分です。

REGISTER QUERY s1 SELECT * FROM s1[ROWS 100] UNION SELECT * FROM s2[ROWS 100];

4.4.10　選択リスト

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

選択リスト::=＜選択式＞〔,＜選択リスト＞〕

(2)　機能

一つまたは複数の選択式を指定します。

(3)　オペランド

＜選択式＞

選択式の指定については，「4.4.11　選択式」を参照してください。

指定できる選択式の個数は，1～3,000個です。

(4)　構文規則

SELECT句のあとに指定します。

(5)　注意事項

選択リストに指定できるのは，FROM句によって取得されたリレーションのデータだけです。

(6)　使用例

リレーションs1の列aおよびbのデータを出力します。下線部が選択リストの部分です。

REGISTER QUERY q1 SELECT s1.a, s1.b FROM s1[ROWS 100];

4.4.11　選択式

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

選択式::=｛｛＜列指定＞｜＜列名＞｝〔▲AS▲＜相関名＞〕
          ｜｛＜値式＞｜＜集合関数＞｝▲AS▲＜相関名＞｝

(2)　機能

検索結果として出力する項目を指定します。

(3)　オペランド

＜列指定＞

列指定については，「3.2.5(2)　列指定」を参照してください。

＜列名＞

後続のFROM句のリレーション参照が一つである場合，列名を指定できます。

後続のFROM句のリレーション参照が複数ある場合は，列指定を指定してください。

＜相関名＞

次のような場合に区別できる名称を指定します。

列名が重複する場合

列指定の名称が長く複雑である場合

値式が列名と列指定のどちらでもない場合

名称は名前の規則に従います。名前の規則の詳細については，「3.2.4　名前の指定」を参照してください。

相関名には，一つのSELECT句中に指定したほかの相関名と同じ名称は指定できません。また，ほかの範囲変数の表識別子と同じ名称も指定できません。範囲変数と表識別子については，「3.2.5　名前の修飾」を参照してください。

＜値式＞

値式については，「4.4.18　値式」を参照してください。

i番目の選択式に対して列名を指定した場合，リレーション式によって取得されるリレーションのi番目の列名は，指定した列名となります。i番目の選択式に対して列名を指定しない場合は，次のようになります。

列指定から取得された値式のとき，その列指定で指定した列名が，リレーション式によって取得されるリレーションのi番目の列名になります。

列指定以外から取得された値式のとき，相関名の指定が必要になります。

＜集合関数＞

集合関数の指定については，「4.4.20　集合関数」を参照してください。

集合関数の引数中には，列指定または列名を含める必要があります。

(4)　構文規則

選択式に指定した相関名は取得されるリレーションだけで利用できます。選択式の後続の句では利用できません。
例えば，次のように，q1から取得された相関名a1およびa2は，q2で利用できます。

（正しい指定例）

REGISTER QUERY q1 SELECT s1.c1 AS a1, s2.c1 AS a2 FROM s1[NOW], s2[NOW];
REGISTER QUERY q2 SELECT a1, a2 FROM q1 WHERE a1 > 1 GROUP BY a1, a2
   HAVING a2 > 1;

次のように，選択式に指定した相関名a1およびa2は，後続の句で利用できません。

（誤った指定例）

REGISTER QUERY q1 SELECT s1.c1 AS a1, s2.c1 AS a2 FROM s1[NOW], s2[NOW]
   WHERE a1 > 1 GROUP BY a1, a2 HAVING a2 > 1;

選択式に相関名を指定する場合は，ほかの選択式で使用した列名と異なる名称を指定します。

（正しい指定例）

REGISTER QUERY q1 SELECT s1.c1, s1.c2+1 AS a1 ～ ;

次の例では，ほかの選択式に使用しているc1を使用しているため，エラーになります。

（誤った指定例）

REGISTER QUERY q1 SELECT s1.c1, s1.c2+1 AS c1 ～ ;

(5)　注意事項

選択式に指定できるのは，定義済みのストリームのデータだけです。

(6)　使用例

リレーションs1の列aおよびbのデータを出力します。下線部が選択式の部分です。

REGISTER QUERY q1 SELECT s1.a, s1.b FROM s1[ROWS 100];

4.4.12　列指定リスト

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

列指定リスト::=＜列指定＞〔,＜列指定リスト＞〕

(2)　機能

一つ，または複数の列を指定します。

(3)　オペランド

＜列指定＞

列指定については，「3.2.5(2)　列指定」を参照してください。

指定できる列指定の個数は，1～255個です。

(4)　構文規則

列指定リストの構文規則については，「3.2.5(2)　列指定」を参照してください。

(5)　注意事項

列指定リストの注意事項については，「3.2.5(2)　列指定」を参照してください。

(6)　使用例

リレーションs1の列bおよびcをグループ化し，列a，b，およびcのデータを出力します。下線部が列指定リストの部分です。

REGISTER QUERY q1 SELECT SUM(s1.a) AS a1, s1.b, s1.c FROM s1[ROWS 100]
                 GROUP BY s1.b, s1.c;

4.4.13　リレーション参照

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

リレーション参照::=｛＜リレーション名＞
                  ｜＜ストリーム名＞'['＜ウィンドウ指定＞']'｝
                  〔▲AS▲＜相関名＞〕

(2)　機能

検索するリレーションを指定します。リレーション参照は，FROM句で指定します。

(3)　オペランド

＜リレーション名＞

検索するリレーションの名称を指定します。

リレーション名に指定できるのは，問い合わせ結果をストリーム句でストリーム化しないで取得した場合のクエリ名です。

＜ストリーム名＞

検索するストリームの名称を指定します。

ストリーム名に指定できるのは，問い合わせ結果をストリーム句でストリーム化して取得した場合のクエリ名です。

＜ウィンドウ指定＞

ウィンドウ指定については，「4.4.14　ウィンドウ指定」を参照してください。

＜相関名＞

リレーション参照の名称が長く複雑である場合，別名として指定します。名称は名前の規則に従います。名前の規則の詳細については，「3.2.4　名前の指定」を参照してください。

相関名には，一つのSELECT句中に指定したほかの相関名と同じ名称は指定できません。また，ほかの表識別子と同じ名称も指定できません。表識別子については，「3.2.5　名前の修飾」を参照してください。

(4)　構文規則

リレーション参照は，FROM句で指定します。

リレーション参照に指定した相関名は一つのクエリ文の中でだけ有効です。複数のクエリ文にわたる利用はできません。
例えば，次のように，リレーション参照に指定した相関名a1およびa2は，一つのクエリ文の中で利用できます。

（正しい指定例）

REGISTER QUERY q1 SELECT a1.c1, a2.c1 FROM s1[NOW] AS a1, s2[NOW] AS a2
                WHERE a1.c1 > 1 GROUP BY a1.c1, a2.c1
                HAVING a2.c1 > 1;

次の例では，q2でリレーション参照に指定したq1から相関名a1およびa2は取得されないため，利用できません。

（誤った指定例）

REGISTER QUERY q1 SELECT a1.c1, a2.c1 FROM s1[NOW] AS a1, s2[NOW] AS a2;
REGISTER QUERY q2 SELECT a1.c1, a2.c1 FROM q1 WHERE a1.c1 > 1
                 GROUP BY a1.c1, a2.c1 HAVING a2.c1 > 1;

リレーション参照に指定する相関名には，ストリーム名およびクエリ名と異なる名称を指定します。
次の例では，相関名に指定したs2はストリーム名として定義されているので指定できません。

（誤った指定例）

REGISTER STREAM s1 (id INT, name VARCHAR(10));
REGISTER STREAM s2 (id INT, name VARCHAR(10));
REGISTER QUERY q1 SELECT * FROM s1[NOW] AS s2;

次の例では，相関名に指定したq1はクエリ名として定義されているので指定できません。

（誤った指定例）

REGISTER QUERY q1 SELECT * FROM s1[NOW];
REGISTER QUERY q2 SELECT * FROM s2[NOW] AS q1;

リレーション参照に同一名称のストリームを指定する場合は，次のように相関名を指定して一意に識別できるようにします。

（正しい指定例）

REGISTER QUERY q1 ISTREAM(
   SELECT ～ FROM s1[RANGE 5] AS old, s1[NOW] AS new ～);

次の例では，ストリームが一意に識別できないため，エラーになります。

（誤った指定例）

REGISTER QUERY q1 ISTREAM(
   SELECT ～ FROM s1[RANGE 5], s1[NOW] ～);

(5)　注意事項

ありません。

(6)　使用例

リレーションs1の列aおよびbのデータを出力します。下線部がリレーション参照の部分です。

REGISTER QUERY q1 SELECT s1.a, s1.b FROM s1[ROWS 100];

4.4.14　ウィンドウ指定

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

ウィンドウ指定::=｛ROWS▲＜整数定数＞
                 ｜RANGE▲＜整数定数＞〔▲＜時間指定＞〕
                 ｜NOW
                 ｜PARTITION▲BY▲＜列指定リスト＞▲ROWS▲＜整数定数＞｝

(2)　機能

ストリームの生存期間を指定します。ウィンドウ指定は，リレーション参照で指定します。

(3)　オペランド

ROWS

生存する行数として，1～100,000の値を指定します。

RANGE

生存する時間を指定します。時刻解像度を指定するクエリでは，必ずRANGEを指定してください。

＜整数定数＞

時間の値を指定します。整数定数の値の範囲については，「4.4.15　時間指定」を参照してください。

＜時間指定＞

整数定数で指定した時間の単位を指定します。時間指定の指定については，「4.4.15　時間指定」を参照してください。

指定を省略した場合，整数定数で指定した値は秒単位の値として認識されます。

NOW

生存する時間を現時刻だけにします。

PARTITION BY

列指定リストで指定した列名の値ごとにROWSの処理をします。

＜列指定リスト＞

列指定リストの指定については，「4.4.12　列指定リスト」を参照してください。

列指定リストには，列名の指定ができます。

(4)　構文規則

ありません。

(5)　注意事項

ROWSに生存する行数の値の範囲を超えた値を指定した場合，その最大値が仮定され，処理が継続されます。

ROWSを指定した場合に，生存する行数の値が0のときは，その最小値が仮定され，処理が継続されます。負または整数定数以外の場合，エラーになります。

(6)　使用例

使用例1

リレーションs1のストリームの生存期間を2秒間に指定します。下線部がウィンドウ指定の部分です。

REGISTER QUERY q1 SELECT * FROM s1[RANGE 2 SECOND];

使用例2

リレーションs1のストリームを列aの値ごとに生存する行を2に指定します。下線部がウィンドウ指定の部分です。

REGISTER QUERY q1 SELECT * FROM s1[PARTITION BY s1.a ROWS 2];

4.4.15　時間指定

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

時間指定::=｛SECOND｜MILLISECOND｜MINUTE｜HOUR｜DAY｝

(2)　機能

時間の単位を指定します。

(3)　オペランド

SECOND

時間の単位として，秒を指定します。

MILLISECOND

時間の単位として，ミリ秒を指定します。

MINUTE

時間の単位として，分を指定します。

HOUR

時間の単位として，時間を指定します。

DAY

時間の単位として，日を指定します。

(4)　構文規則

時間の値そのものは，時間指定とは別に，整数定数で指定します。時間指定と整数定数の関係を次の表に示します。

表4-4　時間指定と整数定数の関係

項番 | 時間指定（時間の単位を指定） | 整数定数（時間の値を指定）
オペランド | 意味 | 最小値 | 最大値
1 | SECOND | 秒 | 1 | 2678400​
2 | MILLISECOND | ミリ秒 | 1 | 86400000​
3 | MINUTE | 分 | 1 | 44640
4 | HOUR | 時 | 1 | 744
5 | DAY | 日 | 1 | 31

(5)　注意事項

時間指定の値の範囲を超えた値を整数定数に指定した場合，その最大値を仮定し処理を継続します。

時間指定の値として，整数定数に0を指定した場合，最小値である1を仮定し処理を継続します。負または整数定数以外の値を指定した場合，エラーになります。

(6)　使用例

リレーションs1のストリームの生存期間を2秒間に指定します。下線部が時間指定の部分です。

REGISTER QUERY q1 SELECT * FROM s1[RANGE 2 SECOND];

4.4.16　探索条件

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

HAVING句の場合

探索条件::=比較述語〔▲AND▲＜探索条件＞〕

WHERE句の場合

探索条件::=｛｛'('＜探索条件＞')'｜＜比較述語＞｝
          ｜NOT｛▲₀'('＜探索条件＞')'｜▲＜比較述語＞｝
          ｜＜探索条件＞▲OR▲｛'('＜探索条件＞')'｜＜比較述語＞｝
          ｜＜探索条件＞▲AND▲｛'('＜探索条件＞')'｜＜比較述語＞｝｝

(2)　機能

指定した条件に従って論理演算を実行し，真の結果だけをリレーションとして取得します。

探索条件は，WHERE句およびHAVING句で指定します。

(3)　オペランド

＜比較述語＞

比較述語の指定については，「4.4.17　比較述語」を参照してください。

(4)　構文規則

探索条件は，WHERE句またはHAVING句に指定します。句によって指定できる論理演算が異なります。指定できる論理演算を次の表に示します。

表4-5　指定できる論理演算

項番 | 論理演算 | WHERE句 | HAVING句
1 | AND | 指定できます。 | 指定できます。
2 | NOT | 指定できます。 | 指定できません。
3 | OR | 指定できます。 | 指定できません。

(5)　注意事項

WHERE句の指定には，次の制限があります。

論理演算子ORは，二つの項の比較述語がすべて同一リレーションであるときだけ指定できます。

論理演算子NOTは，その右単項の比較述語がすべて同一リレーションであるときだけ利用できます。

なお，複数リレーションは指定できません。s1, s2がスキーマ(c1 INT, c2 INT, c3 INT)であるリレーションのときの例を次に示します。

（正しい指定例：同一リレーションのORを指定）

s1.c1 < 1 OR s1.c2 < 1

（誤った指定例：複数リレーションのORを指定）

s1.c1 < 1 OR s2.c1 < 1

（正しい指定例：同一リレーションのNOTを指定）

NOT(s1.c1 < 1) AND NOT(s2.c1 < 1)

（誤った指定例：複数リレーションのNOTを指定）

NOT((s1.c1 < 1) AND (s2.c1 <1))

（正しい指定例：同一リレーションのORとNOTを指定）

(s1.c1 < 1 OR s1.c2 < 1) AND NOT(s2.c1 < 1)

（誤った指定例：複数リレーションのORとNOTを指定）

s1.c1 < 1 OR s1.c2 < 1 AND NOT(s2.c1 < 1)…

論理演算の評価順序は，括弧内，NOT，AND，ORの順です。例えば，次の二つの演算は同じ意味になります。

s1.c1 < 1 OR (s1.c2 < 1 AND NOT (s1.c3 < 3))
s1.c1 < 1 OR (s1.c2 < 1 AND s1.c3 >= 3)

探索条件の括弧（(　)）は，省略できます。

探索条件内に指定できる比較述語および括弧の個数は，1～255個です。個数の数え方の例を次に示します。

NOT c1>1
　：比較述語がc1>1の一つだけなので，個数は1になります。
NOT(c1>1)
　：比較述語がc1>1の一つ，括弧が一組なので，個数は2になります。
c1>1 AND c2>1
　：比較述語がc1>1，c2>1の二つなので個数は2になります。
(c1>1) AND (c2>1)
　：比較述語がc1>1，c2>1の二つ，括弧が二組なので，個数は4になります。

(6)　使用例

リレーションs1の列aの値が5より小さく，1より大きいものを出力します。下線部が探索条件の部分です。

REGISTER QUERY q1 SELECT * FROM s1[ROWS 100] WHERE s1.a < 5 AND s1.a > 1;

4.4.17　比較述語

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

WHERE句の場合

比較述語::=＜値式＞ 比較演算子 ＜値式＞
   比較演算子::=｛<｜<=｜>｜>=｜=｜!=｝

HAVING句の場合

比較述語::=比較演算項 比較演算子 比較演算項
   比較演算項::=｛＜列指定＞｜＜列名＞｜＜スカラ関数＞｜＜集合関数＞｜＜定数＞｝
   比較演算子::=｛<｜<=｜>｜>=｜=｜!=｝

(2)　機能

真，または偽の論理値を与えるための条件を指定します。

(3)　オペランド

＜値式＞

値式の指定については，「4.4.18　値式」を参照してください。

比較演算子

比較演算項を比較するための比較演算子として，「<」，「<=」，「>」，「>=」，「=」，または「!=」を指定します。

比較演算項

比較対象の項として，列指定，スカラ関数，集合関数，または定数を指定します。

なお，先行するFROM句のリレーション参照が一つであれば，その比較演算項では列名の指定ができます。

＜列指定＞

列指定については，「3.2.5(2)　列指定」を参照してください。

＜列名＞

後続のFROM句のリレーション参照が一つである場合，列名を指定できます。

後続のFROM句のリレーション参照が複数ある場合は，列指定を指定してください。

＜スカラ関数＞

スカラ関数の指定については，「4.4.22　スカラ関数」を参照してください。

＜集合関数＞

集合関数の指定については，「4.4.20　集合関数」を参照してください。

＜定数＞

定数については，「4.4.19　定数」を参照してください。

(4)　構文規則

比較述語を「比較演算項X　比較演算子　比較演算項Y」として，比較演算子の意味を次の表に示します。

表4-6　比較演算子の種類と機能

項番 | 比較演算子の指定 | 意味
1 | 比較演算項X=比較演算項Y | 比較演算項Xと比較演算項Yが等しいことを示します。
2 | 比較演算項X!=比較演算項Y | 比較演算項Xと比較演算項Yが等しくないことを示します。
3 | 比較演算項X<比較演算項Y | 比較演算項Xが比較演算項Yより小さいことを示します。
4 | 比較演算項X<=比較演算項Y | 比較演算項Xが比較演算項Y以下であることを示します。
5 | 比較演算項X>比較演算項Y | 比較演算項Xが比較演算項Yより大きいことを示します。
6 | 比較演算項X>=比較演算項Y | 比較演算項Xが比較演算項Y以上であることを示します。

左右の比較演算項のデータは，比較できるデータ型にしてください。比較できるデータ型については，「3.4　データの比較」を参照してください。

数データ同士の比較で，比較するデータの型が異なる場合，範囲の広い方の型で比較します。範囲の広さを次に示します。

DECIMAL = NUMERIC > FLOAT = DOUBLE > REAL > BIGINT > INTEGER > SMALLINT > TINYINT

(5)　注意事項

定数と定数の比較はできません。比較した場合，エラーになります。

比較演算項または値式のどちらかに，列指定または列名を含める必要があります。

比較述語に指定する値式では，異なるデータ識別子の四則演算はできません。例えば，次のような指定はできません。

WHERE s1.a + s2.a < 5

(6)　使用例

リレーションs1の列aの値が5より小さいものを出力します。下線部が比較述語の部分です。

REGISTER QUERY q1 SELECT * FROM s1[RANGE 10 SECOND] WHERE s1.a < 5;

4.4.18　値式

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

値式::=〔符号〕項〔演算子〔符号〕項〕…
   項::=〔キャスト指定〕値式一次子
   演算子::=｛+｜-｜*｜/｝
   符号::=｛+｜-｝
   キャスト指定::=｛'('TINYINT')'｜'('SMALLINT')'｜'('INT〔EGER〕')'
                  ｜'('BIGINT')'｜'('REAL')'｜'('FLOAT')'｜'('DOUBLE')'
                  ｜'('DEC〔IMAL〕')'｝
   値式一次子::=｛＜列指定＞｜＜列名＞｜＜定数＞｜＜スカラ関数＞｜'('＜値式＞')'｝

(2)　機能

値を指定します。

(3)　オペランド

符号

「+」または「-」を指定します。

項

キャスト指定，および値式一次子を指定します。

キャスト指定

キャスト指定に指定するデータ型については，「3.3　CQLのデータ型」を参照してください。

値式一次子

列指定，列名，定数，スカラ関数，または値式を指定します。

＜列指定＞

列指定については，「3.2.5(2)　列指定」を参照してください。

＜列名＞

後続のFROM句のリレーション参照が一つである場合，列名を指定できます。

後続のFROM句のリレーション参照が複数ある場合は，列指定を指定してください。

＜定数＞

定数については，「4.4.19　定数」を参照してください。

＜スカラ関数＞

スカラ関数の指定については，「4.4.22　スカラ関数」を参照してください。

演算子

「+」，「-」，「*」，または「/」を指定します。演算子の後ろに符号を指定した項を指定する場合，その項は括弧で囲む必要があります。符号と演算子の例を次に示します。

-a+(-b)
a*(-b+1)
a/(-b)+1

(4)　構文規則

値式中に四則演算子を指定することで，四則演算ができます。

値式の結果のデータ型は，四則演算または値式一次子の結果と同じデータ型になります。また，データ構造も四則演算または値式一次子の結果と同じになります。

四則演算（2項演算）は数データで行います。演算中に数データ以外のデータ型（文字データや時刻データなど）を含めることはできません。含めた場合はエラーとなります。
数データでは，異なるデータ型間で演算できます。データ型と演算結果のデータ型の関係を次の表に示します。

表4-7　四則演算（2項演算）の演算項のデータ型と演算結果のデータ型の関係

項番 | 第1演算項データ型 | 第2演算項データ型
TINYINT | SMALLINT | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
1 | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
2 | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
3 | INTEGER | INTEGER | INTEGER | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
4 | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
5 | REAL | REAL | REAL | REAL | REAL | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC
6 | FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | DECIMAL | NUMERIC
7 | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DECIMAL | NUMERIC
8 | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL
9 | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC

DECIMAL型またはNUMERIC型を含む演算の場合，DECIMAL型またはNUMERIC型以外のデータ型の値は，次のパラメーターの値に従って丸められ，DECIMAL型（NUMERIC型）の値に変換されて演算されます。

system_config.propertiesのquery.decimalMaxPrecision
精度を指定するパラメーターです。

system_config.propertiesのquery.decimalRoundingMode
丸め方を指定するパラメーターです。

また，演算結果も同様に丸められます。

(5)　注意事項

演算途中でオーバーフローが発生した場合，処理は継続されます。このとき，整数であればオーバーフローしたままの値（入りきれない上位バイトをカットし，下位バイトをそのまま使用する）となり，浮動小数点値であれば無限大になります。ただし，DECIMAL型またはNUMERIC型の値と，浮動小数点値との演算で，浮動小数点値でオーバーフローが発生した場合は，エラー（クエリグループが閉塞）になります。

除算で第2演算項の値に0を指定した場合は，エラーになります。

文字データおよび文字列定数に対する演算は，エラーになります。

日付/時刻データ（文字列定数を含む）に対するキャストは，エラーになります。

文字データの場合，文字データの書式が数データに合うものだけがキャストできます。文字データの書式については，「3.4　データの比較」を参照してください。

DECIMAL型にキャストした場合，次のパラメーターの値に従って丸められ，DECIMAL型に変換されます。

system_config.propertiesのquery.decimalMaxPrecision
精度を指定するパラメーターです。

system_config.propertiesのquery.decimalRoundingMode
丸め方を指定するパラメーターです。

(6)　使用例

リレーションs1の列aをDECIMAL型にキャストした値と，列bをINT型にキャストした値を出力します。下線部が値式の部分です。

REGISTER QUERY q1 SELECT (DECIMAL)s1.a AS xxx, (INT)s1.b AS yyy FROM s1[ROWS 100];

4.4.19　定数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

定数::=｛文字列定数｜数定数｝
   文字列定数::=｛＜日付データ＞｜＜時刻データ＞｜
                  ＜時刻印データ＞｜＜文字列＞｝
   数定数::=｛＜整数定数＞｜＜浮動小数点定数＞｜＜10進定数＞｝

(2)　機能

定数を指定します。一つ以上の値を指定できます。

(3)　オペランド

文字列定数

日付データ，時刻データ，時刻印データ，または文字列を指定します。データ型はVARCHAR型です。

＜日付データ＞

日付データの指定については，「3.2.6(2)　日付データの規定の文字列表現」を参照してください。

＜時刻データ＞

時刻データの指定については，「3.2.6(3)　時刻データの規定の文字列表現」を参照してください。

＜時刻印データ＞

時刻印データの指定については，「3.2.6(4)　時刻印データの規定の文字列表現」を参照してください。

＜文字列＞

文字列の指定については，「3.2.6(1)　定数の種類と表記方法」を参照してください。

数定数

整数定数，浮動小数点定数または10進定数を指定します。

＜整数定数＞

整数定数のデータ型は，数字の末尾にLまたはlを指定するとBIGINT型になります。数字だけを指定すると，INTEGER型になります。

整数定数の指定については，「3.2.6(1)　定数の種類と表記方法」を参照してください。

＜浮動小数点定数＞

浮動小数点定数のデータ型はDOUBLE型です。

浮動小数点定数の指定については，「3.2.6(1)　定数の種類と表記方法」を参照してください。

＜10進定数＞

10進定数のデータ型はDECIMAL型またはNUMERIC型です。

10進定数の指定については，「3.2.6(1)　定数の種類と表記方法」を参照してください。

(4)　構文規則

ありません。

(5)　注意事項

文字列にエスケープ文字はありません。文字列にタブを入れた場合や途中で改行した場合は，その文字コードが文字列定数に埋め込まれます。

値がオーバーフローした浮動小数点定数はエラーになりません。値は無限大になります。

値がDECIMAL型（NUMERIC型）の上下限値の範囲外となった10進定数はエラーになりません。値はCQLで記述した値で表現されます。

(6)　使用例

リレーションs1の列aの値に-5.3を加算し，列bに4を乗じた結果を出力します。下線部が定数の部分です。

REGISTER QUERY q1 SELECT -5.3+s1.a AS xxx, 4*s1.b AS xxy FROM s1[ROWS 100];

4.4.20　集合関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

集合関数::=｛COUNT'('＜値式＞｜*')'｜一般集合関数｜＜組み込み集合関数＞｝
   一般集合関数::=｛MAX｜MIN｜SUM｜AVG｝'('＜値式＞')'

(2)　機能

複数行から算出される値を求めます。

(3)　オペランド

COUNT

入力行数を求めます。

＜値式＞

集合関数の引数を指定します。値式については，「4.4.18　値式」を参照してください。

*

すべての行数を求めます。

一般集合関数

MAX，MIN，SUM，AVGのどれかを指定します。引数中には，列指定を含む値式を指定してください。

MAX

最大値を求める集合関数です。

MIN

最小値を求める集合関数です。

SUM

合計値を求める集合関数です。

AVG

平均値を求める集合関数です。

＜組み込み集合関数＞

組み込み集合関数の指定については，「4.4.21　組み込み集合関数」を参照してください。

(4)　構文規則

一般集合関数には，引数にALL（全件取得）を制御する修飾子は存在しません。すべてALLで動作します。

集合関数は，その集合関数が含まれるリレーション式の選択式中，またはHAVING句中に指定してください。

FROM句，WHERE句，およびGROUP BY句のうち，最後に指定された句で取得されるリレーションを集合関数の入力とします。ただし，GROUP BY句を指定しない場合，FROM句またはWHERE句の結果がグループ化列を持たない一つのグループとなります。

リレーション式のSELECT句の選択式に集合関数および列指定，または列名を指定する場合は，GROUP BY句を適用します。

集合関数の引数の型（列のデータ型）と結果の型の対応は，次の表に示すとおりです。

表4-8　集合関数の引数の型と結果の型の対応

項番 | 引数の型 | 集合関数
COUNT(引数) | MAX(引数) | MIN(引数) | SUM(引数) | AVG(引数)
1 | INTEGER | INTEGER | INTEGER | INTEGER | INTEGER | INTEGER
2 | SMALLINT | INTEGER | SMALLINT | SMALLINT | SMALLINT | SMALLINT
3 | TINYINT | INTEGER | TINYINT | TINYINT | TINYINT | TINYINT
4 | BIGINT | INTEGER | BIGINT | BIGINT | BIGINT | BIGINT
5 | DECIMAL | INTEGER | DECIMAL | DECIMAL | DECIMAL | DECIMAL
6 | NUMERIC | INTEGER | NUMERIC | NUMERIC | NUMERIC | NUMERIC
7 | REAL | INTEGER | REAL | REAL | REAL | REAL
8 | FLOAT | INTEGER | FLOAT | FLOAT | FLOAT | FLOAT
9 | DOUBLE | INTEGER | DOUBLE | DOUBLE | DOUBLE | DOUBLE
10 | CHAR | INTEGER | CHAR | CHAR | － | －
11 | VARCHAR | INTEGER | VARCHAR | VARCHAR | － | －
12 | DATE | INTEGER | DATE | DATE | － | －
13 | TIME | INTEGER | TIME | TIME | － | －
14 | TIMESTAMP | INTEGER | TIMESTAMP | TIMESTAMP | － | －

（凡例）

－：使用できません。

この表で，集合関数の引数の型がTINYINTの場合，集合関数AVGには，入力行数が128以上になる引数を指定しないでください。また，引数の型がSMALLINTの場合，入力行数が32,768以上になる引数を指定しないでください。

(5)　注意事項

演算途中でオーバーフローが発生した場合は処理を継続します。このとき，整数であればオーバーフローしたままの値（入りきれない上位バイトをカットし，下位バイトをそのまま使用する）となり，浮動小数点値であれば無限大になります。ただし，DECIMAL型またはNUMERIC型の値と，浮動小数点値との演算で，浮動小数点値でオーバーフローが発生した場合は，エラー（クエリグループが閉塞）になります。

(6)　使用例

リレーションs1の列aの行数を出力します。下線部が集合関数の部分です。

REGISTER QUERY q1 SELECT COUNT(s1.a) AS a1 FROM s1[ROWS 100];

4.4.21　組み込み集合関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

組み込み集合関数::=＜統計関数＞

(2)　機能

「4.4.20　集合関数」に指定する組み込み集合関数を指定します。

(3)　オペランド

＜統計関数＞

統計関数の指定については，「5.2　統計関数の詳細」を参照してください。

(4)　構文規則

組み込み集合関数の構文規則は，集合関数の構文規則と同じです。「4.4.20　集合関数」の構文規則を参照してください。

(5)　注意事項

クエリに記述した組み込み集合関数の形式に不正がある場合，クエリグループの登録に失敗します。

組み込み集合関数は，演算方法について特に説明がない場合，差分演算を行います。このため，組み込み集合関数の計算量は一定で，入力リレーションのタプル数に比例しません。

このほかの組み込み集合関数の注意事項は，集合関数の注意事項と同じです。「4.4.20　集合関数」の注意事項を参照してください。

(6)　使用例

リレーションs1の列a，bの相関係数を出力します。下線部が組み込み集合関数の部分です。

REGISTER QUERY q1 SELECT CORREL(s1.a, s1.b) AS a1 FROM s1[ROWS 100];

4.4.22　スカラ関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

スカラ関数::=＜組み込みスカラ関数＞

(2)　機能

単一行から算出される値を求めます。

(3)　オペランド

＜組み込みスカラ関数＞

組み込みスカラ関数の指定については，「4.4.23　組み込みスカラ関数」を参照してください。

(4)　構文規則

比較述語の左辺または右辺では，スカラ関数の引数の列指定で，すべて同じデータ識別子の列を指定する必要があります。

(5)　注意事項

ありません。

(6)　使用例

リレーションs1の列aの絶対値を出力します。下線部がスカラ関数の部分です。

REGISTER QUERY q1 SELECT DABS(s1.a) AS a1 FROM s1[ROWS 100];

4.4.23　組み込みスカラ関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

組み込みスカラ関数::=｛＜数学関数＞｜＜文字列関数＞｜＜時刻関数＞｜＜変換関数＞｝

(2)　機能

「4.4.22　スカラ関数」に指定する組み込みスカラ関数を指定します。

(3)　オペランド

＜数学関数＞

数学関数の指定については，「5.3　数学関数の詳細」を参照してください。

＜文字列関数＞

文字列関数の指定については，「5.4　文字列関数の詳細」を参照してください。

＜時刻関数＞

時刻関数の指定については，「5.5　時刻関数の詳細」を参照してください。

＜変換関数＞

変換関数の指定については，「5.6　変換関数の詳細」を参照してください。

(4)　構文規則

FLOAT型はDOUBLE型のシノニムのため，引数の値式の結果がFLOAT型の場合，引数はDOUBLE型として扱います。

CQLで次の個所に指定できます。

SELECT句の選択式

WHERE句

HAVING句

(5)　注意事項

数学関数の演算途中でオーバーフローが発生した場合は，浮動小数点値は無限大になります。

整数値の0除算が発生した場合は，クエリグループが閉塞します。

正規表現を使用する文字列関数で，指定した正規表現の構文に誤りがある場合は，正規表現の解析ができないため，クエリグループが閉塞します。

クエリに記述した組み込みスカラ関数の形式に不正がある場合は，クエリグループの登録に失敗します。

(6)　使用例

リレーションs1の列aの正弦値を出力します。下線部が組み込みスカラ関数の部分です。

REGISTER QUERY q1 SELECT DSIN(s1.a) AS a1 FROM s1[ROWS 100];

4.4.24　ストリーム間演算関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

ストリーム間演算関数::=＜外部定義ストリーム間演算関数＞

(2)　機能

ストリームデータ間の演算を行います。

(3)　オペランド

＜外部定義ストリーム間演算関数＞

外部定義ストリーム間演算関数の指定については，「4.4.25　外部定義ストリーム間演算関数」を参照してください。

(4)　構文規則

ありません。

(5)　注意事項

ありません。

(6)　使用例

「4.4.25　外部定義ストリーム間演算関数」の使用例を参照してください。

4.4.25　外部定義ストリーム間演算関数

＜この項の構成＞

(1)　形式

(2)　機能

(3)　オペランド

(4)　構文規則

(5)　注意事項

(6)　使用例

(1)　形式

外部定義ストリーム間演算関数::=$*＜関数グループ名＞.＜関数名＞
          〔'['＜定数＞〔,＜定数＞〕…']'〕
          '('＜ストリーム名＞〔,＜ストリーム名＞〕…')'
          〔▲AS▲'('＜相関名＞〔,＜相関名＞〕…')'〕

(2)　機能

「4.4.24　ストリーム間演算関数」に指定する外部定義ストリーム間演算関数を指定します。

(3)　オペランド

$*

外部定義ストリーム間演算関数であることを示す記号です。

＜関数グループ名＞

外部定義ストリーム間演算関数の実装クラスを定義するグループ（関数グループ）の名称（外部定義関数定義ファイルのFunctionGroupタグのname属性の指定値）を指定します。

＜関数名＞

外部定義ストリーム間演算関数の実装メソッドを識別する関数の名称（外部定義関数定義ファイルのStreamFunctionタグのname属性の指定値）を指定します。

＜定数＞

外部定義ストリーム間演算関数に設定する初期化パラメーターを定数で指定します。定数については，「4.4.19　定数」を参照してください。

定数に指定できる個数は，0～16個です。

＜ストリーム名＞

外部定義ストリーム間演算関数の入力ストリーム名を指定します。

ストリーム名に指定できる個数は，1～16個です。

＜相関名＞

ストリーム間演算関数の使用個所ごとに，出力ストリームの列名を区別して指定したい場合に，列名の別名を指定します。なお，外部定義ストリーム間演算関数の定義数（外部定義関数定義ファイルのReturnInformationタグの数）と合わせる必要があります。

相関名に指定できる個数は，0～3,000個です。

(4)　構文規則

相関名を指定した場合，後続のクエリの列指定または列名では，相関名を指定してください。外部定義関数定義ファイルで指定した列名（ReturnInformationタグのname属性）は使用できません。

(5)　注意事項

ストリーム名として指定できるのは，登録されたストリーム名（REGISTER STREAM句に指定）と問い合わせの結果を，ストリーム句または別のストリーム間演算関数でストリーム化して取得したクエリ名です。

定数で指定するパラメーターは，実装クラスのコンストラクターの引数で渡されます。なお，定数で指定するパラメーターの型（CQLのデータ型）と，実装クラスのコンストラクターの引数の型（Javaのデータ型）のマッピングについては，「3.3.1　CQLのデータ型とJavaのデータ型のマッピング」を参照してください。定数で指定するパラメーターは，「3.2.6(1)　定数の種類と表記方法」の定数の表記方法に従って，CQLのデータ型として解釈されます。

相関名で指定する名称は名前の規則に従います。名前の規則の詳細については，「3.2.4　名前の指定」を参照してください。相関名には，同一の外部定義ストリーム間演算関数内で一意の名称を指定してください。

(6)　使用例

ストリームs1のデータを外部定義ストリーム間演算関数に渡し，結果をストリームq1として出力します。下線部が外部定義ストリーム間演算関数の部分です。

REGISTER QUERY q1 $*FG1.STREAM_FUNC[10,1.0,'efg'](s1) AS (ca,cb,cc,cd,ce);

5.　CQLで指定する組み込み関数

この章では，CQLで指定する組み込み関数の文法について説明します。

なお，文法説明で使用する記述形式については，「4.1　CQL文法説明で使用する記述形式」を参照してください。

＜この章の構成＞

5.1　組み込み関数の一覧

5.2　統計関数の詳細

5.3　数学関数の詳細

5.4　文字列関数の詳細

5.5　時刻関数の詳細

5.6　変換関数の詳細

5.1　組み込み関数の一覧

組み込み関数には，組み込み集合関数と組み込みスカラ関数があります。それぞれの一覧を次の表に示します。

表5-1　組み込み集合関数の一覧

関数の分類 | 関数名
統計関数 | CORREL関数
COVAR関数
COVAR_POP関数
STDDEV関数
STDDEV_POP関数
VAR関数
VAR_POP関数

表5-2　組み込みスカラ関数の一覧

関数の分類 | 関数名
数学関数 | ABS関数
ACOS関数
ASIN関数
ATAN関数
ATAN2関数
CEIL関数
COS関数
COSH関数
DISTANCE関数
DISTANCE3関数
EXP関数
FLOOR関数
LN関数
LOG関数
MOD関数
NAN関数
NEGATIVE_INFINITY関数
PI関数
POSITIVE_INFINITY関数
POWER関数
ROUND関数
SIN関数
SINH関数
SQRT関数
TAN関数
TANH関数
TODEGREES関数
TORADIANS関数
文字列関数 | CONCAT関数
LENGTH関数
LEQ関数
LGE関数
LGT関数
LLE関数
LLT関数
REGEXP_FIRSTSEARCH関数
REGEXP_REPLACE関数
REGEXP_SEARCH関数
SPLENGTH関数
時刻関数 | TIMEDIFF関数
TIMESTAMPDIFF関数
変換関数 | BIGINT_TOSTRING関数
DECIMAL_TOSTRING関数
DOUBLE_TOSTRING関数
INT_TOSTRING関数
NUMBER_TODATE関数
NUMBER_TOTIME関数
REAL_TOSTRING関数
TIME_TONUMBER関数
TIMESTAMP_TONUMBER関数

5.2　統計関数の詳細

ここでは，「4.4.21　組み込み集合関数」で指定する統計関数について説明します。

＜この節の構成＞

統計関数

CORREL関数

COVAR関数

COVAR_POP関数

STDDEV関数

STDDEV_POP関数

VAR関数

VAR_POP関数

統計関数

形式

統計関数::=＜統計関数名＞'('〔＜値式＞ 〔,＜値式＞〕…〕')'

機能

統計関数は，複数行から成る集合の数値を入力し，統計データを分析する数値を求めます。

オペランド

＜統計関数名＞

統計関数の名称です。統計関数の一覧を次の表に示します。

表5-3　統計関数の一覧

関数名 | 説明
CORREL関数 | ピアソンの相関係数を算出します。
COVAR関数 | 標本共分散を算出します。
COVAR_POP関数 | 母集団共分散を算出します。
STDDEV関数 | 標準偏差を算出します。
STDDEV_POP関数 | 母集団標準偏差を算出します。
VAR関数 | 分散を算出します。
VAR_POP関数 | 母集団分散を算出します。

＜値式＞

値式の指定については，「4.4.18　値式」を参照してください。なお，値式の個数は関数によって異なります。統計関数の各関数の説明を参照してください。

使用例

DOUBLE型の値S1.HEIGHTとS1.WEIGHTから相関係数を算出します。

register query FILTER ISTREAM (
 SELECT CORREL(S1.HEIGHT,S1.WEIGHT)
 FROM S1[ROWS 10] GROUP BY S1.HEIGHT, S1.WEIGHT );

CORREL関数

形式

CORREL '('＜value1＞,＜value2＞')'

機能

次に示す計算式に従ってピアソンの相関係数を算出します。

引数

＜value1＞

独立した変数（value2）に従属する変数を値式で指定します。

＜value2＞

独立した変数を値式で指定します。

戻り値

相関係数を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
CORREL | value1 | DOUBLE | DOUBLE
FLOAT
value2 | DOUBLE
FLOAT

value1，value2のどちらかが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，yiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，非数（NaN）を返します。

COVAR関数

形式

COVAR'('＜value1＞,＜value2＞')'

機能

次に示す計算式に従って標本共分散を算出します。

引数

＜value1＞

独立した変数（value2）に従属する変数を値式で指定します。

＜value2＞

独立した変数を値式で指定します。

戻り値

標本共分散を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
COVAR | value1 | DOUBLE | DOUBLE
FLOAT
value2 | DOUBLE
FLOAT

value1，value2のどちらかが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値，yiの合計値のどちらかが正の無限大（Infinity）で，かつxiyiの積算結果の合計値が正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値，yiの合計値のどちらかが負の無限大（-Infinity）で，かつxiyiの積算結果の合計値が負の無限大（-Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，非数（NaN）を返します。

COVAR_POP関数

形式

COVAR_POP'('＜value1＞,＜value2＞')'

機能

次に示す計算式に従って母集団共分散を算出します。

引数

＜value1＞

独立した変数（value2）に従属する変数を値式で指定します。

＜value2＞

独立した変数を値式で指定します。

戻り値

母集団共分散を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
COVAR_POP | value1 | DOUBLE | DOUBLE
FLOAT
value2 | DOUBLE
FLOAT

value1，value2のどちらかが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値，yiの合計値のどちらかが正の無限大（Infinity）で，かつxiyiの積算結果の合計値が正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値，yiの合計値のどちらかが負の無限大（-Infinity）で，かつxiyiの積算結果の合計値が負の無限大（-Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，正のゼロ（0.0）を返します。

STDDEV関数

形式

STDDEV'('＜value＞')'

機能

次に示す計算式に従って標準偏差を算出します。

引数

＜value＞

演算対象の数値を値式で指定します。

戻り値

標準偏差を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
STDDEV | value | DOUBLE | DOUBLE
FLOAT

valueが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，非数（NaN）を返します。

STDDEV_POP関数

形式

STDDEV_POP'('＜value＞')'

機能

次に示す計算式に従って母集団標準偏差を算出します。

引数

＜value＞

演算対象の数値を値式で指定します。

戻り値

母集団標準偏差を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
STDDEV_POP | value | DOUBLE | DOUBLE
FLOAT

valueが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，正のゼロ（0.0）を返します。

VAR関数

形式

VAR'('＜value＞')'

機能

次に示す計算式に従って分散を算出します。

引数

＜value＞

演算対象の数値を値式で指定します。

戻り値

分散を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
VAR | value | DOUBLE | DOUBLE
FLOAT

valueが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算方式で，xiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）で，かつxiの2乗の合計値が正の無限大（Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，非数（NaN）を返します。

VAR_POP関数

形式

VAR_POP'('＜value＞')'

機能

次に示す計算式に従って母集団分散を算出します。

引数

＜value＞

演算対象の数値を値式で指定します。

戻り値

母集団分散を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

統計関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
VAR_POP | value | DOUBLE | DOUBLE
FLOAT

valueが非数（NaN），負の無限大（-Infinity），または正の無限大（Infinity）の場合は，非数（NaN）を返します。

上記の計算式で，xiの合計値が負の無限大（-Infinity），または正の無限大（Infinity）で，かつxiの2乗の合計値が正の無限大（Infinity）の場合は，非数（NaN）を返します。

注意事項

入力リレーションのタプル数が1の場合は，正のゼロ（0.0）を返します。

5.3　数学関数の詳細

ここでは，「4.4.23　組み込みスカラ関数」で指定する数学関数について説明します。

＜この節の構成＞

数学関数

ABS関数

ACOS関数

ASIN関数

ATAN関数

ATAN2関数

CEIL関数

COS関数

COSH関数

DISTANCE関数

DISTANCE3関数

EXP関数

FLOOR関数

LN関数

LOG関数

MOD関数

NAN関数

NEGATIVE_INFINITY関数

PI関数

POSITIVE_INFINITY関数

POWER関数

ROUND関数

SIN関数

SINH関数

SQRT関数

TAN関数

TANH関数

TODEGREES関数

TORADIANS関数

数学関数

形式

数学関数::=＜プリフィックス文字＞＜数学関数名＞'('〔＜値式＞ 〔,＜値式＞〕…〕')'

機能

数学関数は，数値を引数とし，演算した値を返します。

オペランド

＜プリフィックス文字＞

数学関数の戻り値のデータ型に対応したアルファベット1文字です。プリフィックス文字を次に示します。

表5-4　プリフィックス文字と戻り値のデータ型

プリフィックス文字 | 戻り値のデータ型
D | 倍精度実数型（DOUBLE／FLOAT）
R | 単精度実数型（REAL）
L | 倍精度整数型（BIGINT）
I | 単精度整数型（INTEGER）

＜数学関数名＞

数学関数の名称です。

数学関数名の前に，数学関数の戻り値のデータ型に対応したプリフィックス文字を指定してください。なお，プリフィックス文字と数学関数名の間に空白を入れることはできません。

数学関数の一覧を次の表に示します。

表5-5　数学関数の一覧

関数名 | 説明
ABS関数 | 絶対値を返します。
ACOS関数 | 逆余弦を返します。
ASIN関数 | 逆正弦を返します。
ATAN関数 | 逆正接を返します。
ATAN2関数 | 直交座標（x，y）から逆正接を返します。
CEIL関数 | 引数の値以上で，最も近い整数の浮動小数点値を返します。
COS関数 | 余弦を返します。
COSH関数 | 双曲線余弦を返します。
DISTANCE関数 | 2次元の2点間の距離を返します。
DISTANCE3関数 | 3次元の2点間の距離を返します。
EXP関数 | オイラー数の累乗値を返します。
FLOOR関数 | 引数の値以下で，最も近い整数の浮動小数点値を返します。
LN関数 | 自然対数値を返します。
LOG関数 | 対数値を返します。
MOD関数 | 剰余を返します。
NAN関数 | NaNを返します。
NEGATIVE_INFINITY関数 | 負の無限大（-Infinity）を返します。
PI関数 | πの近似値を返します。
POSITIVE_INFINITY関数 | 正の無限大（Infinity）を返します。
POWER関数 | 累乗値を返します。
ROUND関数 | 指定した小数点のけた数に四捨五入した値を返します。
SIN関数 | 正弦を返します。
SINH関数 | 双曲線正弦を返します。
SQRT関数 | 平方根を返します。
TAN関数 | 正接を返します。
TANH関数 | 双曲線正接を返します。
TODEGREES関数 | 度数に変換した値を返します。
TORADIANS関数 | ラジアンに変換した値を返します。

＜値式＞

値式については，「4.4.18　値式」を参照してください。なお，値式の個数は関数によって異なります。数学関数の各関数の説明を参照してください。

使用例

DOUBLE型の値S1.C1の絶対値が5.0と等しいタプルだけを出力します。DOUBLE型の絶対値を取得するため，数学関数名「ABS」の前にプリフィックス文字「D」を付けて，「DABS」と指定しています。

register query FILTER ISTREAM (
 SELECT *
 FROM S1[ROWS 10]
 WHERE DABS(S1.C1) = 5.0 );

ABS関数

形式

＜プリフィックス文字＞ABS '('＜value＞')'

機能

引数valueの絶対値を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ABS | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | Infinity
負の最小値 | 正の最大値
value<0 | valueの絶対値（符号を逆にした値）
負の最大値 | 正の最小値
-0.0（負のゼロ） | 0.0（正のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 正の最小値
0<value | value
正の最大値 | 正の最大値
Infinity | Infinity

注意事項

ありません。

ACOS関数

形式

＜プリフィックス文字＞ACOS '('＜value＞')'

機能

引数valueの逆余弦（アークコサイン）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ACOS | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<-1.0 | NaN
-1.0≦value≦1.0 | 0.0～πの範囲の値
1.0<value | NaN
正の最大値 | NaN
Infinity | NaN

注意事項

ありません。

ASIN関数

形式

＜プリフィックス文字＞ASIN '('＜value＞')'

機能

引数valueの逆正弦（アークサイン）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ASIN | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<-1.0 | NaN
-1.0≦value<-0.0 | -π/2～π/2の範囲の値
負の最大値 | -π/2～π/2の範囲の値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | -π/2～π/2の範囲の値
0.0<value≦1.0 | -π/2～π/2の範囲の値
1.0<value | NaN
正の最大値 | NaN
Infinity | NaN

注意事項

ありません。

ATAN関数

形式

＜プリフィックス文字＞ATAN '('＜value＞')'

機能

引数valueの逆正接（アークタンジェント）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ATAN | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -π/2
負の最小値 | 計算した逆正接の値（-π/2～π/2）
value<-0.0 | 計算した逆正接の値（-π/2～π/2）
負の最大値 | 計算した逆正接の値（-π/2～π/2）
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した逆正接の値（-π/2～π/2）
0.0<value | 計算した逆正接の値（-π/2～π/2）
正の最大値 | 計算した逆正接の値（-π/2～π/2）
Infinity | π/2

注意事項

ありません。

ATAN2関数

形式

＜プリフィックス文字＞ATAN2 '('＜valueX＞,＜valueY＞')'

機能

直交座標（valueX，valueY）から逆正接（アークタンジェント）を返します。

直交座標（valueX，valueY）を極座標（r，θ）に変換し，θ成分を返します。

引数

＜valueX＞

直交座標Xを値式で指定します。

＜valueY＞

直交座標Yを値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ATAN2 | valueX | DOUBLE | DOUBLE
FLOAT
valueY | DOUBLE
FLOAT

valueX，valueYの条件値と戻り値を次の表に示します。

valueXの値
valueYの値
戻り値

NaN
任意の値
NaN

-Infinity
NaN
NaN

-Infinity
-3π/4

負の最小値
-π

valueY<-0.0
-π

負の最大値
-π

-0.0（負のゼロ）
-π

0.0（正のゼロ）
π

正の最小値
π

0.0<valueY
π

正の最大値
π

Infinity
3π/4

負の最小値
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-3π/4の近似値）

valueY<-0.0
計算したθ成分（-πの近似値）

負の最大値
計算したθ成分（-πの近似値）

-0.0（負のゼロ）
-π

0.0（正のゼロ）
π

正の最小値
計算したθ成分（πの近似値）

0.0<valueY
計算したθ成分（πの近似値）

正の最大値
計算したθ成分（3π/4の近似値）

Infinity
π/2

valueX<-0.0
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-π/2の近似値）

valueY<-0.0
計算したθ成分

負の最大値
計算したθ成分（-πの近似値）

-0.0（負のゼロ）
-π

0.0（正のゼロ）
π

正の最小値
計算したθ成分（πの近似値）

0.0<valueY
計算したθ成分

正の最大値
計算したθ成分（π/2の近似値）

Infinity
π/2

負の最大値
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-π/2の近似値）

valueY<-0.0
計算したθ成分（-π/2の近似値）

負の最大値
計算したθ成分

-0.0（負のゼロ）
-π

0.0（正のゼロ）
π

正の最小値
計算したθ成分

0.0<valueY
計算したθ成分（π/2の近似値）

正の最大値
計算したθ成分（π/2の近似値）

Infinity
π/2

-0.0
（負のゼロ）
NaN
NaN

-Infinity
-π/2

負の最小値
-π/2

valueY<-0.0
-π/2

負の最大値
-π/2

-0.0（負のゼロ）
-π

0.0（正のゼロ）
π

正の最小値
π/2

0.0<valueY
π/2

正の最大値
π/2

Infinity
π/2

0.0
（正のゼロ）
NaN
NaN

-Infinity
-π/2

負の最小値
-π/2

valueY<-0.0
-π/2

負の最大値
-π/2

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
π/2

0.0<valueY
π/2

正の最大値
π/2

Infinity
π/2

正の最小値
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-π/2の近似値）

valueY<-0.0
計算したθ成分（-π/2の近似値）

負の最大値
計算したθ成分

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
計算したθ成分

0.0<valueY
計算したθ成分（π/2の近似値）

正の最大値
計算したθ成分（π/2の近似値）

Infinity
π/2

0.0<valueX
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-π/2の近似値）

valueY<-0.0
計算したθ成分

負の最大値
計算したθ成分

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
計算したθ成分

0.0<valueY
計算したθ成分

正の最大値
計算したθ成分（π/2の近似値）

Infinity
π/2

正の最大値
NaN
NaN

-Infinity
-π/2

負の最小値
計算したθ成分（-π/4の近似値）

valueY<-0.0
計算したθ成分

負の最大値
計算したθ成分（-0.0の近似値）

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
計算したθ成分（0.0の近似値）

0.0<valueY
計算したθ成分

正の最大値
計算したθ成分（π/4の近似値）

Infinity
π/2

Infinity
NaN
NaN

-Infinity
-π/4

負の最小値
-0.0（負のゼロ）

valueY<-0.0
-0.0（負のゼロ）

負の最大値
-0.0（負のゼロ）

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
0.0（正のゼロ）

0.0<valueY
0.0（正のゼロ）

正の最大値
0.0（正のゼロ）

Infinity
π/4

注意事項

ありません。

CEIL関数

形式

＜プリフィックス文字＞CEIL '('＜value＞')'

機能

引数valueの値以上で，最も近い整数の浮動小数点値を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | CEIL | value | DOUBLE | DOUBLE
FLOAT

valueが整数の場合は，valueと同じ値を返します。

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -Infinity
負の最小値 | 負の最小値
value≦-1.0 | valueの値以上で最も近い整数の浮動小数点値
-1.0<value<-0.0 | -0.0（負のゼロ）
負の最大値 | -0.0（負のゼロ）
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 1.0
0.0<value | valueの値以上で最も近い整数の浮動小数点値
正の最大値 | 正の最大値
Infinity | Infinity

注意事項

ありません。

COS関数

形式

＜プリフィックス文字＞COS'('＜value＞')'

機能

引数valueの余弦（コサイン）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | COS | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | 計算した余弦の値
value<-0.0 | 計算した余弦の値
負の最大値 | 1.0（計算した余弦の値）
-0.0（負のゼロ） | 1.0
0.0（正のゼロ） | 1.0
正の最小値 | 1.0（計算した余弦の値）
0.0<value | 計算した余弦の値
正の最大値 | 計算した余弦の値
Infinity | NaN

注意事項

ありません。

COSH関数

形式

＜プリフィックス文字＞COSH '('＜value＞')'

機能

引数valueの双曲線余弦を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | COSH | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | Infinity
負の最小値 | Infinity
value<-0.0 | 計算した双曲線余弦の値
負の最大値 | 1.0（計算した双曲線余弦の値）
-0.0（負のゼロ） | 1.0
0.0（正のゼロ） | 1.0
正の最小値 | 1.0（計算した双曲線余弦の値）
0.0<value | 計算した双曲線余弦の値
正の最大値 | Infinity
Infinity | Infinity

注意事項

ありません。

DISTANCE関数

形式

＜プリフィックス文字＞DISTANCE '('＜x1＞,＜y1＞,＜x2＞,＜y2＞')'

機能

2次元の2点（x1，y1），（x2，y2）間の距離を返します。

引数

＜x1＞

点（x1，y1）のx軸上の位置を値式で指定します。

＜y1＞

点（x1，y1）のy軸上の位置を値式で指定します。

＜x2＞

点（x2，y2）のx軸上の位置を値式で指定します。

＜y2＞

点（x2，y2）のy軸上の位置を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | DISTANCE | x1 | DOUBLE | DOUBLE
FLOAT
y1 | DOUBLE
FLOAT
x2 | DOUBLE
FLOAT
y2 | DOUBLE
FLOAT

x1，y1，x2，y2のどれかが非数（NaN）の場合は，非数（NaN）を返します。

x1，y1，x2，y2のどれかが正の無限大（Infinity），または負の無限大（-Infinity）で，かつそれ以外の引数が非数（NaN）でない場合は，正の無限大（Infinity）を返します。

注意事項

ありません。

DISTANCE3関数

形式

＜プリフィックス文字＞DISTANCE3 '('＜x1＞,＜y1＞,＜z1＞,＜x2＞,＜y2＞,＜z2＞')'

機能

3次元の2点（x1，y1，z1），（x2，y2，z2）間の距離を返します。

引数

＜x1＞

点（x1，y1，z1）のx軸上の位置を値式で指定します。

＜y1＞

点（x1，y1，z1）のy軸上の位置を値式で指定します。

＜z1＞

点（x1，y1，z1）のz軸上の位置を値式で指定します。

＜x2＞

点（x2，y2，z2）のx軸上の位置を値式で指定します。

＜y2＞

点（x2，y2，z2）のy軸上の位置を値式で指定します。

＜z2＞

点（x2，y2，z2）のz軸上の位置を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | DISTANCE3 | x1 | DOUBLE | DOUBLE
FLOAT
y1 | DOUBLE
FLOAT
z1 | DOUBLE
FLOAT
x2 | DOUBLE
FLOAT
y2 | DOUBLE
FLOAT
z2 | DOUBLE
FLOAT

x1，y1，z1，x2，y2，z2のどれかが非数（NaN）の場合は，非数（NaN）を返します。

x1，y1，z1，x2，y2，z2のどれかが正の無限大（Infinity），または負の無限大（-Infinity）で，かつそれ以外の引数が非数（NaN）でない場合は，正の無限大（Infinity）を返します。

注意事項

ありません。

EXP関数

形式

＜プリフィックス文字＞EXP'('＜value＞')'

機能

引数valueを指数としオイラー数eを累乗した値evalueを返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | EXP | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | 0.0
負の最小値 | 0.0（オイラー数eを累乗した値evalue）
value<-0.0 | オイラー数eを累乗した値evalue
負の最大値 | 1.0（オイラー数eを累乗した値evalue）
-0.0（負のゼロ） | 1.0
0.0（正のゼロ） | 1.0
正の最小値 | 1.0（オイラー数eを累乗した値evalue）
0.0<value | オイラー数eを累乗した値evalue
正の最大値 | Infinity
Infinity | Infinity

注意事項

ありません。

FLOOR関数

形式

＜プリフィックス文字＞FLOOR'('＜value＞')'

機能

引数valueの値以下で，最も近い整数の浮動小数点値を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | FLOOR | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -Infinity
負の最小値 | 負の最小値
value<-0.0 | valueの値以下で最も近い整数の浮動小数点値
負の最大値 | -1.0
-0.0（負のゼロ） | -0.0
0.0（正のゼロ） | 0.0
正の最小値 | 0.0
0.0<value | valueの値以下で最も近い整数の浮動小数点値
正の最大値 | 正の最大値
Infinity | Infinity

注意事項

ありません。

LN関数

形式

＜プリフィックス文字＞LN '('＜value＞')'

機能

引数valueの自然対数値を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | LN | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<-0.0 | NaN
負の最大値 | NaN
-0.0（負のゼロ） | -Infinity
0.0（正のゼロ） | -Infinity
正の最小値 | valueの自然対数値
0.0<value | valueの自然対数値
正の最大値 | valueの自然対数値
Infinity | Infinity

注意事項

ありません。

LOG関数

形式

＜プリフィックス文字＞LOG '('＜base＞,＜value＞')'

機能

引数baseを底とした引数valueの対数値を返します。戻り値は，logbasevalueの値となります。

引数

＜base＞

底を値式で指定します。

＜value＞

真数を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | LOG | base | DOUBLE | DOUBLE
FLOAT
value | DOUBLE
FLOAT

base，valueの条件値と戻り値を次の表に示します。

baseの値 | valueの値 | 戻り値
NaN | 任意の値 | NaN
-Infinity | 任意の値 | NaN
負の最小値 | 任意の値 | NaN
base<0.0 | 任意の値 | NaN
負の最大値 | 任意の値 | NaN
0.0 | 任意の値 | NaN
正の最小値 | NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<0.0 | NaN
負の最大値 | NaN
0.0 | Infinity
正の最小値 | 1.0
0.0<value<1.0 | logbasevalueの値
value=1.0 | -0.0（負のゼロ）
1.0<value | logbasevalueの値
正の最大値 | logbasevalueの値
Infinity | -Infinity
0.0<base<1.0 | NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<0.0 | NaN
負の最大値 | NaN
0.0 | Infinity
正の最小値 | logbasevalueの値
0.0<value<1.0 | logbasevalueの値
value=1.0 | -0.0（負のゼロ）
1.0<value | logbasevalueの値
正の最大値 | logbasevalueの値
Infinity | -Infinity
base=1.0 | 任意の値 | NaN
1.0<base | NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<0.0 | NaN
負の最大値 | NaN
0.0 | -Infinity
正の最小値 | logbasevalueの値
0.0<value<1.0 | logbasevalueの値
value=1.0 | 0.0
1.0<value | logbasevalueの値
正の最大値 | logbasevalueの値
Infinity | Infinity
正の最大値 | NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<0.0 | NaN
負の最大値 | NaN
0.0 | -Infinity
正の最小値 | logbasevalueの値
0.0<value<1.0 | logbasevalueの値
value=1.0 | 0.0
1.0<value | logbasevalueの値
正の最大値 | 1.0
Infinity | Infinity
Infinity | 任意の値 | NaN

注意事項

ありません。

MOD関数

形式

＜プリフィックス文字＞MOD '('＜value1＞,＜value2＞')'

機能

引数value1を引数value2で割ったあとの剰余を返します。

引数

＜value1＞

被除数を値式で指定します。

＜value2＞

除数を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
I | MOD | value1 | INTEGER | INTEGER
value2 | INTEGER

注意事項

value2が0と等しい場合，整数値の0除算が発生するため，クエリグループが閉塞します。

NAN関数

形式

＜プリフィックス文字＞NAN '()'

機能

NaNを返します。

引数

ありません。

戻り値

戻り値のデータ型を次の表に示します。

プリフィックス文字 | 数学関数名 | 戻り値のデータ型
D | NAN | DOUBLE

注意事項

ありません。

NEGATIVE_INFINITY関数

形式

＜プリフィックス文字＞NEGATIVE_INFINITY '()'

機能

負の無限大（-Infinity）を返します。

引数

ありません。

戻り値

戻り値のデータ型を次の表に示します。

プリフィックス文字 | 数学関数名 | 戻り値のデータ型
D | NEGATIVE_INFINITY | DOUBLE

注意事項

ありません。

PI関数

形式

＜プリフィックス文字＞PI '()'

機能

πの近似値を返します。

引数

ありません。

戻り値

戻り値のデータ型を次の表に示します。

プリフィックス文字 | 数学関数名 | 戻り値のデータ型
D | PI | DOUBLE

注意事項

ありません。

POSITIVE_INFINITY関数

形式

＜プリフィックス文字＞POSITIVE_INFINITY '()'

機能

正の無限大（Infinity）を返します。

引数

ありません。

戻り値

戻り値のデータ型を次の表に示します。

プリフィックス文字 | 数学関数名 | 戻り値のデータ型
D | POSITIVE_INFINITY | DOUBLE

注意事項

ありません。

POWER関数

形式

＜プリフィックス文字＞POWER '('＜base＞,＜value＞')'

機能

引数baseを引数valueで累乗した値を返します。戻り値は，basevalueの値となります。

引数

＜base＞

基数を値式で指定します。

＜value＞

指数を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | DPOWER | base | DOUBLE | DOUBLE
FLOAT
value | DOUBLE
FLOAT

演算結果がDOUBLE型，FLOAT型のデータの範囲外となる場合は，正の無限大（Infinity），または負の無限大（-Infinity）を返します。

base，valueの条件値と戻り値を次の表に示します。

baseの値
valueの値
戻り値

NaN
NaN
NaN

-Infinity
NaN

負の最小値
NaN

value<-0.0で小数
NaN

value<-0.0で偶数
NaN

value<-0.0で奇数
NaN

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
NaN（baseと同じ値）

0.0<valueで1以外の奇数
NaN

0.0<valueで偶数
NaN

0.0<valueで小数
NaN

正の最大値
NaN

Infinity
NaN

-Infinity
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）

value<-0.0で小数
0.0（正のゼロ）

value<-0.0で偶数
0.0（正のゼロ）

value<-0.0で奇数
-0.0（負のゼロ）

負の最大値
0.0（正のゼロ）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
Infinity

1.0
-Infinity（baseと同じ値）

0.0<valueで1以外の奇数
-Infinity

0.0<valueで偶数
Infinity

0.0<valueで小数
Infinity

正の最大値
Infinity

Infinity
Infinity

負の最小値
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）

value<-0.0で小数
NaN

value<-0.0で偶数
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

value<-0.0で1以外の奇数
-0.0（負のゼロ）
（baseの絶対値をvalueで累乗した負の値）

value=-1.0
baseの絶対値をvalueで累乗した負の値

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
負の最小値（baseと同じ値）

0.0<valueで1以外の奇数
-Infinity（baseの絶対値をvalueで累乗した負の値）

0.0<valueで偶数
Infinity（baseの絶対値をvalueで累乗した値）

0.0<valueで小数
NaN

正の最大値
Infinity（baseの絶対値をvalueで累乗した値）

Infinity
Infinity

-1.0<base<-0.0
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
NaN

value<-0.0で偶数
baseの絶対値をvalueで累乗した値

value<-0.0で奇数
baseの絶対値をvalueで累乗した負の値

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
baseと同じ値

0.0<valueで1以外の奇数
baseの絶対値をvalueで累乗した負の値

0.0<valueで偶数
baseの絶対値をvalueで累乗した値

0.0<valueで小数
NaN

正の最大値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

Infinity
0.0（正のゼロ）

base<-1.0
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
NaN

value<-0.0で偶数
baseの絶対値をvalueで累乗した値

value<-0.0で奇数
baseの絶対値をvalueで累乗した負の値

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
baseと同じ値

0.0<valueで1以外の奇数
baseの絶対値をvalueで累乗した負の値

0.0<valueで偶数
baseの絶対値をvalueで累乗した値

0.0<valueで小数
NaN

正の最大値
Infinity（baseの絶対値をvalueで累乗した値）

Infinity
Infinity

base=-1.0
NaN
NaN

-Infinity
NaN

負の最小値
1.0

value<-0.0で小数
NaN

value<-0.0で偶数
1.0

value<-0.0で奇数
-1.0

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
-1.0

0.0<valueで1以外の奇数
-1.0

0.0<valueで偶数
1.0

0.0<valueで小数
NaN

正の最大値
1.0

Infinity
NaN

負の最大値
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
NaN

value<-0.0で偶数
Infinity（baseの絶対値をvalueで累乗した値）

value<-0.0で奇数
-Infinity（baseの絶対値をvalueで累乗した負の値）

負の最大値
NaN

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
NaN

1.0
baseと同じ値

0.0<valueで1以外の奇数
-0.0（負のゼロ）
（baseの絶対値をvalueで累乗した負の値）

0.0<valueで偶数
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

0.0<valueで小数
NaN

正の最大値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

Infinity
0.0（正のゼロ）

-0.0（負のゼロ）
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity

value<-0.0で小数
Infinity

value<-0.0で偶数
Infinity

value<-0.0で奇数
-Infinity

負の最大値
Infinity

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
0.0（正のゼロ）

1.0
-0.0（baseと同じ値）

0.0<valueで1以外の奇数
-0.0（負のゼロ）

0.0<valueで偶数
0.0（正のゼロ）

0.0<valueで小数
0.0（正のゼロ）

正の最大値
0.0（正のゼロ）

Infinity
0.0（正のゼロ）

0.0（正のゼロ）
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity

value<-0.0で小数
Infinity

value<-0.0で偶数
Infinity

value<-0.0で奇数
Infinity

負の最大値
Infinity

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
0.0（正のゼロ）

1.0
0.0（baseと同じ値）

0.0<valueで1以外の奇数
0.0（正のゼロ）

0.0<valueで偶数
0.0（正のゼロ）

0.0<valueで小数
0.0（正のゼロ）

正の最大値
0.0（正のゼロ）

Infinity
0.0（正のゼロ）

正の最小値
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
baseの絶対値をvalueで累乗した値

value<-0.0で偶数
Infinity（baseの絶対値をvalueで累乗した値）

value<-0.0で奇数
Infinity（baseの絶対値をvalueで累乗した値）

負の最大値
1.0（baseの絶対値をvalueで累乗した値）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
1.0（baseの絶対値をvalueで累乗した値）

1.0
正の最小値（baseと同じ値）

0.0<valueで1以外の奇数
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

0.0<valueで偶数
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

0.0<valueで小数
baseの絶対値をvalueで累乗した値

正の最大値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

Infinity
0.0（正のゼロ）

1.0
NaN
NaN

-Infinity
NaN

負の最小値
1.0

value<-0.0で小数
1.0

value<-0.0で偶数
1.0

value<-0.0で奇数
1.0

負の最大値
1.0

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
1.0

1.0
1.0

0.0<valueで1以外の奇数
1.0

0.0<valueで偶数
1.0

0.0<valueで小数
1.0

正の最大値
1.0

Infinity
NaN

1.0<base
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
baseの絶対値をvalueで累乗した値

value<-0.0で偶数
baseの絶対値をvalueで累乗した値

value<-0.0で奇数
baseの絶対値をvalueで累乗した値

負の最大値
1.0（baseの絶対値をvalueで累乗した値）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
1.0
（baseの絶対値をvalueで累乗した値）

1.0
baseと同じ値

0.0<valueで1以外の奇数
baseの絶対値をvalueで累乗した値

0.0<valueで偶数
baseの絶対値をvalueで累乗した値

0.0<valueで小数
baseの絶対値をvalueで累乗した値

正の最大値
Infinity
（baseの絶対値をvalueで累乗した値）

Infinity
Infinity

0.0<base<1.0
NaN
NaN

-Infinity
Infinity

負の最小値
Infinity
（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
baseの絶対値をvalueで累乗した値

value<-0.0で偶数
baseの絶対値をvalueで累乗した値

value<-0.0で奇数
baseの絶対値をvalueで累乗した値

負の最大値
1.0（baseの絶対値をvalueで累乗した値）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
1.0（baseの絶対値をvalueで累乗した値）

1.0
baseと同じ値

0.0<valueで1以外の奇数
baseの絶対値をvalueで累乗した値

0.0<valueで偶数
baseの絶対値をvalueで累乗した値

0.0<valueで小数
baseの絶対値をvalueで累乗した値

正の最大値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

Infinity
0.0（正のゼロ）

正の最大値
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）
（baseの絶対値をvalueで累乗した値）

value<-0.0で小数
baseの絶対値をvalueで累乗した値

value<-0.0で偶数
baseの絶対値をvalueで累乗した値

value<-0.0で奇数
baseの絶対値をvalueで累乗した値

負の最大値
1.0（baseの絶対値をvalueで累乗した値）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
1.0（baseの絶対値をvalueで累乗した値）

1.0
baseと同じ値

0.0<valueで1以外の奇数
Infinity（baseの絶対値をvalueで累乗した値）

0.0<valueで偶数
Infinity（baseの絶対値をvalueで累乗した値）

0.0<valueで小数
baseの絶対値をvalueで累乗した値

正の最大値
Infinity（baseの絶対値をvalueで累乗した値）

Infinity
Infinity

Infinity
NaN
NaN

-Infinity
0.0（正のゼロ）

負の最小値
0.0（正のゼロ）

value<-0.0で小数
0.0（正のゼロ）

value<-0.0で偶数
0.0（正のゼロ）

value<-0.0で奇数
0.0（正のゼロ）

負の最大値
0.0（正のゼロ）

-0.0（負のゼロ）
1.0

0.0（正のゼロ）
1.0

正の最小値
Infinity

1.0
Infinity

0.0<valueで1以外の奇数
Infinity

0.0<valueで偶数
Infinity

0.0<valueで小数
Infinity

正の最大値
Infinity

Infinity
Infinity

注意事項

ありません。

ROUND関数

形式

＜プリフィックス文字＞ROUND '('＜value＞,＜scale＞')'

機能

引数valueの値を，引数scaleで指定した小数点けた数に丸めた値（scale＋1の小数点位置で四捨五入した値）にして返します。

引数

＜value＞

丸め対象の数値を値式で指定します。

＜scale＞

小数点以下のけた数を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | ROUND | value | DOUBLE | DOUBLE
FLOAT
scale | INTEGER

DOUBLE型，FLOAT型の有効けた数は，16～17けたです。このため，value，scaleの指定が有効けた数に収まらない場合，有効けた数に丸めた数値を返します。
DROUND('4235678.28571437218732731273',10)の場合，戻り値として，4235678.285714372を返します。
DROUND('1.28571445674562133729372137',20)の場合，戻り値として，1.2857144567456213を返します。

valueが非数（NaN），正の無限大（Infinity），負の無限大（-Infinity）の場合，処理が継続できないため，クエリグループが閉塞します。

注意事項

ありません。

SIN関数

形式

＜プリフィックス文字＞SIN '('＜value＞')'

機能

引数valueの正弦（サイン）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | SIN | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | 計算した正弦の値
value<-0.0 | 計算した正弦の値
負の最大値 | 計算した正弦の値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した正弦の値
0.0<value | 計算した正弦の値
正の最大値 | 計算した正弦の値
Infinity | NaN

注意事項

ありません。

SINH関数

形式

＜プリフィックス文字＞SINH '('＜value＞')'

機能

引数valueの双曲線正弦を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | SINH | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -Infinity
負の最小値 | -Infinity（計算した双曲線正弦の値）
value<-0.0 | 計算した双曲線正弦の値
負の最大値 | 計算した双曲線正弦の値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した双曲線正弦の値
0.0<value | 計算した双曲線正弦の値
正の最大値 | Infinity（計算した双曲線正弦の値）
Infinity | Infinity

注意事項

ありません。

SQRT関数

形式

＜プリフィックス文字＞SQRT '('＜value＞')'

機能

引数valueの正の平方根を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | SQRT | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | NaN
value<-0.0 | NaN
負の最大値 | NaN
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した正の平方根
0.0<value | 計算した正の平方根
正の最大値 | 計算した正の平方根
Infinity | Infinity

注意事項

ありません。

TAN関数

形式

＜プリフィックス文字＞TAN '('＜value＞')'

機能

引数valueの正接（タンジェント）を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | TAN | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | NaN
負の最小値 | 計算した正接の値
value<-0.0 | 計算した正接の値
負の最大値 | 計算した正接の値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した正接の値
0.0<value | 計算した正接の値
正の最大値 | 計算した正接の値
Infinity | NaN

注意事項

ありません。

TANH関数

形式

＜プリフィックス文字＞TANH '('＜value＞')'

機能

引数valueの双曲線正接を返します。

引数

＜value＞

値式を指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | TANH | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -1.0
負の最小値 | -1.0（計算した双曲線正接の値）
value<-0.0 | 計算した双曲線正接の値
負の最大値 | 計算した双曲線正接の値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 計算した双曲線正接の値
0.0<value | 計算した双曲線正接の値
正の最大値 | 1.0（計算した双曲線正接の値）
Infinity | 1.0

注意事項

ありません。

TODEGREES関数

形式

＜プリフィックス文字＞TODEGREES'('＜value＞')'

機能

ラジアンで計測した角度を度数に変換した値を返します。

なお，ラジアンから度数への変換は，正確ではありません。例えば，TORADIANS(90.0)は，浮動小数で変換するため，正確なπ/2になりません。そのため，COS(TORADIANS(90.0))は，正確に0.0になりません。

引数

＜value＞

ラジアンで計測した角度を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | TODEGREES | value | DOUBLE | DOUBLE
FLOAT

度数への変換結果がDOUBLE型，FLOAT型のデータの範囲外の場合は，正の無限大（Infinity），または負の無限大（-Infinity）を返します。

valueの条件値と戻り値を次の表に示します。

valueの値 | 戻り値
NaN | NaN
-Infinity | -Infinity
負の最小値 | -Infinity（度数に変換した値）
value<-0.0 | 度数に変換した値
負の最大値 | 度数に変換した値
-0.0（負のゼロ） | -0.0（負のゼロ）
0.0（正のゼロ） | 0.0（正のゼロ）
正の最小値 | 度数に変換した値
0.0<value | 度数に変換した値
正の最大値 | Infinity（度数に変換した値）
Infinity | Infinity

注意事項

ありません。

TORADIANS関数

形式

＜プリフィックス文字＞TORADIANS'('＜value＞')'

機能

度数で計測した角度をラジアンに変換した値を返します。

なお，度数からラジアンへの変換は正確ではありません。

引数

＜value＞

度数で計測した角度を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

プリフィックス文字 | 数学関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
D | TORADIANS | value | DOUBLE | DOUBLE
FLOAT

valueの条件値と戻り値を次の表に示します。

valueの値
戻り値

NaN
NaN

-Infinity
-Infinity

負の最小値
ラジアンに変換した値

value<-0.0
ラジアンに変換した値

負の最大値
-0.0（負のゼロ）
（ラジアンに変換した値）

-0.0（負のゼロ）
-0.0（負のゼロ）

0.0（正のゼロ）
0.0（正のゼロ）

正の最小値
0.0（正のゼロ）
（ラジアンに変換した値）

0.0<value
ラジアンに変換した値

正の最大値
ラジアンに変換した値

Infinity
Infinity

注意事項

ありません。

5.4　文字列関数の詳細

ここでは，「4.4.23　組み込みスカラ関数」で指定する文字列関数について説明します。

＜この節の構成＞

文字列関数

CONCAT関数

LENGTH関数

LEQ関数

LGE関数

LGT関数

LLE関数

LLT関数

REGEXP_FIRSTSEARCH関数

REGEXP_REPLACE関数

REGEXP_SEARCH関数

SPLENGTH関数

文字列関数

形式

文字列関数::=＜文字列関数名＞'('＜値式＞ 〔,＜値式＞〕…')'

機能

文字列関数は，文字列を引数とし，検索または操作した結果を返します。

オペランド

＜文字列関数名＞

文字列関数の名称です。文字列関数の一覧を次の表に示します。

表5-6　文字列関数の一覧

関数名 | 機能内容
CONCAT関数 | 二つの引数の文字列を結合した文字列を返します。
LENGTH関数 | 引数の文字列の文字数を返します。文字列にサロゲートペアが含まれている場合，サロゲートペア1文字を2文字として数えて結果を返します。
LEQ関数 | 辞書的な順序で，引数の文字列が等しいかどうかを比較し，比較結果を返します。
LGE関数 | 辞書的な順序で，引数の文字列が大きいかどうか，または等しいかどうかを比較し，比較結果を返します。
LGT関数 | 辞書的な順序で，引数の文字列が大きいかどうかを比較し，比較結果を返します。
LLE関数 | 辞書的な順序で，引数の文字列が小さいかどうか，または等しいかどうかを比較し，比較結果を返します。
LLT関数 | 辞書的な順序で，引数の文字列が小さいかどうかを比較し，比較結果を返します。
REGEXP_FIRSTSEARCH関数 | 引数の文字列を正規表現パターンで検索し，最初に一致した文字列を返します。
REGEXP_REPLACE関数 | 引数の文字列を正規表現パターンで検索し，最初に一致した文字列を置換文字列に置き換えて返します。
REGEXP_SEARCH関数 | 引数の文字列を正規表現パターンで検索し，パターンに一致する部分があるかどうかを返します。
SPLENGTH関数 | 引数の文字列の文字数を返します。文字列にサロゲートペアが含まれている場合，サロゲートペア1文字を1文字として数えて結果を返します。

＜値式＞

値式については，「4.4.18　値式」を参照してください。なお，値式の個数は関数によって異なります。文字列関数の各関数の説明を参照してください。

使用例

日付データYYYY-MM-DDの固定形式であるCHAR型のS1.DATE1から年の文字列を抽出します。正規表現'^¥¥d¥¥d¥¥d¥¥d'は，先頭の数値文字列4文字を表現しています。

register query FILTER ISTREAM (
 SELECT REGEXP_FIRSTSEARCH(S1.DATE1,'^¥¥d¥¥d¥¥d¥¥d')
 FROM S1[ROWS 10] );

S1.DATE1が2013-01-23の場合，2013を返します。

注意事項

「3.3.1　CQLのデータ型とJavaのデータ型のマッピング」に示すように，CHAR型，VARCHAR型は，Javaのjava.lang.Stringクラスに対応しています。

引数にサロゲートペアが含まれる場合の文字列関数の動作について，次の表に示します。

表5-7　サロゲートペア入力時の動作

文字列関数名 | 文字列関数の動作
CONCAT | ○：通常に動作します。
LENGTH | ×：通常に動作しません。サロゲートペア1文字を2文字として数えて結果を返します。
LEQ | ○：通常に動作します。
LGE | ○：通常に動作します。
LGT | ○：通常に動作します。
LLE | ○：通常に動作します。
LLT | ○：通常に動作します。
REGEXP_FIRSTSEARCH | ○：通常に動作します。
REGEXP_REPLACE | ○：通常に動作します。
REGEXP_SEARCH | ○：通常に動作します。
SPLENGTH | ○：通常に動作します。サロゲートペア1文字を1文字として数えて結果を返します。

CONCAT関数

形式

CONCAT '('＜string1＞,＜string2＞')'

機能

第1引数string1と第2引数string2の文字列を結合した結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1の文字列の最後にstring2の文字列を連結した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
CONCAT | string1 | CHAR | VARCHAR
VARCHAR
string2 | CHAR
VARCHAR

戻り値の例を次に示します。
string1が'Abc'，string2が'Def'の場合，'AbcDef'を返します。

結合した結果の文字列がVARCHAR型の最大文字数32,767文字を超えた場合は，超えた分は切り捨てられます。

注意事項

ありません。

LENGTH関数

形式

LENGTH '('＜string＞')'

機能

引数stringの文字数を返します。string内にサロゲートペアが含まれている場合，サロゲートペア1文字を2文字として数えて結果を返します。

引数

＜string＞

文字列を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LENGTH | string | CHAR | INTEGER
VARCHAR

「は＋゛（濁点）」→「は゛」，「は＋゜（半濁点）」→「は゜」のように1字を表す結合文字については，2文字として結果を返します。
結合文字　：「は゛すけっと」＝6文字
非結合文字：「ばすけっと」　＝5文字

文字列にサロゲートペアが含まれている場合，サロゲートペア1文字を，2文字として数えて結果を返します。
「○○である」の「○○」がサロゲートペアの場合，戻り値は，7となります。

注意事項

ありません。

LEQ関数

形式

LEQ '('＜string1＞,＜string2＞')'

機能

辞書的な順序で，引数string1とstring2が等しいかどうかを比較し，比較結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1＝string2の場合，1を返します。

string1≠string2の場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LEQ | string1 | CHAR | INTEGER
VARCHAR
string2 | CHAR
VARCHAR

注意事項

辞書的な順序の定義について説明します。

次の場合に，二つの文字列が異なると判定します。

両方の文字列に対して有効なインデックスに位置する文字が異なる場合

文字列の長さが異なる場合

1.と2.の両方に該当する場合

なお，二つの文字列が異なる場合で，異なる文字を指す最も小さいインデックスをkとします。位置kにある文字のCHAR型の値を比較し「より小さい」値と判定される文字を持つ文字列が，もう一方の文字列の辞書的な前になります。

また，有効なインデックス位置での文字がすべて同じ場合，短い方の文字列が辞書的な前になります。

LGE関数

形式

LGE '('＜string1＞,＜string2＞')'

機能

辞書的な順序で，引数string1がstring2より大きいかどうか，または引数string1とstring2が等しいかどうかを比較し，比較結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1≧string2の場合，1を返します。

string1＜string2の場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LGE | string1 | CHAR | INTEGER
VARCHAR
string2 | CHAR
VARCHAR

注意事項

辞書的な順序の定義については，「LEQ関数」の注意事項を参照してください。

LGT関数

形式

LGT '('＜string1＞,＜string2＞')'

機能

辞書的な順序で，引数string1がstring2より大きいかどうかを比較し，比較結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1＞string2の場合，1を返します。

string1≦string2の場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LGT | string1 | CHAR | INTEGER
VARCHAR
string2 | CHAR
VARCHAR

注意事項

辞書的な順序の定義については，「LEQ関数」の注意事項を参照してください。

LLE関数

形式

LLE '('＜string1＞,＜string2＞')'

機能

辞書的な順序で，引数string1がstring2より小さいかどうか，または引数string1とstring2が等しいかどうかを比較し，比較結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1≦string2の場合，1を返します。

string1＞string2の場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LLE | string1 | CHAR | INTEGER
VARCHAR
string2 | CHAR
VARCHAR

注意事項

辞書的な順序の定義については，「LEQ関数」の注意事項を参照してください。

LLT関数

形式

LLT '('＜string1＞,＜string2＞')'

機能

辞書的な順序で，引数string1がstring2より小さいかどうかを比較し，比較結果を返します。

引数

＜string1＞

文字列を値式で指定します。

＜string2＞

文字列を値式で指定します。

戻り値

string1＜string2の場合，1を返します。

string1≧string2の場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
LLT | string1 | CHAR | INTEGER
VARCHAR
string2 | CHAR
VARCHAR

注意事項

辞書的な順序の定義については，「LEQ関数」の注意事項を参照してください。

REGEXP_FIRSTSEARCH関数

形式

REGEXP_FIRSTSEARCH '('＜string＞,＜regexp＞')'

機能

引数stringに指定された文字列を，引数regexpに指定した正規表現の文字列で検索し，最初に一致した文字列を返します。

引数

＜string＞

文字列を値式で指定します。

＜regexp＞

正規表現を定数で指定します。

戻り値

引数stringの文字列を，引数regexpの正規表現の文字列で検索し，最初に一致した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
REGEXP_FIRSTSEARCH | string | CHAR | VARCHAR
VARCHAR
regexp | CHAR
VARCHAR

戻り値の例を次に示します。
REGEXP_FIRSTSEARCH('abcdefabc', '[d-z]*')の場合，'def'を返します。

正規表現で検索し，一致した文字列がない場合，空文字""を返します。

注意事項

CQL上では，正規表現を定数で指定してください。定数で指定しない場合，クエリの登録時にエラーとなります。
（正しい指定例）
文字列input.Str1を正規表現'.A*'の定数で検索する場合

 SELECT
 REGEXP_FIRSTSEARCH( input.Str1, '.A*' ) AS S1
 FROM input[ROWS 100];

（誤った指定例）
文字列input.Str1を文字列input.Str2の列名を指定して検索する場合

 SELECT
 REGEXP_FIRSTSEARCH( input.Str1, input.Str2 ) AS S1
 FROM input[ROWS 100];FROM input[ROWS 100];

正規表現の構文に誤りがある場合，正規表現の解析ができないため，クエリグループが閉塞します。

正規表現の解析には，java.util.regex.Patternクラスを使用します。このため，正規表現は，java.util.regex.Patternクラスがサポートする正規表現の範囲で記述してください。

REGEXP_REPLACE関数

形式

REGEXP_REPLACE '('＜string＞,＜regexp＞,＜replacement＞')'

機能

引数stringに指定された文字列を，引数regexpに指定された正規表現の文字列で検索します。最初に一致した文字列を，引数replacementに指定された置換文字列に置き換えて返します。

引数

＜string＞

文字列を値式で指定します。

＜regexp＞

正規表現を定数で指定します。

＜replacement＞

置換文字列を値式で指定します。

戻り値

引数stringの文字列を，引数regexpの正規表現の文字列で検索し，最初に一致した文字列を，引数replacementの置換文字列に置き換えて返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
REGEXP_REPLACE | string | CHAR | VARCHAR
VARCHAR
regexp | CHAR
VARCHAR
replacement | CHAR
VARCHAR

戻り値の例を次に示します。
REGEXP_REPLACE('abcdefabcdef', '[d-z]*', 'xyz')の場合，'abcxyzabcdef'を返します。

正規表現で検索し，一致した文字列がない場合，文字列stringをそのまま返します。

注意事項

「REGEXP_FIRSTSEARCH関数」の注意事項を参照してください。

REGEXP_SEARCH関数

形式

REGEXP_SEARCH '('＜string＞,＜regexp＞')'

機能

引数stringに指定された文字列を，引数regexpに指定された正規表現の文字列で検索し，パターンに一致する部分があるかどうかを返します。

引数

＜string＞

文字列を値式で指定します。

＜regexp＞

正規表現を定数で指定します。

戻り値

一致する文字列がある場合，1を返します。

一致する文字列がない場合，0を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
REGEXP_SEARCH | string | CHAR | INTEGER
VARCHAR
regexp | CHAR
VARCHAR

戻り値の例を次に示します。
REGEXP_SEARCH('abcdefabc', '[d-z]*')の場合，1を返します。

注意事項

「REGEXP_FIRSTSEARCH関数」の注意事項を参照してください。

SPLENGTH関数

形式

SPLENGTH '('＜string＞')'

機能

引数stringの文字数を返します。string内にサロゲートペアが含まれている場合，サロゲートペア1文字を1文字として数えて結果を返します。

引数

＜string＞

文字列を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

文字列関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
SPLENGTH | string | CHAR | INTEGER
VARCHAR

「は＋゛（濁点）」→「は゛」，「は＋゜（半濁点）」→「は゜」のように1字を表す結合文字については，2文字として結果を返します。
結合文字　：「は゛すけっと」＝6文字
非結合文字：「ばすけっと」　＝5文字

文字列にサロゲートペアが含まれている場合，サロゲートペア1文字を，1文字として数えて結果を返します。
「○○である」の「○○」がサロゲートペアの場合，戻り値は，5となります。

注意事項

ありません。

5.5　時刻関数の詳細

ここでは，「4.4.23　組み込みスカラ関数」で指定する時刻関数について説明します。

＜この節の構成＞

時刻関数

TIMEDIFF関数

TIMESTAMPDIFF関数

時刻関数

形式

時刻関数::=＜時刻関数名＞'('＜値式＞ ,＜値式＞')'

機能

時刻関数は，日付時刻型の入力値に対して演算を実行し，演算結果を数値で返します。

オペランド

＜時刻関数名＞

時刻関数の名称です。時刻関数の一覧を次に示します。

表5-8　時刻関数の一覧

関数名 | 説明
TIMEDIFF関数 | TIME型の時刻の差分を計算し，結果をミリ秒の数値で返します。
TIMESTAMPDIFF関数 | TIMESTAMP型の時刻の差分を計算し，結果をミリ秒の数値で返します。

＜値式＞

値式については，「4.4.18　値式」を参照してください。なお，値式の個数は関数によって異なります。時刻関数の各関数の説明を参照してください。

注意事項

タイムゾーンは，Stream Data Platform - AFが動作しているJavaVMに従います。

時刻関数は，夏時間に対応していません。夏時間を実施するタイムゾーンで使用した場合でも，日付データ，時刻データ，時刻印データは，標準時間に従って扱います。

使用例

TIME型の時刻データS1.DATETIMEが01:00:00以前のタプルだけを出力します。

register query FILTER ISTREAM (
 SELECT * FROM S1[ROWS 10]
 WHERE TIMEDIFF('01:00:00',S1.DATETIME) < 0 );

TIMEDIFF関数

形式

TIMEDIFF'('＜time1＞,＜time2＞')'

機能

引数time1とtime2の差分を計算し，結果をミリ秒の数値で返します。

引数

＜time1＞

時刻データを値式で指定します。

＜time2＞

時刻データを値式で指定します。

戻り値

引数time1，time2を1970年1月1日 00:00:00 GMTからのミリ秒に変換し，「time2－time1＝差分」で計算した値を返します。単位はミリ秒です。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

時刻関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
TIMEDIFF | time1 | TIME | BIGINT
time2 | TIME

TIME型は，java.sql.Time型に対応するため，引数の時刻データは1970年1月1日 00:00:00 GMTが基準となります。引数に日付の繰り上がりがある時刻データを指定した場合，結果の差分は繰り上がった日付を含んだミリ秒の数値を返します。
例えば，time1に「09:00:00」，time2に「33:00:00」を指定した場合，time1は「1970-01-01 09:00:00」，time2は「1970-01-02 09:00:00」となり，time2の日付が繰り上がります。また，戻り値は，86400000となります。下線部が，日付の部分です。

注意事項

入力値によっては，想定しない値が返る場合があります。

例えば，TIME1='00:00:00'（時刻印データで表すと1970-01-01 00:00:00.000），およびBIGINT1=253402236000000をTIME型に変換した値を入力した場合，TIMEDIFF(TIME1,NUMBER_TOTIME(BIGINT1))は，戻り値253402268400000のミリ秒数値を返します。戻り値253402268400000を時刻印データで表すと，'10000-01-01 00:00:00.000'となります。

TIMESTAMPDIFF関数

形式

TIMESTAMPDIFF'('＜timestamp1＞,＜timestamp2＞')'

機能

引数timestamp1とtimestamp2の差分を計算し，結果をミリ秒の数値で返します。

引数

＜timestamp1＞

時刻印データを値式で指定します。

＜timestamp2＞

時刻印データを値式で指定します。

戻り値

引数timestamp1，timestamp2を1970年1月1日 00:00:00 GMTからのミリ秒に変換し，「timestamp2－timestamp1＝差分」で計算した値を返します。単位はミリ秒です。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

時刻関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
TIMESTAMPDIFF | timestamp1 | TIMESTAMP | BIGINT
timestamp2 | TIMESTAMP

注意事項

「TIMEDIFF関数」の注意事項を参照してください。

5.6　変換関数の詳細

ここでは，「4.4.23　組み込みスカラ関数」で指定する変換関数について説明します。

＜この節の構成＞

変換関数

BIGINT_TOSTRING関数

DECIMAL_TOSTRING関数

DOUBLE_TOSTRING関数

INT_TOSTRING関数

NUMBER_TODATE関数

NUMBER_TOTIME関数

REAL_TOSTRING関数

TIME_TONUMBER関数

TIMESTAMP_TONUMBER関数

変換関数

形式

変換関数::=＜変換関数名＞'('＜値式＞')'

機能

変換関数は，引数のデータ型を別のデータ型に変換する機能を提供します。

オペランド

＜変換関数名＞

変換関数の名称です。変換関数の一覧を次に示します。

表5-9　変換関数の一覧

関数名 | 説明
BIGINT_TOSTRING関数 | BIGINT型の数値を文字列型に変換します。
DECIMAL_TOSTRING関数 | DECIMAL型またはNUMERIC型の数値を文字列型に変換します。
DOUBLE_TOSTRING関数 | DOUBLE型またはFLOAT型の数値を文字列型に変換します。
INT_TOSTRING関数 | INTEGER型の数値を文字列型に変換します。
NUMBER_TODATE関数 | ミリ秒の数値をDATE型の日付データに変換します。
NUMBER_TOTIME関数 | ミリ秒の数値をTIME型の時刻データに変換します。
REAL_TOSTRING関数 | REAL型の数値を文字列型に変換します。
TIME_TONUMBER関数 | TIME型の時刻データをミリ秒の数値に変換します。
TIMESTAMP_TONUMBER関数 | TIMESTAMP型の時刻印データをミリ秒の数値に変換します。

＜値式＞

値式については，「4.4.18　値式」を参照してください。なお，値式の個数は関数によって異なります。変換関数の各関数の説明を参照してください。

注意事項

変換関数の引数・戻り値での日付データ，時刻データ，時刻印データは，Stream Data Platform - AFが動作しているJavaVMのタイムゾーンに従います。また，変換関数の引数・戻り値でのミリ秒の数値は，1970年1月1日 00:00:00 GMTを基準とした値です。

時刻を扱う変換関数は，夏時間に対応していません。夏時間を実施するタイムゾーンで使用した場合でも，日付データ，時刻データ，時刻印データは，標準時間に従って扱います。

使用例

INTEGER型のS1.CODEを文字列型に変換し出力します。

register query FILTER ISTREAM (
SELECT INT_TOSTRING(S1.CODE) FROM S1[ROWS 10] );

S1.CODEが34512の場合，34512を返します。

BIGINT_TOSTRING関数

形式

BIGINT_TOSTRING '('＜value＞')'

機能

BIGINT型の数値valueを文字列型に変換します。

引数

＜value＞

BIGINT型の数値を値式で指定します。

戻り値

数値を文字列型に変換し，変換した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
BIGINT_TOSTRING | value | BIGINT | VARCHAR

注意事項

ありません。

DECIMAL_TOSTRING関数

形式

DECIMAL_TOSTRING '('＜value＞')'

機能

DECIMAL型またはNUMERIC型の数値valueを文字列型に変換します。

引数

＜value＞

DECIMAL型またはNUMERIC型の数値を値式で指定します。

戻り値

数値を文字列型に変換し，変換した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
DECIMAL_TOSTRING | value | DECIMAL | VARCHAR
NUMERIC

数値が10⁻⁶未満の場合，指数表現を使用した文字形式に変換します。
（例）
入力数値「0.00000100121」 → 変換後文字列「0.00000100121」
入力数値「0.000000100121」 → 変換後文字列「1.00121E-7」

注意事項

DECIMAL型（NUMERIC型）以外のデータ型からDECIMAL型（NUMERIC型）へのキャスト（暗黙的なキャストを含む）では，結果のけた数がquery.decimalMaxPrecisionパラメーターで指定したけた数を超えた場合，指定したけた数に丸められます。引数は丸められた数値となるため，DECIMAL_TOSTRING関数も丸められた数値を変換した文字列を返します。

（例）

query.decimalMaxPrecision=5の場合は，次のようになります。

DECIMAL_TOSTRING( (DECIMAL)DBL1)
入力数値（DOUBLE型のDBL1）「23.45666」 → 変換後文字列「23.457」

DECIMAL_TOSTRING(DEC1)
入力数値（DECIMAL型のDEC1）「23.45666」 → 変換後文字列「23.45666」

DOUBLE_TOSTRING関数

形式

DOUBLE_TOSTRING '('＜value＞')'

機能

DOUBLE型またはFLOAT型の数値valueを文字列型に変換します。

引数

＜value＞

DOUBLE型またはFLOAT型の数値を値式で指定します。

戻り値

数値を文字列型に変換し，変換した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
DOUBLE_TOSTRING | value | DOUBLE | VARCHAR
FLOAT

数値が10⁻³未満の場合，または10⁷以上の場合，指数表現を使用した文字形式に変換します。
（例）
入力数値「2768237.5693」 → 変換後文字列「2768237.5693」
入力数値「27682371.5693」 → 変換後文字列「2.76823715693E7」
入力数値「0.005693442」 → 変換後文字列「0.005693442」
入力数値「0.0005693442」 → 変換後文字列「5.693442E-4」

注意事項

浮動小数点型は，IEEE 754に準拠しているため，正確に変換できない場合があります。

INT_TOSTRING関数

形式

INT_TOSTRING '('＜value＞')'

機能

INTEGER型の数値valueを文字列型に変換します。

引数

＜value＞

INTEGER型の数値を値式で指定します。

戻り値

数値を文字列型に変換し，変換した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
INT_TOSTRING | value | INTEGER | VARCHAR

注意事項

ありません。

NUMBER_TODATE関数

形式

NUMBER_TODATE '('＜value＞')'

機能

ミリ秒の数値valueをDATE型の日付データに変換します。

引数

＜value＞

ミリ秒の数値（BIGINT型）を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
NUMBER_TODATE | value | BIGINT | DATE

注意事項

「NUMBER_TOTIME関数」の注意事項を参照してください。

NUMBER_TOTIME関数

形式

NUMBER_TOTIME '('＜value＞')'

機能

ミリ秒の数値valueをTIME型の時刻データに変換します。

引数

＜value＞

ミリ秒の数値（BIGINT型）を値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
NUMBER_TOTIME | value | BIGINT | TIME

注意事項

入力値によっては，想定しない値が返る場合があります。

例えば，BIGINT1=9223372036854775807を入力した場合，NUMBER_TOTIME(BIGINT1)は，戻り値16:12:55を返します。戻り値16:12:55は，時刻印データで表すと292278994-08-17 16:12:55.807となります。

REAL_TOSTRING関数

形式

REAL_TOSTRING '('＜value＞')'

機能

REAL型の数値valueを文字列型に変換します。

引数

＜value＞

REAL型の数値を値式で指定します。

戻り値

数値を文字列型に変換し，変換した文字列を返します。

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
REAL_TOSTRING | value | REAL | VARCHAR

数値が10⁻³未満の場合，または10⁷以上の場合，指数表現を使用した文字形式に変換します。
（例）
入力数値「2768237.5693」 → 変換後文字列「2768237.5」
入力数値「27682371.5693」 → 変換後文字列「2.7682372E7」
入力数値「0.005693442」 → 変換後文字列「0.005693442」
入力数値「0.0005693442」 → 変換後文字列「5.693442E-4」

注意事項

浮動小数点型は，IEEE754に準拠しているため，正確に変換できない場合があります。

TIME_TONUMBER関数

形式

TIME_TONUMBER '('＜time＞')'

機能

TIME型の時刻データtimeをミリ秒の数値に変換します。

引数

＜time＞

TIME型の時刻データを値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
TIME_TONUMBER | time | TIME | BIGINT

注意事項

「TIMEDIFF関数」の注意事項を参照してください。

TIMESTAMP_TONUMBER関数

形式

TIMESTAMP_TONUMBER '('＜timestamp＞')'

機能

TIMESTAMP型の時刻印データtimestampをミリ秒の数値に変換します。

引数

＜timestamp＞

TIMESTAMP型の時刻印データを値式で指定します。

戻り値

引数のデータ型と戻り値のデータ型の関係を次の表に示します。

変換関数名 | 引数 | 引数のデータ型 | 戻り値のデータ型
TIMESTAMP_TONUMBER | timestamp | TIMESTAMP | BIGINT

注意事項

「TIMEDIFF関数」の注意事項を参照してください。

6.　クエリ定義のサンプル

この章では，Stream Data Platform - AFが提供しているクエリ定義のサンプルの種類について説明しています。

＜この章の構成＞

6.1　クエリ定義のサンプルの種類

6.1　クエリ定義のサンプルの種類

Stream Data Platform - AFでは，次の表に示すクエリ定義のサンプルを提供しています。これらのサンプルは，＜インストールディレクトリ＞¥samples¥下の「api」「external」「file」「httppacket」ディレクトリ下にそれぞれ格納されています。

表6-1　クエリ定義のサンプルの種類

格納先 | ファイル名 | 説明
api¥query¥ | Inprocess_QueryTest | インプロセス連携カスタムアダプター用のクエリ定義のサンプルです。
RMI_QueryTest | RMI連携カスタムアダプター用のクエリ定義のサンプルです。
external¥query¥ | Inprocess_QueryTest | 外部定義関数を使用する場合のクエリ定義のサンプルです。
file¥query¥ | Inprocess_QueryTest | 標準提供アダプターでファイルを入力データとする場合のクエリ定義のサンプルです。
httppacket¥query¥ | Inprocess_QueryTest | 標準提供アダプターでHTTPパケットを入力データとする場合のクエリ定義のサンプルです。

参考

＜インストールディレクトリ＞¥samples¥en¥下には，英語版のサンプルを提供しています。

7.　カスタムアダプターの作成

この章では，カスタムアダプターの作成方法について説明します。

カスタムアダプターは，標準提供アダプターで扱えない形式のデータを扱う場合などに，必要に応じて作成してください。

なお，カスタムアダプターの作成で使用するAPIの詳細については，「8.　データ送受信用API」を参照してください。

＜この章の構成＞

7.1　作成するカスタムアダプターの種類

7.2　RMI連携カスタムアダプターの作成

7.3　インプロセス連携カスタムアダプターの作成

7.4　カスタムアダプターで実装する処理

7.5　コンパイル手順

7.6　カスタムアダプター作成時の留意事項

7.1　作成するカスタムアダプターの種類

この節では，作成するカスタムアダプターの種類について説明します。

カスタムアダプターとは，入出力データとSDPサーバの間でデータをやり取りする機能を持つアプリケーションです。Stream Data Platform - AFが提供するAPIを使用して作成します。

カスタムアダプターは，処理内容によって，データ送信APとデータ受信APの2種類に分類できます。また，データ送信APとデータ受信APは，SDPサーバとのデータの送受信方法によって，RMI連携カスタムアダプターとインプロセス連携カスタムアダプターの2種類に分類できます。

＜この節の構成＞

7.1.1　データ送信APとデータ受信AP

7.1.2　データの送受信方法による分類（RMI連携カスタムアダプターとインプロセス連携カスタムアダプター）

7.1.1　データ送信APとデータ受信AP

カスタムアダプターは，処理内容ごとに，次の2種類に分類できます。

データ送信AP
入力データを受け付け，SDPサーバに対してストリームデータを送信します。

データ受信AP
SDPサーバで分析した結果（クエリ結果）のストリームデータを受信します。

カスタムアダプターの位置づけについて，次の図に示します。

図7-1　カスタムアダプターの位置づけ

データ送信APでは，任意の形式のデータを受け付け，ストリームデータとしてストリームデータ処理エンジンに送信します。データ受信APでは，ストリームデータ処理エンジンで処理されたストリームデータを受信して，任意の形式のデータとして出力します。

7.1.2　データの送受信方法による分類（RMI連携カスタムアダプターとインプロセス連携カスタムアダプター）

カスタムアダプターは，SDPサーバとのデータの送受信方法（アプリケーション連携方式）によって，次の2種類に分類できます。

RMI連携カスタムアダプター
SDPサーバとのデータの送受信に，JavaのRMIの仕組みを使用します。カスタムアダプターをSDPサーバとは別のプロセスとして起動します。
RMI連携カスタムアダプターを使用する場合のストリームデータの流れを次の図に示します。

図7-2　RMI連携カスタムアダプター

インプロセス連携カスタムアダプター
SDPサーバとのデータの送受信をSDPサーバのプロセス内で実行します。カスタムアダプターは，SDPサーバの一部として動作します。
インプロセス連携カスタムアダプターを使用する場合のストリームデータの流れを次の図に示します。

図7-3　インプロセス連携カスタムアダプター

なお，カスタムアダプターでは，データ送信APとデータ受信APで，異なるデータの送受信方法を使用することもできます。

例えば，次の図に示すように，データ送信APをRMI連携カスタムアダプターとして作成してデータ受信APをインプロセス連携カスタムアダプターとして作成したり，データ送信APをインプロセス連携カスタムアダプターとして作成してデータ受信APをRMI連携カスタムアダプターとして作成したりすることもできます。

図7-4　データ送信APとデータ受信APで異なるデータ送受信方法を使用する場合

7.2　RMI連携カスタムアダプターの作成

この節では，RMI連携カスタムアダプターの作成方法について説明します。

RMI連携カスタムアダプターは，カスタムアダプターとは別のプロセスであるSDPサーバにRMI通信で接続し，SDPConnector型オブジェクトを取得します。SDPサーバとの接続には，SDPConnectorFactoryクラスのconnectメソッドを使用します。

ストリームデータの送受信には，StreamInputインタフェースおよびStreamOutputインタフェースのメソッドを使用します。StreamInput型オブジェクトおよびStreamOutput型オブジェクトは，SDPConnectorインタフェースのメソッドによって生成します。なお，一つのSDPConnector型オブジェクトから，StreamInput型オブジェクトおよびStreamOutput型オブジェクトの両方のオブジェクトを生成することもできます。

ストリームデータの送受信時に使用するインタフェースについて，概要を示します。

ストリームデータ送信時

ストリームデータの送信には，StreamInputインタフェースを使用します。

カスタムアダプターでは，SDPConnectorFactoryクラスのconnectメソッドによって取得したSDPConnector型オブジェクトを使用して，StreamInput型オブジェクトを生成します。生成したStreamInput型オブジェクトのputメソッドを使用して，データを送信します。

ストリームデータ受信時

ストリームデータの受信には，StreamOutputインタフェースを使用します。

カスタムアダプターでは，SDPConnectorFactoryクラスのconnectメソッドによって取得したSDPConnector型オブジェクトを使用して，StreamOutput型オブジェクトを生成します。生成したStreamOutput型オブジェクトのgetメソッドまたはgetAllメソッドを使用して，データを受信します。

getメソッドおよびgetAllメソッドでは，SDPサーバから能動的に結果データを取得します。このデータ取得方式を，ポーリング方式といいます。

＜この節の構成＞

7.2.1　ストリームデータの送信（RMI連携カスタムアダプター）

7.2.2　クエリ結果データの受信（RMI連携カスタムアダプター）

7.2.1　ストリームデータの送信（RMI連携カスタムアダプター）

ここでは，RMI連携カスタムアダプターでストリームデータを送信する処理の基本的な流れについて，実装例を基に説明します。

実装例

public class RMI_SendSample {
 public static void main(String[] args) {
   try {
     // 1. SDPサーバに接続
     SDPConnector con = SDPConnectorFactory.connect();

     // 2. 送信対象の入力ストリームに接続
     StreamInput in = con.openStreamInput("GROUP","STREAM1");

     // 3. タプルを送信
     Object[] data=new Object[]{new Integer(1)};
     StreamTuple tuple=new StreamTuple(data);
     try {
       in.put(tuple);

       // 4. データ送信完了を通知
       in.putEnd();
     } catch (SDPClientQueryGroupStateException e) {
       System.out.println("クエリグループ停止");
     }

     // 5. 入力ストリームとの接続を切断
     in.close();

     // 6. SDPサーバとの接続を切断
     con.close();
   } catch (SDPClientException e) {
     System.err.println(e.getMessage());
   }
 }
}

実装内容の説明

それぞれの処理の意味について説明します。番号は実装例中のコメントの番号に対応しています。

SDPサーバに接続して，SDPConnector型オブジェクト（con）を取得します。

SDPConnector con = SDPConnectorFactory.connect();

SDPConnector型オブジェクト（con）を使用して，グループ名が"GROUP"，ストリーム名が"STREAM1"である入力ストリームに接続し，StreamInput型オブジェクト（in）を取得します。

StreamInput in = con.openStreamInput("GROUP","STREAM1");

StreamInput型オブジェクト（in）を使用して，タプル（ストリームデータ）を送信します。

in.put(tuple);

StreamInput型オブジェクト（in）を使用して，データ送信完了を通知します。

in.putEnd();

StreamInput型オブジェクト（in）を使用して，入力ストリームとの接続を切断します。

in.close();

SDPConnector型オブジェクト（con）を使用して，SDPサーバとの接続を切断します。

con.close();

7.2.2　クエリ結果データの受信（RMI連携カスタムアダプター）

ここでは，RMI連携カスタムアダプターでのクエリ結果データの受信処理の基本的な流れについて，実装例を基に説明します。

実装例

public class RMI_ReceiveSample {
 public static void main(String[] args) {
   try {
     // 1. SDPサーバに接続
     SDPConnector con = SDPConnectorFactory.connect();

     // 2. 出力ストリームに接続
     StreamOutput o = con.openStreamOutput("GROUP","QUERY1");

     // 3. タプルを受信
     try {
       while(true) {
       ArrayList tupleList = o.getAll();
       }
     } catch (SDPClientEndOfStreamException e) {
       System.out.println("データ受信完了");
     } catch (SDPClientQueryGroupStateException e) {
       System.out.println("クエリグループ停止");
     }

     // 4. 出力ストリームとの接続を切断
     o.close();

     // 5. SDPサーバとの接続を切断
     con.close();
   } catch (SDPClientException e) {
     System.err.println(e.getMessage());
   }
 }
}

実装内容の説明

それぞれの処理の意味について説明します。番号は実装例中のコメントの番号に対応しています。

SDPサーバに接続して，SDPConnector型オブジェクト（con）を取得します。

SDPConnector con = SDPConnectorFactory.connect();

SDPConnector型オブジェクト（con）を使用して，クエリグループ名が"GROUP"，クエリ名が"QUERY1"の出力ストリームに接続し，StreamOutput型オブジェクト（o）を取得します。

StreamOutput o = con.openStreamOutput("GROUP","QUERY1");

StreamOutput型オブジェクト（o）を使用して，クエリ結果のタプル（tupleList）を取得します。

ArrayList tupleList = o.getAll();

受信が完了したら，StreamOutput型オブジェクト（o）を使用して，出力ストリームとの接続を切断します。

o.close();

SDPConnector型オブジェクト（con）を使用して，SDPサーバとの接続を切断します。

con.close();

7.3　インプロセス連携カスタムアダプターの作成

この節では，インプロセス連携カスタムアダプターの作成方法について説明します。

インプロセス連携カスタムアダプターの実装では，StreamInprocessUPインタフェースを実装したクラスを作成する必要があります。

インプロセス連携カスタムアダプターは，SDPサーバで生成したSDPConnector型オブジェクトを，StreamInprocessUPインタフェースの実装クラスのexecuteメソッドのパラメーターとして受け取ります。executeメソッドには，カスタムアダプターのmainメソッドに相当する処理を記述します。

ストリームデータの送受信には，StreamInputインタフェースおよびStreamOutputインタフェースを使用します。StreamInput型オブジェクトおよびStreamOutput型オブジェクトは，executeメソッドのパラメーターとして渡されたSDPConnector型オブジェクトのメソッドによって生成します。

ストリームデータの送受信時に使用するインタフェースについて，概要を示します。

ストリームデータ送信時

ストリームデータの送信には，StreamInputインタフェースを使用します。

カスタムアダプターでは，executeメソッドのパラメーターとして渡されたSDPConnector型オブジェクトを使用して，StreamInput型オブジェクトを生成します。生成したStreamInput型オブジェクトのputメソッドを使用して，データを送信します。

ストリームデータ受信時

ストリームデータの受信には，StreamOutputインタフェースを使用します。

カスタムアダプターでは，executeメソッドのパラメーターとして渡されたSDPConnector型オブジェクトを使用して，StreamOutput型オブジェクトを生成します。生成したStreamOutput型オブジェクトを使用して，次のどちらかの方式でSDPサーバからクエリ結果のストリームデータ（タプル）を取得します。

ポーリング方式
SDPサーバから能動的にタプルを取得する，レイテンシ重視の方式です。getメソッドまたはgetAllメソッドを使用して，タプルを受信します。

コールバック方式
SDPサーバ上でタプルが生成されたときに，タプルを取得するためのメソッドがSDPサーバによって呼び出される方式です。この方式を使用する場合，SDPサーバに呼び出されるメソッドは，事前に登録しておく必要があります。ポーリング方式と比較してレイテンシは増えますが，結果が生成された場合だけ処理するのでCPU効率を重視した方式です。

なお，インプロセス連携カスタムアダプターを使用する場合は，user_app.＜インプロセス連携AP名＞.propertiesに次の記述が必要になります。

user_app.classname=カスタムアダプターのメインクラス名
user_app.classpath_dir=カスタムアダプターのメインクラスのパス名

user_app.＜インプロセス連携AP名＞.propertiesの指定方法については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

＜この節の構成＞

7.3.1　ストリームデータの送信（インプロセス連携カスタムアダプター）

7.3.2　クエリ結果データの受信（インプロセス連携カスタムアダプター）

7.3.3　注意事項

7.3.1　ストリームデータの送信（インプロセス連携カスタムアダプター）

ここでは，インプロセス連携カスタムアダプターでストリームデータを送信する処理の基本的な流れについて，実装例を基に説明します。

実装例

public class Inpro_SendSample implements StreamInprocessUP {  
 // StreamInprocessUPの実装
 public void execute(SDPConnector con) {
   // 1. 送信対象の入力ストリームに接続
   StreamInput in = con.openStreamOutput("GROUP","STREAM1");

   // 2. タプルを送信
   Object[] data=new Object[]{new Integer(1)};
   StreamTuple tuple=new StreamTuple(data);
   in.put(tuple);

   // 3. データ送信完了を通知
   in.putEnd();

   // 4. 入力ストリームとの接続を切断
   in.close();

   // 5. SDPサーバとの接続を切断
   con.close();
 }
}

実装内容の説明

それぞれの処理の意味について説明します。番号は実装例中のコメントの番号に対応しています。

executeメソッドのパラメーターとして渡されたSDPConnector型オブジェクト（con）を使用して，クエリグループ名が"GROUP"，ストリーム名が"STREAM1"の入力ストリームへ接続し，StreamInput型オブジェクト（in）を取得します。

StreamInput in = con.openStreamInput("GROUP","STREAM1");

StreamInput型オブジェクト（in）を使用して，タプルを送信します。

in.put(tuple);

StreamInput型オブジェクト（in）を使用して，データ送信完了を通知します。

in.putEnd();

StreamInput型オブジェクト（in）を使用して，入力ストリームとの接続を切断します。

in.close();

SDPConnector型オブジェクトを使用して，SDPサーバとの接続を切断します。

con.close();

7.3.2　クエリ結果データの受信（インプロセス連携カスタムアダプター）

ここでは，インプロセス連携カスタムアダプターでのクエリ結果データの受信処理の基本的な流れについて，実装例を基に説明します。

インプロセス連携アダプターでのクエリ結果データの受信方式には，ポーリング方式とコールバック方式の2種類があります。それぞれの方式について説明します。

＜この項の構成＞

(1)　ポーリング方式

(2)　コールバック方式

(1)　ポーリング方式

SDPサーバから能動的にストリームクエリ結果データを受信する方式です。

ポーリング方式によるクエリ結果データの受信処理について，実装例を次に示します。

実装例

public class Inpro_ReceiveSample1 implements StreamInprocessUP {
 // StreamInprocessUPの実装
 public void execute(SDPConnector con) {
   try {
     // 1. 出力ストリームに接続
     StreamOutput o = con.openStreamOutput("GROUP","QUERY1");

     // 2. タプルを受信
     try {
       while(true) {
         ArrayList tupleList = o.getAll();
       }
     } catch (SDPClientEndOfStreamException e) {
       System.out.println("データ受信完了");
     }

     // 3. 出力ストリームとの接続を切断
     o.close();

     // 4. SDPサーバとの接続を切断
     con.close();
   } catch (SDPClientException e) {
     System.err.println(e.getMessage());
   }
 }
}

実装内容の説明

それぞれの処理の意味について説明します。番号は実装例中のコメントの番号に対応しています。

executeメソッドのパラメーターで渡されたSDPConnector型オブジェクト（con）を使用して，クエリグループ名が"GROUP"，クエリ名が"QUERY1"の出力ストリームに接続し，StreamOutput型オブジェクト（o）を取得します。

StreamOutput o = con.openStreamOutput("GROUP","QUERY1");

StreamOutput型オブジェクト（o）を使用して，クエリ結果データ（タプル）を取得します。

ArrayList tupleList = o.getAll();

クエリ結果データの受信完了後，StreamOutput型オブジェクト（o）を使用して，出力ストリームとの接続を切断します。

o.close();

SDPConnector型オブジェクト（con）を使用して，SDPサーバとの接続を切断します。

con.close();

(2)　コールバック方式

クエリ結果データ受信用のメソッドがSDPサーバによって呼び出される方式です。

コールバック方式によるクエリ結果データの受信処理について，実装例を次に示します。

コールバック方式によってクエリ結果データを受信する場合，次の二つのメソッドを実装する必要があります。

StreamInprocessUPインタフェースを実装したクラスのexecuteメソッド

StreamEventListenerインタフェースを実装したコールバッククラスのonEventメソッド

それぞれの実装例について説明します。

実装例（executeメソッドの実装）

public class Inpro_ReceiveSample2 implements StreamInprocessUP {
 // StreamInprocessUPの実装
 public void execute(SDPConnector con) {  // AP起動時に実行される処理
   // 1. 出力ストリームに接続
   StreamOutput o = con.openStreamOutput("GROUP","QUERY2");

   // 2. コールバック用リスナーオブジェクトの生成
   CallBack notifiable = new CallBack();

   // 3. コールバック用リスナーオブジェクトの登録
   o.registerForNotification(notifiable);
 }
 public void stop() {  // AP停止時に実行される処理
   // 4. コールバック用リスナーオブジェクトの解除
   o.unregisterForNotification(notifiable);

   // 5. SDPサーバとの接続を切断
   con.close();
 }
}

実装例（onEventメソッドの実装）

public class CallBack implements StreamEventListener {
 // StreamEventListenerの実装
 public void onEvent(StreamTuple tuple) {
   // 6. タプル受信時の処理
   System.out.println("タプル受信:" + tuple);
 }
}

実装内容の説明

それぞれの処理の意味について説明します。番号は実装例中のコメントの番号に対応しています。

executeメソッドのパラメーターに指定されたSDPConnector型オブジェクト（con）を使用して，クエリグループ名が"GROUP"，クエリ名が"QUERY2"の出力ストリームに接続し，StreamOutput型オブジェクト（o）を取得します。

StreamOutput o = con.openStreamOutput("GROUP","QUERY2");

StreamEventListenerインタフェースの実装クラス（CallBack）のオブジェクト（notifiable）を生成します。

CallBack notifiable = new CallBack();

StreamOutput型オブジェクト（o）を使用して，手順2.で作成したコールバック用リスナーオブジェクトを登録します。

o.registerForNotification(notifiable);

カスタムアダプターを停止するときに，StreamOutput型オブジェクト（o）を使用して，コールバック用リスナーオブジェクト（notifiable）を解除します。

o.unregisterForNotification(notifiable);

カスタムアダプターを停止するときに，SDPConnector型オブジェクト（con）を使用して，SDPサーバとの接続を切断します。

con.close();

出力ストリームにクエリ結果データのタプルが到着したときに，StreamEventListenerインタフェースのonEventメソッドに記述した内容が実行されます。

public void onEvent(StreamTuple tuple) {
// 6. タプル受信時の処理
　　}

7.3.3　注意事項

インプロセス連携カスタムアダプターの実装では，System.exitメソッドを使用しないでください。インプロセス連携カスタムアダプターはSDPサーバと同じプロセスで実行されるため，インプロセス連携カスタムアダプター内でSystem.exitメソッドが呼び出された場合，SDPサーバも終了してしまいます。

7.4　カスタムアダプターで実装する処理

ここでは，カスタムアダプターで実装する次の処理について説明します。「7.2　RMI連携カスタムアダプターの作成」または「7.3　インプロセス連携カスタムアダプターの作成」で示した基本的な処理と組み合わせて，必要に応じて実装してください。

データ受信APの終了契機の把握（データ処理終了の通知）

データソースモードでの時刻情報の設定

キューあふれの事前防止

なお，この節で説明する機能の一部は，定義ファイルでのパラメーターの指定が必要になります。各定義ファイルの詳細については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

また，処理で使用するAPIの詳細については，「8.　データ送受信用API」を参照してください。

＜この節の構成＞

7.4.1　データ受信APの終了契機の把握（データ処理終了の通知）

7.4.2　データソースモードでの時刻情報の設定

7.4.3　キューあふれの事前防止

7.4.1　データ受信APの終了契機の把握（データ処理終了の通知）

データ受信APは，Stream Data Platform - AFのコマンドでは終了できないため，データ受信APの中で終了処理を実装しておく必要があります。

ここでは，データ受信APを終了するための契機をデータ受信APで把握するための実装について説明します。ここで説明する方法は，ストリームデータ処理エンジンであらかじめ送信ストリームデータの終了契機がわかる，次のような業務に使用できます。

ファイルのデータをストリームデータとして処理する場合

データ送信元からのデータの配信が定刻で終わることがわかっている場合

参考

データ送信APを終了させる場合，データ処理終了の通知は不要です。データ送信APについては，入力データの送信がなくなり，ストリームデータ処理エンジンへのデータ送信が完了した時点で終了させることができます。

＜この項の構成＞

(1)　データ受信APの終了契機の把握方法

(2)　データ送信APのメソッド呼び出し（putEndメソッド）によるデータ送信終了の通知

(3)　sdpcqlstopコマンドの実行によるクエリグループ停止の通知

(1)　データ受信APの終了契機の把握方法

データ受信APは，ストリームデータ処理エンジンでクエリが実行されている間，結果データの受信を繰り返し実行します。データ受信APを終了するためには，次の状態をデータ受信APで把握する必要があります。

ストリームデータ処理エンジンでのクエリの実行がすべて終了していること

出力ストリームにクエリ結果データが残っていないこと

データ受信AP側では，これらの状態をデータ受信API（getメソッドまたはgetAllメソッド）呼び出し時に発生する例外SDPClientEndOfStreamExceptionまたは例外SDPClientQueryGroupStopExceptionをキャッチすることで把握できます。これらの例外をキャッチしたことを契機として，データ受信APを終了させてください。

なお，これらの例外を発生させるためには，データ送信APでのメソッドの呼び出し，またはコマンドの実行によって，出力ストリームに対してデータ処理終了を通知する必要があります。

それぞれの方法での通知方法について，「(2) データ送信APのメソッド呼び出し（putEndメソッド）によるデータ送信終了の通知」および「(3) sdpcqlstopコマンドの実行によるクエリグループ停止の通知」で説明します。

(2)　データ送信APのメソッド呼び出し（putEndメソッド）によるデータ送信終了の通知

データ送信APからのデータ送信が終了したときに，putEndメソッドを呼び出します。出力ストリームにクエリ結果データがなくなると，データ受信APに対して例外SDPClientEndOfStreamExceptionがスローされます。

putEndメソッドの呼び出しによってデータ送信終了を通知する流れを次の図に示します。

図7-5　データ送信APによるデータ送信終了通知の流れ

図で示した流れの詳細を示します。なお，項番は，図中の番号と対応しています。

データ送信APでは，ストリームデータ処理エンジンに対するストリームデータの送信がすべて終了した際，putEndメソッドによって該当する入力ストリームに対して，データ送信終了を通知します。

ストリームデータ処理エンジンは，クエリグループ内のすべての入力ストリームに対して送信終了が通知されると，入力ストリーム内のすべてのタプルに対してクエリを実行して，クエリ結果データを出力ストリームに出力したあとで，すべての出力ストリームに対して処理終了を通知します。
なお，処理終了が通知されたあとでも，データ受信APは，出力ストリーム内にクエリ結果データがある間はデータを受信し続けます。データの受信には，getメソッドまたはgetAllメソッドを使用します。

出力ストリーム内のすべてのクエリ結果データの受信が完了して，出力ストリームにデータがなくなると，データ受信APでのgetメソッドまたはgetAllメソッド呼び出しに対して例外SDPClientEndOfStreamExceptionがスローされます。
データ受信APでは，この例外を契機として，データ受信APを停止します。

なお，クエリグループ内の入力ストリームの中にputEndメソッドを呼び出していない入力ストリームがある場合，データ受信APからのgetメソッドまたはgetAllメソッド呼び出し時に例外SDPClientEndOfStreamExceptionが発生することはありません。

(3)　sdpcqlstopコマンドの実行によるクエリグループ停止の通知

sdpcqlstopコマンドを実行して，クエリグループを停止します。出力ストリームにクエリ結果データがなくなると，データ受信APに対して例外SDPClientQueryGroupStopExceptionがスローされます。

sdpcqlstopコマンドによるクエリグループ停止の流れを次の図に示します。

図7-6　sdpcqlstopコマンドによるクエリグループ停止の流れ

図で示した流れの詳細を示します。なお，項番は，図中の番号と対応しています。

sdpcqlstopコマンドによってクエリグループ停止を通知すると，ストリームデータ処理エンジンでは，入力ストリームデータの受け付けを停止します。その後，すでに入力ストリームに格納されているデータの処理を実行してから，処理を終了します。
なお，データ受信APでは，コマンド実行後も出力ストリームにクエリ結果データがある間は，getメソッドまたはgetAllメソッドでデータを受信します。

出力ストリームにデータがなくなると，データ受信APでのgetメソッドまたはgetAllメソッドの呼び出し時に例外SDPClientQueryGroupStopExceptionがスローされます。データ受信APでは，この例外を契機として，データ受信APを停止します。

7.4.2　データソースモードでの時刻情報の設定

ストリームデータのタプルの時刻情報をデータソースモードで管理する場合，データ送信APで時刻情報を設定する必要があります。また，送信するタプルの時刻情報が昇順になるように，データ送信APで制御する必要があります。

ここでは，タプルに時刻情報を設定するためにデータ送信APで実装する内容について説明します。また，データ送信後のストリームデータ処理エンジンでの処理についても説明します。

なお，ここで説明する処理は，サーバモードの場合は不要な処理です。

＜この項の構成＞

(1)　タプルへの時刻情報の設定

(2)　タプル送信時の時刻情報の制御

(3)　タプル入力完了後の処理

(1)　タプルへの時刻情報の設定

データソースモードでは，送信するタプルのカラムデータに時刻情報を設定する必要があります。

時刻情報を設定するためには，クエリの定義と，データ送信APでの実装が必要です。それぞれの例を次に示します。

クエリの定義

クエリ定義ファイルに記述するストリーム定義のスキーマ指定文字列に，時刻情報をTIMESTAMP型で定義します。定義例を次に示します。

REGISTER STREAM s1(t1 TIMESTAMP, id INT, name VARCHAR(10));

データ送信APでの実装

データ送信APで，タプルのカラムデータに格納する時刻情報として，java.sql.TimestampクラスのJavaオブジェクトを作成します。実装例を次に示します。

　　　　:
　　　　:
//タプルオブジェクトを生成します
Object[] data = new Object[]{
 new Timestamp(System.currentTimeMillis()),
 new Integer(100),
 new String("data1")
};

//オブジェクトをタプルに設定します
StreamTuple tuple1 = new StreamTuple(data);
　　　　:
　　　　:

注

実際にデータ送信APを作成する場合，new Timestampには，ログファイルなどに含まれるデータソースの時刻情報を抽出して指定してください。

(2)　タプル送信時の時刻情報の制御

データソースモードの場合，送信するタプルの時刻情報が昇順になるように，データ送信APで制御する必要があります。

ストリームデータ処理エンジンでは，入力ストリームごとに，時刻情報の昇順で送信されたタプルに対して処理を実行します。時刻が逆転したタプルが送信された場合，そのタプルはSDPサーバで破棄されますので注意してください。

次の図に，複数の入力ストリームに対して複数のデータ送信APからタプルを送信する場合の処理順序の例を示します。この図では，入力ストリーム1と入力ストリーム2は同じクエリグループに含まれています。また，図中のタプル下に示した数値（「09:00:00」など）は，そのタプルに設定された時刻情報です。

図7-7　複数の入力ストリームに対して複数のデータ送信APからタプルを送信する場合の処理順序の例

一つのクエリグループ内に複数の入力ストリームがある場合，ストリームデータ処理エンジンでは，最も過去の時刻情報が設定されたタプルから処理します。図の例の場合は，入力ストリーム1のタプルを処理したあとで，入力ストリーム2のタプルを処理します。なお，クエリの実行には，putEndメソッドで処理の終了を通知済みのストリーム以外，すべてのストリームにタプルがあることが必要です。一つでも空のストリームがある場合，最も過去のタプルがどのストリームから送信されるかが判断できないため，ストリームデータ処理エンジンは処理を実行しません。

また，時刻情報が逆転したタプルが到着した場合，ストリームデータ処理エンジンでは，そのタプルを破棄します。図の場合は，入力ストリーム3に到着したタプルの時刻情報の順序が逆転していたため，あとから到着したタプルは破棄します。

参考

データソースモードでデータを送信する場合，複数のデータ送信APから送信されたデータについて，誤差によってストリームデータ処理エンジンに到着する順序が逆転して，処理がタイムスタンプ順の昇順にならないことがあります。この場合に，順序が逆転したファイルを破棄しないで処理するためには，タイムスタンプ調整機能を使用して時刻調整を実行する必要があります。タイムスタンプ調整機能による時刻調整については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」の，タプルのタイムスタンプの調整の検討についての説明を参照してください。

(3)　タプル入力完了後の処理

データ送信APからのタプルの入力が完了したら，ストリームデータ処理エンジンに対してデータ送信の完了を通知してください。

データソースモードの場合，ストリームデータ処理エンジンでは，タプルの時刻情報を基に，時系列に処理を実行します。データ送信APからのタプルの入力が完了して，入力ストリームにタプルがなくなると，ストリームデータ処理エンジンの時刻は停止します。ウィンドウ演算などのクエリの処理は動作時刻が進んだときに実行されるため，入力ストリームにタプルがない場合，ストリームデータがストリーム処理エンジン内で滞留してしまうことがあります。

このような滞留を防ぐためには，データ送信AP側で，データ送信の完了を明示的に通知する必要があります。データ送信の完了が通知されると，ストリームデータ処理エンジンでは，滞留しているすべてのタプルの処理を実行して，結果を出力ストリームに出力します。

データ送信完了の通知方法については，「7.4.1　データ受信APの終了契機の把握（データ処理終了の通知）」を参照してください。

7.4.3　キューあふれの事前防止

ストリームデータ処理エンジンとカスタムアダプター間でタプルをやり取りする際，通路として入力ストリームのキュー（入力ストリームキュー）と出力ストリームのキュー（出力ストリームキュー）を使用します。これらのキューは，FIFO方式でタプルを制御します。

入力ストリームキューおよび出力ストリームキューで管理できるタプルの最大値は，次の定義ファイルで指定できます。

system_config.properties

クエリグループ用プロパティファイル

ストリーム用プロパティファイル

指定した値を超えた数のタプルが送信されると，キューあふれが発生します。

ここでは，入力ストリームキューまたは出力ストリームキューでキューあふれが発生した場合の動作，およびキューあふれを事前に防止するための実装方法について説明します。

＜この項の構成＞

(1)　キューあふれが発生した場合の動作

(2)　入力ストリームキューのキューあふれの事前防止

(3)　出力ストリームキューのキューあふれの事前防止

(1)　キューあふれが発生した場合の動作

キューあふれが発生した場合の動作は，入力ストリームキューがあふれた場合と出力ストリームキューがあふれた場合で異なります。

入力ストリームキューでキューあふれが発生した場合の動作について，次の表に示します。

表7-1　入力ストリームキューでキューあふれが発生した場合の動作

項番
タイムスタンプモード
タイムスタンプ調整機能
動作

1
サーバモード
－

データ送信APでは，putメソッドの呼び出しに対して例外SDPClientFreeInputQueueSizeLackExceptionがスローされます。

ストリームデータ処理エンジンでは，データ送信APから送信されたタプル数と入力ストリームキューの空きサイズを比較して入力ストリームキューがあふれる場合，送信されたタプルを一切入力ストリームキューに登録しません。ただし，クエリグループは閉塞しません。

2
データソースモード
有効

データ送信APでは，putメソッドの呼び出しに対して例外SDPClientExceptionがスローされます。

ストリームデータ処理エンジンでは，クエリグループを閉塞します。また，クエリグループの閉塞に伴って，入力ストリームキューに登録されていたすべての入力タプルを破棄します。ただし，その閉塞処理によって出力ストリームキューに登録されたタプルは破棄しません。

3
無効

データ送信APでは，putメソッドの呼び出しに対して例外SDPClientFreeInputQueueSizeLackExceptionがスローされます。

ストリームデータ処理エンジンでは，データ送信APから送信されたタプル数と入力ストリームキューの空きサイズを比較して入力ストリームキューがあふれる場合，送信されたタプルを一切入力ストリームキューに登録しません。ただし，クエリグループは閉塞しません。

（凡例）

－：該当しません。

出力ストリームキューのキューあふれが発生した場合の動作について，次の表に示します。動作は，定義ファイル（system_config.propertiesまたはクエリグループ用プロパティファイル）のquerygroup.sleepOnOverStoreRetryCountパラメーターの指定によって異なります。

表7-2　出力ストリームキューのキューあふれが発生した場合の動作

項番
定義ファイルの指定
動作

1
querygroup.sleepOnOverStoreRetryCount≠0を指定した場合
クエリグループが登録する出力タプル数と出力ストリームキューの空きサイズを比較して，出力ストリームキューがあふれる場合，クエリグループの実行を一時的に停止します（クエリを実行するスレッドをスリープさせます）。
スリープ後，出力ストリームキューに出力タプルを登録した場合に出力ストリームキューがあふれたときは，クエリグループを閉塞します。また，クエリグループの閉塞に伴って，入力ストリームキューに登録されていたすべてのタプルを破棄します。ただし，その閉塞処理の際に出力ストリームキューに登録されたタプルについては，破棄しません。

2
querygroup.sleepOnOverStoreRetryCount＝0を指定した場合
クエリグループを閉塞します。また，クエリグループの閉塞に伴って入力ストリームキューに登録されたすべてのタプルを破棄します。ただし，その閉塞処理の際に出力ストリームキューに登録されたタプルについては，破棄しません。

(2)　入力ストリームキューのキューあふれの事前防止

ここでは，データ送信APの実装によって，入力ストリームキューのキューあふれを事前に防止する方法について説明します。

ポイント

ここで説明する処理を有効にするためには，SDPサーバの定義ファイル（system_config.properties，クエリグループ用プロパティファイル，またはストリーム用プロパティファイル）でstream.freeInputQueueSizeThresholdパラメーターを指定しておく必要があります。

なお，以降の例は，stream.freeInputQueueSizeThreshold=20と指定した場合の例です。

キューあふれを事前に防止するデータ送信APの実装方法について，概要を次の図に示します。

図7-8　入力ストリームキューのキューあふれを事前に防止するデータ送信APの実装方法

図で示した処理の内容について説明します。説明の番号は図中の番号と対応しています。

データ送信APでgetMaxQueueSizeメソッドを呼び出し，入力ストリームのキューの最大サイズを取得します。この値は，手順5.で入力ストリームキューの空きサイズが全体の何割残っているかを算出するときに使用します。

データ送信APでは，putメソッドによって，ストリームデータ処理エンジンに入力タプルを送信します。送信されたタプルは，ストリームデータ処理エンジンのクエリグループで管理されている入力ストリームキューに格納されます。

入力ストリームキューの空きサイズが，定義ファイルに指定したしきい値（stream.freeInputQueueSizeThresholdの指定値）の割合以下になると，ストリームデータ処理エンジンからデータ送信APに例外SDPClientFreeInputQueueSizeThresholdOverExceptionが通知されます。

データ送信APでは，ストリームデータ処理エンジンからの通知によってputメソッドに対してスローされた例外SDPClientFreeInputQueueSizeThresholdOverExceptionをキャッチします。
なお，このとき，定義ファイルにstream.freeInputQueueSizeThresholdOutputMessage=trueを指定していた場合は，メッセージログに次のメッセージが出力されます。

KFSP42032-W ストリームキューの空きサイズが閾値以下になりました。ストリーム名＝…，要素数＝…，上限値＝…，閾値(%)＝…

データ送信APで，getFreeQueueSizeメソッドを呼び出して，入力ストリームキューの空きサイズを取得します。この値を基に，putメソッドの呼び出しを再開できるかどうかを判定します。
再開できると判定した場合，putメソッドの呼び出しを再開します。
再開できないと判定した場合，一定時間スリープしたあとで，再度getFreeQueueSizeメソッドを呼び出して，putメソッドの呼び出しを再開できるか判定します。
この判定処理によって，入力ストリームキューの空きサイズが確保できるまで，putメソッドによるタプルの送信は抑止されます。

注意

stream.freeInputQueueSizeThresholdを指定しても入力ストリームキューがあふれてしまった場合，ストリームデータ処理エンジンは，データ送信APに対して，例外SDPClientFreeInputQueueSizeLackExceptionをスローします。この場合，例外SDPClientFreeInputQueueSizeThresholdOverExceptionはスローされません。

入力ストリームキューのキューあふれを事前に防止する実装例を次に示します。なお，実装例中の処理1と処理2は，判定方法に応じてどちらかの処理を実装してください。

実装例

：
try {
 streamInput = connector.openStreamInput(TARGET_QUERYGROUP, TARGET_STREAM);

 //キューの最大サイズを取得する。
 int maxQueueSize = streamInput.getMaxQueueSize();

 for (int i=0; i<1000; i++){
   Object[] data = new Object[] {
     new Integer(i),
     new String("data:"+i)
     };
   StreamTuple tuple = new StreamTuple(data);

   try {
     streamInput.put(tuple);
   } catch (SDPClientFreeInputQueueSizeThresholdOverException sce) {
     //キューの空きサイズが20%以下になった。
     //（stream.freeInputQueueSizeThreshold=20指定時）。
     while (true) {
       int freeQueueSize = streamInput.getFreeQueueSize();

       //処理1：キューの空きサイズを確認してputメソッドを再開する場合。
       //キューの空きサイズが500以上になったら，putメソッドを再開する。
       if (freeQueueSize >= 500) {
         break;
       } else {
         Thread.sleep(100);
       }
       //処理1はここまで。

       //処理2：キューの空きサイズと最大サイズの割合を確認して
       //putメソッドを再開する場合。
       double freePerMax = ((double)freeQueueSize / (double)maxQueueSize) * 100;
       //キューの空きサイズが50%以上となったら，putメソッドを再開する。
       if (freePerMax >= 50) {
         break;
       } else {
         Thread.sleep(100);
       }
       //処理2はここまで。

     }
   } catch (SDPClientFreeInputQueueSizeLackException sce2) {
     //キュー空きサイズがない。
     //(putメソッドで送信したタプルはストリームデータ処理エンジンに
     //受け付けられなかった)。
     //このため，タプルを再送する前にスリープする。
     Thread.sleep(100);
     try {
       //タプルを再送する。
       streamInput.put(tuple);
     } catch (SDPClientFreeInputQueueSizeThresholdOverException sce3) {
       //タプルの再送が成功したので，ここでのしきい値例外は無視する。
     }
   }
 }
 streamInput.putEnd();
} catch (SDPClientFreeInputQueueSizeLackException sce4) {
 //キューの空きサイズがない。
 //(putメソッドで送信したタプルはストリームデータ処理エンジンに
 //受け付けられなかった)。
 ：（省略）
 //送信を停止する。
 streamInput.putEnd();
 :（省略）
} catch (...) {
 //その他の例外をcatchしたときの処理を実装する。
 ：（省略）

(3)　出力ストリームキューのキューあふれの事前防止

出力ストリームキューのキューあふれは，定義ファイルのquerygroup.sleepOnOverStoreRetryCountパラメーターおよびquerygroup.sleepOnOverStoreパラメーターの指定で防止します。これらのパラメーターの指定によって，出力ストリームキューがあふれそうな場合に，クエリグループの実行が一時停止（スリープ）されます。

また，「(2) 入力ストリームキューのキューあふれの事前防止」で示した実装をしておくことで，クエリグループの実行が一時停止した場合に，入力ストリームキューに対する入力タプルの送信も抑止できるため，キューをあふれさせることなく，システムの処理を正常に戻すことができます。

出力ストリームキューのキューあふれが事前に防止される処理の概要について，次の図に示します。データ送信APの実装は，「(2) 入力ストリームキューのキューあふれの事前防止」と同じです。

ポイント

ここで説明する処理を有効にするためには，SDPサーバの定義ファイルで次のパラメーターを指定しておく必要があります。

stream.freeInputQueueSizeThreshold

querygroup.sleepOnOverStoreRetryCount

querygroup.sleepOnOverStore

なお，この例は，それぞれ，stream.freeInputQueueSizeThreshold=20，querygroup.sleepOnOverStoreRetryCount=1，querygroup.sleepOnOverStore=100と指定した場合の例です。

図7-9　出力ストリームキューのキューあふれが事前に防止される処理の概要

図で示した処理の内容について説明します。説明の番号は図中の番号と対応しています。

データ送信APでgetMaxQueueSizeメソッドを呼び出し，入力ストリームのキューの最大サイズを取得します。この値は，入力ストリームキューの空きサイズが全体の何割残っているかを算出するときに使用します。

データ送信APでは，putメソッドによって，ストリームデータ処理エンジンにタプルを送信します。送信されたタプルは，ストリームデータ処理エンジンのクエリグループで管理されている入力ストリームキューに格納されます。

ストリームデータ処理エンジンでは，クエリ実行によって送信された出力タプルによって出力ストリームキューがあふれることを検知すると，クエリグループの実行を一時停止（スリープ）します。スリープするかどうかの設定，およびスリープさせる時間については，querygroup.sleepOnOverStoreRetryCountパラメーターおよびquerygroup.sleepOnOverStoreパラメーターの指定値に従います。
クエリグループがスリープすると，ストリームデータ処理エンジンは，メッセージログに次のメッセージを出力します。

KFSP42033-W ストリームキューへのタプルの登録をリトライします。クエリグループ名＝…，ストリーム名＝…，リトライまでのスリープ時間＝…，リトライ回数＝…

なお，このとき，スリープ中のクエリグループのステータスは「実行中」となっています。データ送信APによる入力ストリームキューに対するタプルの送信，およびデータ受信APによる出力ストリームキューからのタプルの取得は許可されています。

クエリグループの実行がスリープしている間，データ送信APがputメソッドを呼び出し続けると，入力ストリームキューに処理されていないタプルが蓄積されていきます。入力ストリームキューの空きサイズが，定義ファイルに指定したしきい値（stream.freeInputQueueSizeThresholdパラメーターの指定値）の割合以下になると，ストリームデータ処理エンジンからデータ送信APに例外SDPClientFreeInputQueueSizeThresholdOverExceptionが通知されます。

データ送信APでは，ストリームデータ処理エンジンからの通知によってputメソッドに対してスローされた例外SDPClientFreeInputQueueSizeThresholdOverExceptionをキャッチします。

データ送信APで，getFreeQueueSizeメソッドを呼び出して，入力ストリームキューの空きサイズを取得します。この値を基に，putメソッドの呼び出しを再開できるかどうかを判定します。
再開できると判定した場合，putメソッドの呼び出しを再開します。
再開できないと判定した場合，一定時間スリープしたあとで，再度getFreeQueueSizeメソッドを呼び出して，putメソッドの呼び出しを再開できるか判定します。
この処理によって，入力ストリームキューの空きサイズが確保できるまで，putメソッドによる入力タプルの送信は抑止されます。出力ストリームキューの空きサイズが確保され，クエリグループの実行が再開されて入力ストリームキューのタプルが処理されると，再度，入力タプルの送信ができるようになり，システムが正常な状態に戻ります。

7.5　コンパイル手順

カスタムアダプターのコンパイルは，次の手順で実行してください。

準備として，環境変数を定義します。
Stream Data Platform - AFのセットアップ実行時に設定した運用ユーザーの環境変数PATHに，次のパスを追加してください。この手順は，2度目以降のコンパイルでは不要な手順です。

＜インストールディレクトリ＞¥psb¥jdk¥bin

コンパイルを実行します。
次のコマンドを実行してください。

javac -cp ＜インストールディレクトリ＞¥lib¥sdp.jar Javaソースプログラム

jarファイルを作成します（インプロセス連携カスタムアダプターの場合）。
インプロセス連携カスタムアダプターの場合，コンパイルして生成されたクラスファイルをまとめたjarファイルを作成してください。
次に，testディレクトリ下のクラスファイル「A.class」と「B.class」を「test.jar」というファイルにまとめる場合のコマンドの実行例を示します。

jar cf test.jar test¥A.class test¥B.class

7.6　カスタムアダプター作成時の留意事項

ここでは，カスタムアダプター作成時の留意事項について説明します。

カスタムアダプターのデータ送信APおよびデータ受信APは，次の方針で作成してください。

同一ストリームに対して複数回接続しないでください。
一つのストリームは，それぞれ1回だけ接続するようにしてください。
一つのSDPConnector型オブジェクトでは，同一のストリームに対して複数回接続できませんが，複数のSDPConnector型オブジェクトを使用すると，同一ストリームに複数回接続できます。しかし，複数回接続した場合，ストリームデータ処理エンジンのスループットが下がります。

データ受信APの処理負荷に対して，クエリ結果データの出力ストリームへの出力頻度が高い場合は，次のどちらかの方法を使用して，データ受信APの通信コストを抑えてください。

複数のクエリ結果のポーリング方式での受信をgetAllメソッドで一括受信してください。これによって，データ転送の通信コストを抑えられます。

データ受信APをSDPサーバと同一プロセスで動作するように，インプロセス連携カスタムアダプターとして作成してください。これによって，プロセス間通信に掛かる通信コストを抑えられます。

通信コストを抑えることで，出力ストリームキューのタプルの滞留を防止できるため，キューあふれ防止にもなります。

クエリ結果の出力頻度が小さい場合は，データ受信APをSDPサーバと同一プロセスで動作するインプロセス連携カスタムアダプターとして作成して，データ受信をコールバック受信方式にすることをお勧めします。これによって，システムのCPU利用率を低減できます。

RMI連携カスタムアダプターを作成する場合，mainメソッドは次のように宣言してください。

public static void main(String[])

RMI連携カスタムアダプター起動時に実行するコマンド（sdpstartap）では，メインクラスのmainメソッドが実行されます。

RMI連携カスタムアダプターを作成する場合，アプリケーションの終了コードとして1は使用しないでください。

8.　データ送受信用API

この章では，カスタムアダプターの作成で使用するデータ送受信用APIの文法について説明します。

＜この章の構成＞

8.1　データ送受信用APIの記述形式

8.2　データ送受信用APIの一覧

8.3　SDPConnectorインタフェース（共通API）

8.4　SDPConnectorFactoryクラス（RMI連携用）

8.5　StreamEventListenerインタフェース（インプロセス連携用）

8.6　StreamInprocessUPインタフェース（インプロセス連携用）

8.7　StreamInputインタフェース（共通API）

8.8　StreamOutputインタフェース（共通API）

8.9　StreamTimeクラス（共通API）

8.10　StreamTupleクラス（共通API）

8.11　例外クラス（共通API）

8.1　データ送受信用APIの記述形式

ここでは，データ送受信用APIの記述形式について説明します。

各APIで説明する項目は次のとおりです。ただし，APIによっては説明しない項目もあります。

形式

APIの記述形式を示します。

説明

APIの機能について説明します。

パラメーター

APIのパラメーターについて説明します。

例外

APIを利用する際に発生する例外について説明します。

戻り値

APIの戻り値について説明します。

注意事項

APIを利用する上での注意事項について説明します。

8.2　データ送受信用APIの一覧

データ送受信用APIは，次の3種類に分類できます。作成するカスタムアダプターに合わせて使用してください。

共通API
RMI連携カスタムアダプター作成時，およびインプロセス連携カスタムアダプター作成時の両方で使用するAPIです。

RMI連携用API
RMI連携カスタムアダプター作成時に使用するAPIです。

インプロセス連携用API
インプロセス連携カスタムアダプター作成時に使用するAPIです。

データ送受信用APIのインタフェースおよびクラスの一覧を示します。

表8-1　データ送受信用API一覧（インタフェース）

項番 | パッケージ名 | インタフェース名 | 機能 | 種類
1 | jp.co.Hitachi.soft.sdp.api | SDPConnector | SDPサーバとカスタムアダプターを結ぶコネクターのインタフェースです。入力ストリームへ接続する場合，または出力ストリームへ接続する場合に使用します。 | 共通API
2 | StreamInput | SDPサーバにストリームデータを送信する場合，および入力ストリームとの接続を切断する場合に使用するインタフェースです。 | 共通API
3 | StreamOutput | SDPサーバからのクエリ結果データの受信，コールバック用リスナーオブジェクトの登録・解除，および出力ストリームとの接続を閉じるために使用するインタフェースです。 | 共通API
4 | jp.co.Hitachi.soft.sdp.api.inprocess | StreamEventListener | コールバックされるメソッドの処理を実装するためのインタフェースです。 | インプロセス連携用API
5 | StreamInprocessUP | カスタムアダプターのmainメソッドに相当するメイン処理を実装するためのインタフェースです。SDPサーバ起動時にStreamInprocessUPインタフェースの実装クラスがロードされ，実行されます。 | インプロセス連携用API

表8-2　データ送受信用API一覧（クラス）

項番 | パッケージ名 | クラス名 | 機能 | 種類
1 | jp.co.Hitachi.soft.sdp.api | SDPConnectorFactory | SDPConnector型オブジェクトを生成するためのクラスです。 | RMI連携用API
2 | jp.co.Hitachi.soft.sdp.common.util | StreamTime | 日付・時刻指定処理のためのクラスです。 | 共通API
3 | jp.co.Hitachi.soft.sdp.common.data | StreamTuple | ストリームタプルを表現するクラスです。 | 共通API

以降では，インタフェースおよびクラスをアルファベット順に説明します。

8.3　SDPConnectorインタフェース（共通API）

説明

SDPサーバとの接続で使用するコネクターとしての機能を持つインタフェースです。コネクターは，SDPConnector型オブジェクトとして生成されます。

SDPサーバに登録されているクエリグループの入力ストリームまたは出力ストリームには，コネクターを使用して接続します。

ストリームには，SDPConnectorインタフェースのopenStreamInputメソッドまたはopenStreamOutputメソッドを使用して接続します。ただし，一つのコネクターで同一名称のストリームに複数回接続することはできません。

コネクターは，SDPサーバとカスタムアダプター間のデータ連携の方法ごとに，次の処理によって生成されます。

SDPサーバとRMIで連携するコネクターの生成
SDPConnectorFactoryクラスのconnectメソッドを呼び出すことで，SDPサーバとRMIで連携したコネクターが生成されます。

SDPサーバとインプロセスで連携するコネクターの生成
sdpstartinproコマンド実行時に，SDPサーバとインプロセスで連携したコネクターが生成されます。インプロセス連携カスタムアダプターでは，生成されたSDPConnector型オブジェクトをStreamInprocessUPインタフェースのexecuteメソッドのパラメーターとして受け取ります。

フィールド

なし。

コンストラクター

なし。

メソッド

SDPConnectorインタフェースのメソッド一覧を次の表に示します。

戻り値
メソッド名
機能

void
close()
コネクターを閉じます。

boolean
isClosed()
コネクターが閉じているかどうかを確認します。

StreamInput
openStreamInput(String group_name,String stream_name)
パラメーターに指定したグループ名およびストリーム名に対応する入力ストリームに接続します。
同一のSDPConnector型オブジェクトでは，同一名称のストリームに複数回接続できません。

StreamOutput
openStreamOutput(String group_name,String stream_name)
パラメーターに指定したグループ名およびストリーム名に対応する出力ストリームへ接続します。同一のSDPConnector型オブジェクトでは，同一名称のストリームに複数回接続できません。

注意事項

なし。

＜この節の構成＞

close()メソッド

isClosed()メソッド

openStreamInput(String group_name,String stream_name)メソッド

openStreamOutput(String group_name,String stream_name)メソッド

close()メソッド

形式

void close()

説明

コネクターを閉じます。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | コネクターがすでに閉じていた場合

戻り値

なし。

isClosed()メソッド

形式

boolean isClosed()

説明

コネクターが閉じているかどうかを確認します。

パラメーター

なし。

例外

なし。

戻り値

true

コネクターは閉じています。

false

コネクターは開いています。

openStreamInput(String group_name,String stream_name)メソッド

形式

StreamInput openStreamInput(String group_name,String stream_name)

説明

パラメーターに指定したグループ名およびストリーム名に対応する入力ストリームに接続します。同一のSDPConnector型オブジェクトでは，同一名称のストリームに複数回接続できません。

パラメーター

group_name

クエリグループ名を指定します。

stream_name

ストリーム名を指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

NullPointerException
パラメーターにnullを指定した場合

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

存在しないグループ名またはストリーム名を指定した場合

同じSDPConnector型オブジェクトを使用して，同一の入力ストリームとすでに接続している場合

入力ストリームではないストリームを指定した場合

コネクターがすでに閉じている場合

戻り値

接続した入力ストリーム（StreamInput型オブジェクト）。

openStreamOutput(String group_name,String stream_name)メソッド

形式

StreamOutput openStreamOutput(String group_name,String stream_name)

説明

パラメーターに指定したグループ名およびストリーム名に対応する出力ストリームに接続します。同一のSDPConnector型オブジェクトでは，同一名称のストリームに複数回接続できません。

パラメーター

group_name

クエリグループ名を指定します。

stream_name

ストリーム名を指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

NullPointerException
パラメーターにnullを指定した場合

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

存在しないグループ名またはストリーム名を指定した場合

同じSDPConnector型オブジェクトを使用して，同一の出力ストリームにすでに接続をしている場合

コネクターがすでに閉じている場合

SDPClientRelationStateException
指定したストリームがリレーション状態である場合

戻り値

接続した出力ストリーム（StreamOutput型オブジェクト）。

8.4　SDPConnectorFactoryクラス（RMI連携用）

クラス階層

jp.co.Hitachi.soft.sdp.api.SDPConnectorFactory

説明

SDPConnector型オブジェクトの生成処理を実装するファクトリクラスです。このクラスのconnectメソッドを実行すると，SDPサーバとRMI通信で接続した状態のSDPConnector型オブジェクトが生成されます。

メソッド

SDPConnectorFactoryクラスのメソッド一覧を次の表に示します。

戻り値 | メソッド名 | 機能
SDPConnector | connect() | SDPサーバとRMI通信で接続した状態のSDPConnector型オブジェクトを生成します。

注意事項

connectメソッドはstaticメソッドです。

＜この節の構成＞

connect()メソッド

connect()メソッド

形式

SDPConnector connect()

説明

SDPサーバとRMI通信で接続した状態のSDPConnector型オブジェクトを生成します。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | system_config.propertiesの解析に失敗した場合

戻り値

SDPサーバとのコネクター（SDPConnector型オブジェクト）。

8.5　StreamEventListenerインタフェース（インプロセス連携用）

説明

SDPサーバ上で，タプルが生成されたときにコールバックされるメソッドの処理を実装するインタフェースです。

カスタムアダプターでは，StreamEventListenerインタフェースを実装したクラスを作成して，onEventメソッドにコールバック時の処理を記述します。

StreamOutputインタフェースのregisterForNotificationメソッドを使用して，StreamEventListenerインタフェースを実装したクラスのオブジェクトを登録すると，以降，SDPサーバ上でタプルが生成されたときに，登録したオブジェクトのonEventメソッドがコールバックされます。

メソッド

StreamEventListenerインタフェースのメソッド一覧を次の表に示します。

戻り値 | メソッド名 | 機能
void | onEvent(StreamTuple tuple) | SDPサーバ上でタプルが生成されたときにコールバックされるメソッドです。

注意事項

StreamEventListenerインタフェースはjava.rmi.Remoteクラスを継承しています。

＜この節の構成＞

onEvent(StreamTuple tuple)メソッド

onEvent(StreamTuple tuple)メソッド

形式

void onEvent(StreamTuple tuple)

説明

SDPサーバ上でタプルが生成されたときにコールバックされるメソッドです。

パラメーター

tuple

生成されたタプルが指定されます。

例外

なし。

戻り値

なし。

8.6　StreamInprocessUPインタフェース（インプロセス連携用）

説明

カスタムアダプターがSDPサーバとインプロセスで連携するためには，StreamInprocessUPインタフェースを実装するクラスを作成する必要があります。

StreamInprocessUPインタフェースには，executeメソッドとstopメソッドがあります。

executeメソッドには，カスタムアダプターのmainメソッドに相当するメイン処理を記述します。stopメソッドには，カスタムアダプターの終了処理を記述します。

sdpstartinproコマンドを実行してインプロセス連携カスタムアダプターを起動すると，SDPサーバによってStreamInprocessUPインタフェースを実装したクラスがロードされ，executeメソッドを実行するためのスレッド（カスタムアダプター実行スレッド）が生成されます。executeメソッドはこのスレッドから呼び出されるメソッドです。なお，SDPサーバによってロードされる実装クラス名，およびその実装クラスが格納されたjarファイルのパス名は，プロパティファイルuser_app.＜インプロセス連携カスタムアダプター名＞.propertiesに記述します。プロパティファイルについては，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

stopメソッドは，sdpstopinproコマンドを実行してインプロセス連携カスタムアダプターを停止するときに，SDPサーバ側のスレッドから呼び出されます。

メソッド

StreamInprocessUPインタフェースのメソッド一覧を次の表に示します。

戻り値
メソッド名
機能

void
execute(SDPConnector con)
カスタムアダプターのメイン処理を記述します。
このメソッドは，sdpstartinproコマンド実行時に，SDPサーバが生成したカスタムアダプター実行スレッドによって呼び出されます。

void
stop()
カスタムアダプターの終了処理を記述します。
このメソッドは，sdpstopinproコマンド実行時に，SDPサーバ側のスレッドによって呼び出されます。

注意事項

StreamInprocessUPインタフェースのexecuteメソッドで起動したユーザースレッドは，stopメソッドの中で必ず停止してください。stopメソッドに停止処理を記述しなかった場合，またはstopメソッドで停止できない無限ループなどの処理がユーザースレッドに含まれる場合，ユーザースレッドが停止されないで残ることがあります。

StreamInprocessUPインタフェースのexecuteメソッドに無限ループなどの処理を記述した場合，executeメソッド自身の実行スレッドが残ってしまうことがあります。

カスタムアダプターに任意の引数を渡す場合は，String型の可変長引数を持つコンストラクターを実装してください。リフレクション経由で作成したString型の可変長引数を持つコンストラクターが呼ばれます。その引数として，sdpstartinproコマンドで定義した任意の引数が渡されます。なお，String型の可変長引数を持つコンストラクターを実装していない場合は，デフォルトコンストラクターが呼ばれます（ただし，引数は渡されません）。

カスタムアダプターに任意の引数を渡さない場合は，String型の可変長引数を持つコンストラクターまたはデフォルトコンストラクターのどちらかを実装してください。どちらも実装している場合は，String型の可変長引数を持つコンストラクターが呼ばれます。

String型の可変長引数を持つコンストラクターまたはデフォルトコンストラクターのどちらも実装していない場合は，エラーとなり，カスタムアダプターは起動しません。

＜この節の構成＞

execute(SDPConnector con)メソッド

stop()メソッド

execute(SDPConnector con)メソッド

形式

void execute(SDPConnector con)

説明

カスタムアダプターのメイン処理を記述します。

このメソッドは，sdpstartinproコマンド実行時に，SDPサーバが生成したカスタムアダプター実行スレッドによって呼び出されます。

パラメーター

con

SDPConnector型オブジェクトを指定します。

例外

なし。

戻り値

なし。

stop()メソッド

形式

void stop()

説明

カスタムアダプターの終了処理を記述します。

このメソッドは，sdpstopinproコマンド実行時に，SDPサーバ側のスレッドによって呼び出されます。

パラメーター

なし。

例外

なし。

戻り値

なし。

8.7　StreamInputインタフェース（共通API）

説明

カスタムアダプターがSDPサーバに対してタプルを送信するために使用するインタフェースです。

タプルを送信するには，putメソッドを使用します。putメソッドには，複数のタプルをまとめて送信するメソッドと，単一のタプルを送信するメソッドの2種類があります。

メソッド

StreamInputインタフェースのメソッド一覧を次の表に示します。

戻り値
メソッド名
機能

void
close()
入力ストリームとの接続を閉じます。

int
getFreeQueueSize()
入力ストリームキューの空きサイズを取得します。

int
getMaxQueueSize()
入力ストリームキューの最大サイズを取得します。

boolean
isStarted()
データソースモードの場合に，入力ストリームが新たなストリームデータの受付を開始しているかどうかを確認します。

void
put(ArrayList<StreamTuple> tuple_list)
複数のタプルを送信します。

void
put(StreamTuple tuple)
単一のタプルを送信します。

void
putEnd()
入力ストリームに対して，ストリームデータ入力が終了したことを通知します。
このメソッドによって入力完了を通知したあと，クエリグループの再開前にputメソッドやputEndメソッドを実行した場合は，例外が返されます。

注意事項

なし。

＜この節の構成＞

close()メソッド

getFreeQueueSize()メソッド

getMaxQueueSize()メソッド

isStarted()メソッド

put(ArrayList<StreamTuple> tuple_list)メソッド

put(StreamTuple tuple)メソッド

putEnd()メソッド

close()メソッド

形式

void close()

説明

入力ストリームとの接続を閉じます。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientException | 入力ストリームがすでに閉じていた場合

戻り値

なし。

getFreeQueueSize()メソッド

形式

int getFreeQueueSize()

説明

入力ストリームキューの空きサイズを取得します。

入力ストリームキューの空きサイズは，system_config.propertiesのengine.maxQueueSizeパラメーターに指定した値から，使用中のサイズを引いた値です。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | 入力ストリームがすでに閉じている場合
SDPClientQueryGroupHoldException | クエリグループが閉塞中の場合（SDPClientQueryGroupStateExceptionの詳細例外）
SDPClientQueryGroupNotExistException | クエリグループが削除された場合
SDPClientQueryGroupStateException | クエリグループが実行中でない場合
SDPClientQueryGroupStopException | クエリグループが停止中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

戻り値

入力ストリームキューの空きサイズ（int）。

getMaxQueueSize()メソッド

形式

int getMaxQueueSize()

説明

入力ストリームキューの最大サイズを取得します。

入力ストリームキューの最大サイズは，system_config.propertiesのengine.maxQueueSizeパラメーターに指定した値です。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientException | 入力ストリームがすでに閉じている場合
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合

戻り値

入力ストリームキューの最大サイズ（int）。

isStarted()メソッド

形式

boolean isStarted()

説明

データソースモードの場合に，入力ストリームが新たなストリームデータの受付を開始しているかどうかを確認します。

パラメーター

なし。

例外

例外の一覧を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

入力ストリームがすでに閉じている場合

サーバモードで動作中のストリームの場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中ではない場合

SDPClientQueryGroupStopException
クエリグループが停止中の場合

戻り値

true

ストリームデータの受付を開始しています。

false

ストリームデータの受付を開始していません。

put(ArrayList<StreamTuple> tuple_list)メソッド

形式

void put(ArrayList<StreamTuple> tuple_list)

説明

複数のタプルを送信します。

パラメーター

tuple_list

送信するタプル（StreamTuple型オブジェクト）のリストを指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

ClassCastException
パラメーターのリスト内にStreamTuple以外の要素が含まれていた場合

NullPointerException

パラメーターにnullまたはnullを含むリストを指定した場合

リストの要素であるデータオブジェクト配列内にnullを含むStreamTuple型オブジェクトを指定した場合

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

タプルのリストに含まれる要素のデータ型がストリーム定義と異なる場合

入力ストリームがすでに閉じていた場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中ではない場合

SDPClientQueryGroupStopException
クエリグループが停止中の場合

戻り値

なし。

put(StreamTuple tuple)メソッド

形式

void put(StreamTuple tuple)

説明

単一のタプルを送信します。

パラメーター

tuple

送信するタプル（StreamTuple型オブジェクト）を指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

NullPointerException

パラメーターにnullを指定した場合

データオブジェクト配列内にnullを含むStreamTuple型オブジェクトを指定した場合

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

タプルの要素のデータ型がストリーム定義と異なる場合

入力ストリームがすでに閉じていた場合

SDPClientFreeInputQueueSizeLackException
入力ストリームキューの空きサイズが不足している場合（この場合，入力ストリームキューにタプルは投入されません）

SDPClientFreeInputQueueSizeThresholdOverException
入力ストリームキューの空きサイズがstream.freeInputQueueSizeThresholdパラメーターで指定したしきい値以下になった場合（この場合，入力ストリームキューにタプルは投入されます）

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中ではない場合

SDPClientQueryGroupStopException
クエリグループが停止中の場合

戻り値

なし。

putEnd()メソッド

形式

void putEnd()

説明

入力ストリームに対して，ストリームデータの入力が終了したことを通知します。

このメソッドによって入力完了を通知したあと，クエリグループの再開前にputメソッドやputEndメソッドを実行した場合は，例外が返されます。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientException

入力ストリームがすでに閉じている場合

入力ストリームがすでにストリームデータの受付を停止している場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中でない場合

SDPClientQueryGroupStopException
クエリグループが停止中の場合

戻り値

なし。

8.8　StreamOutputインタフェース（共通API）

説明

カスタムアダプターがSDPサーバからタプルを受信するために使用するインタフェースです。

タプルを受信するためのAPIには，次の2種類があります。

ポーリング用メソッド

コールバック用メソッド

ポーリング用メソッドは，カスタムアダプターがSDPサーバから能動的にタプルを取得するためのメソッドです。getメソッドとgetAllメソッドがあります。getメソッドは，単一のタプルを受信するメソッドです。getAllメソッドは，複数のタプルをまとめて受信するメソッドです。

コールバック用メソッドは，SDPサーバ上でタプルが生成されたときに呼び出され，受動的にタプルを取得するためのメソッドです。コールバック方式でデータを受信するには，SDPサーバ上でタプルが生成されたときにSDPサーバから呼び出されるメソッドを持つオブジェクト（リスナーオブジェクト）をSDPサーバに登録しておく必要があります。

リスナーオブジェクトは，StreamEventListenerインタフェースを実装したオブジェクトです。StreamOutputインタフェースには，このリスナーオブジェクトをSDPサーバに登録するためのメソッドとして，registerForNotificationメソッドがあります。また，リスナーオブジェクトのSDPサーバへの登録を解除するためのメソッドとして，unregisterForNotificationメソッドがあります。

メソッド

StreamOutputインタフェースのメソッド一覧を次の表に示します。

戻り値 | メソッド名 | 機能
void | close() | 出力ストリームとの接続を閉じます。
StreamTuple | get() | SDPサーバに登録されているタプルを一つだけ取得します。
ArrayList<StreamTuple> | get(int count) | SDPサーバに登録されているデータをcountパラメーターに指定した数だけ取得します。
ArrayList<StreamTuple> | get(int count, long timeout) | SDPサーバに登録されているデータをcountパラメーターに指定した数だけ取得します。SDPサーバに結果データがない場合，結果データが到着するか，またはtimeoutパラメーターに指定した時間が経過するまで待機します。
ArrayList<StreamTuple> | getAll() | SDPサーバに登録されているすべてのタプルを取得します。
ArrayList<StreamTuple> | getAll(long timeout) | SDPサーバに登録されているすべてのタプルを取得します。SDPサーバに結果データがない場合，結果データが到着するか，またはtimeoutパラメーターに指定した時間が経過するまで待機します。
int | getFreeQueueSize() | 出力ストリームキューの空きサイズを取得します。
int | getMaxQueueSize() | 出力ストリームキューの最大サイズを取得します。
void | registerForNotification(StreamEventListener n) | コールバック用リスナーオブジェクトを登録します。
void | unregisterForNotification(StreamEventListener n) | 登録したリスナーオブジェクトを解除して，以降のコールバック処理の実行を解除します。

注意事項

なし。

＜この節の構成＞

close()メソッド

get()メソッド

get(int count)メソッド

get(int count, long timeout)メソッド

getAll()メソッド

getAll(long timeout)メソッド

getFreeQueueSize()メソッド

getMaxQueueSize()メソッド

registerForNotification(StreamEventListener n)メソッド

unregisterForNotification(StreamEventListener n)メソッド

close()メソッド

形式

void close()

説明

出力ストリームとの接続を閉じます。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | 出力ストリームがすでに閉じている場合

戻り値

なし。

get()メソッド

形式

StreamTuple get()

説明

SDPサーバに登録されているタプルを一つだけ取得します。

出力ストリームキューにタプルがない場合は，nullが返却されます。

このメソッドを呼び出した時点でクエリグループに対して停止が通知されていた場合（メソッドによってデータ送信終了が通知された場合，またはコマンドによってクエリグループ停止が通知された場合），次のように処理されます。

停止通知後，最初のメソッド呼び出しの場合
nullが返却されます。

停止通知後，2回目以降のメソッド呼び出しの場合
例外がスローされます。

このメソッドはポーリング用メソッドです。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientEndOfStreamException
送信データの処理が終了している場合

SDPClientException

出力ストリームがすでに閉じている場合

コールバック用リスナーオブジェクトがすでに登録されている場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中ではない場合

SDPClientQueryGroupStopException
結果データがなく，クエリグループが停止中の場合

戻り値

取得したタプル（StreamTuple型オブジェクト）。

get(int count)メソッド

形式

ArrayList<StreamTuple> get(int count)

説明

SDPサーバに登録されているデータをcountパラメーターに指定した数だけ取得します。

SDPサーバに結果データがない場合，空のArrayList型オブジェクトが返却されます。

このメソッドを呼び出した時点でクエリグループに対して停止が通知されていた場合（メソッドによってデータ送信終了が通知された場合，またはコマンドによってクエリグループ停止が通知された場合），次のように処理されます。

停止通知後，最初のメソッド呼び出しの場合
空のArrayList型オブジェクトが返却されます。

停止通知後，2回目以降のメソッド呼び出しの場合
例外がスローされます。

このメソッドは，ポーリング用メソッドです。

パラメーター

count

SDPサーバから取得するデータの数を指定します。指定可能範囲は1～1,048,576です。

なお，実際に取得できるデータの数は，このパラメーターと出力ストリームキューの状態によって次に示すようになります。

条件 | 取得できる数
countの指定値 ≦ 出力ストリームキューのデータ数 | countパラメーターに指定した数
countの指定値 ＞ 出力ストリームキューのデータ数 | 出力ストリームキューのデータ数
countの指定値 ＞ 出力ストリームキューの最大サイズ

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientEndOfStreamException
送信データの処理が終了している場合

SDPClientException

出力ストリームがすでに閉じている場合

コールバック用リスナーオブジェクトがすでに登録されている場合

パラメーターが不正の場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中でない場合

SDPClientQueryGroupStopException
結果データがなく，かつクエリグループが停止中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

戻り値

タプルのリスト（ArrayList<StreamTuple>型オブジェクト）。

get(int count, long timeout)メソッド

形式

ArrayList<StreamTuple> get(int count, long timeout)

説明

SDPサーバに登録されているデータをcountパラメーターに指定した数だけ取得します。

SDPサーバに結果データがない場合，結果データが到着するか，またはtimeoutパラメーターに指定した時間が経過するまで待機します。待機中に結果データが到着した場合，到着したデータを格納したArrayList型オブジェクトが返却されます。timeoutパラメーターに指定した時間が経過した場合，または待機中のスレッドに割り込みが発生した場合は，次のどちらかのオブジェクトが返却されます。

データが登録されている場合
登録されたデータが格納されたArrayList型オブジェクトが返却されます。

データが登録されていない場合
空のArrayList型オブジェクトが返却されます。

このメソッドを呼び出した時点でクエリグループに対して停止が通知されていた場合（メソッドによってデータ送信終了が通知された場合，またはコマンドによってクエリグループ停止が通知された場合），次のように処理されます。

停止通知後，最初のメソッド呼び出しの場合
空のArrayList型オブジェクトが返却されます。

停止通知後，2回目以降のメソッド呼び出しの場合
例外がスローされます。

このメソッドは，ポーリング用メソッドです。

パラメーター

count

SDPサーバから取得するデータの数を指定します。指定可能範囲は1～1,048,576です。

なお，実際に取得できるデータの数は，このパラメーターと出力ストリームキューの状態によって次に示すようになります。

条件 | 取得できる数
countの指定値 ≦ 出力ストリームキューのデータ数 | countパラメーターに指定した数
countの指定値 ＞ 出力ストリームキューのデータ数 | 出力ストリームキューのデータ数
countの指定値 ＞ 出力ストリームキューの最大サイズ

timeout

データがない場合に，待機する最大時間をミリ秒で指定します。

指定した値によって，次の処理が実行されます。

指定した値 | 実行される処理
負の数 | 待機しません。
0 | 結果データが到着するか，またはストリームが終了するまで待機します。
そのほかの値 | 結果データが到着するか，または指定時間が経過するまで待機します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientEndOfStreamException
送信データの処理が終了している場合

SDPClientException

出力ストリームがすでに閉じている場合

コールバック用リスナーオブジェクトがすでに登録されている場合

パラメーターが不正の場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中でない場合

SDPClientQueryGroupStopException
結果データがなく，かつクエリグループが停止中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

戻り値

タプルのリスト（ArrayList<StreamTuple>型オブジェクト）。

getAll()メソッド

形式

ArrayList<StreamTuple> getAll()

説明

SDPサーバに登録されているすべてのタプルを取得します。

SDPサーバに結果データがない場合，空のArrayList型オブジェクトが返却されます。

このメソッドを呼び出した時点でクエリグループに対して停止が通知されていた場合（メソッドによってデータ送信終了が通知された場合，またはコマンドによってクエリグループ停止が通知された場合），次のように処理されます。

停止通知後，最初のメソッド呼び出しの場合
空のArrayList型オブジェクトが返却されます。

停止通知後，2回目以降のメソッド呼び出しの場合
例外がスローされます。

このメソッドはポーリング用メソッドです。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientEndOfStreamException
送信データの処理が終了している場合

SDPClientException

出力ストリームがすでに閉じている場合

コールバック用リスナーオブジェクトがすでに登録されている場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中でない場合

SDPClientQueryGroupStopException
結果データがなく，クエリグループが停止中の場合

戻り値

タプルのリスト（ArrayList<StreamTuple>型オブジェクト）。

getAll(long timeout)メソッド

形式

ArrayList<StreamTuple> getAll(long timeout)

説明

SDPサーバに登録されているすべてのタプルを取得します。

SDPサーバに結果データがない場合，結果データが到着するか，またはtimeoutパラメーターに指定した時間が経過するまで待機します。待機中に結果データが到着した場合，到着したデータを格納したArrayList型オブジェクトが返却されます。timeoutパラメーターに指定した時間が経過した場合，または待機中のスレッドに割り込みが発生した場合は，次のどちらかのオブジェクトが返却されます。

データが登録されている場合
登録されたデータが格納されたArrayList型オブジェクトが返却されます。

データが登録されていない場合
空のArrayList型オブジェクトが返却されます。

このメソッドを呼び出した時点でクエリグループに対して停止が通知されていた場合（メソッドによってデータ送信終了が通知された場合，またはコマンドによってクエリグループ停止が通知された場合），次のように処理されます。

停止通知後，最初のメソッド呼び出しの場合
空のArrayList型オブジェクトが返却されます。

停止通知後，2回目以降のメソッド呼び出しの場合
例外がスローされます。

このメソッドは，ポーリング用メソッドです。

パラメーター

timeout

データがない場合に，待機する最大時間をミリ秒で指定します。

指定した値によって，次の処理が実行されます。

指定した値 | 実行される処理
負の数 | 待機しません。
0 | 結果データが到着するか，またはストリームが終了するまで待機します。
そのほかの値 | 結果データが到着するか，または指定時間が経過するまで待機します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

SDPClientCommunicationException
RMI連携時に通信例外が発生した場合

SDPClientEndOfStreamException
送信データの処理が終了している場合

SDPClientException

出力ストリームがすでに閉じている場合

コールバック用リスナーオブジェクトがすでに登録されている場合

SDPClientQueryGroupHoldException
クエリグループが閉塞中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

SDPClientQueryGroupStateException
クエリグループが実行中でない場合

SDPClientQueryGroupStopException
結果データがなく，かつクエリグループが停止中の場合（SDPClientQueryGroupStateExceptionの詳細例外）

戻り値

タプルのリスト（ArrayList<StreamTuple>型オブジェクト）。

getFreeQueueSize()メソッド

形式

int getFreeQueueSize()

説明

出力ストリームキューの空きサイズを取得します。

出力ストリームキューの空きサイズは，system_config.propertiesのengine.maxQueueSizeパラメーターに指定した値から，使用中のサイズを引いた値です。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | 出力ストリームがすでに閉じている場合
SDPClientQueryGroupHoldException | クエリグループが閉塞中の場合（SDPClientQueryGroupStateExceptionの詳細例外）
SDPClientQueryGroupNotExistException | クエリグループが削除された場合
SDPClientQueryGroupStateException | クエリグループが実行中でない場合

戻り値

出力ストリームキューの空きサイズ（int）。

getMaxQueueSize()メソッド

形式

int getMaxQueueSize()

説明

出力ストリームキューの最大サイズを取得します。

入力ストリームキューの最大サイズは，system_config.propertiesのengine.maxQueueSizeパラメーターに指定した値です。

パラメーター

なし。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
SDPClientCommunicationException | RMI連携時に通信例外が発生した場合
SDPClientException | 出力ストリームがすでに閉じている場合

戻り値

出力ストリームキューの最大サイズ（int）。

registerForNotification(StreamEventListener n)メソッド

形式

void registerForNotification(StreamEventListener n)

説明

コールバック用リスナーオブジェクトを登録します。

このメソッド実行以降は，ポーリング用メソッド（getメソッドまたはgetAllメソッド）を実行できません。

一つのストリームに対して一つのリスナーオブジェクトしか登録できません。また，登録済みのリスナーオブジェクトは，複数のストリームに登録できません。

パラメーター

n

リスナーオブジェクトを指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

NullPointerException
パラメーターにnullを指定した場合

SDPClientException

出力ストリームがすでに閉じている場合

ストリームにリスナーオブジェクトが登録済みの場合

指定したリスナーオブジェクトがほかのストリームで登録済みの場合

RMI連携時にこのメソッドを呼び出した場合

SDPClientQueryGroupNotExistException
クエリグループが削除された場合

戻り値

なし。

unregisterForNotification(StreamEventListener n)メソッド

形式

void unregisterForNotification(StreamEventListener n)

説明

登録したリスナーオブジェクトを解除して，以降のコールバック処理を解除します。

パラメーター

n

リスナーオブジェクトを指定します。

例外

例外とその発生条件を次の表に示します。

例外
発生条件

NullPointerException
パラメーターにnullを指定した場合

SDPClientException

リスナーオブジェクトが未定義の場合

出力ストリームがすでに閉じている場合

RMI連携時にこのメソッドを呼び出した場合

戻り値

なし。

8.9　StreamTimeクラス（共通API）

クラス階層

java.lang.Object
 └java.util.Date
     └jp.co.Hitachi.soft.sdp.common.util.StreamTime

説明

StreamTimeクラスは，Dateクラスを拡張したクラスです。

タプルの特定の時刻を表すためのクラスです。

メソッド

StreamTimeクラスのメソッド一覧を次の表に示します。

戻り値 | メソッド名 | 機能
boolean | equals(StreamTime when) | 自身の時刻と，パラメーターに指定したStreamTime型オブジェクトが示す時刻が等しいかどうか判定します。
long | getTimeMillis() | 自身が保持するミリ秒単位の時刻を取得します。
int | hashCode() | 自身を示すハッシュコードを取得します。
java.lang.String | toString() | 自身の保持する時刻の情報を文字列表現にして取得します。

注意事項

なし。

＜この節の構成＞

equals(StreamTime when)メソッド

getTimeMillis()メソッド

hashCode()メソッド

toString()メソッド

equals(StreamTime when)メソッド

形式

boolean equals(StreamTime when)

説明

自身の時刻と，パラメーターに指定したStreamTime型オブジェクトの時刻が等しいかどうか判定します。

パラメーター

when

比較対象のStreamTime型オブジェクトを指定します。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
NullPointerException | パラメーターにnullを指定した場合

戻り値

true

パラメーターで指定したオブジェクトがStreamTime型オブジェクトであり，かつ，自身と同じ時刻です。

false

パラメーターで指定したオブジェクトがStreamTime型オブジェクトではありません。または，自身と同じ時刻ではありません。

getTimeMillis()メソッド

形式

long getTimeMillis()

説明

自身が保持するミリ秒単位の時刻を取得します。

パラメーター

なし。

例外

なし。

戻り値

自身が保持するミリ秒単位の時刻（long）。

hashCode()メソッド

形式

int hashCode()

説明

自身を示すハッシュコードを取得します。

パラメーター

なし。

例外

なし。

戻り値

自身を示すハッシュコード（int）。

toString()メソッド

形式

java.lang.String toString()

説明

自身の保持する時刻の情報を文字列表現にして取得します。

パラメーター

なし。

例外

なし。

戻り値

自身の保持する時刻の情報を次に示す形式に変換した文字列表現（java.lang.String型。△は半角スペースを示します）。

aaa△bbb△cc△dd:ee:ff△ggg△hhhh[timeMillis:iii]

出力内容を次の表に示します。

出力項目
内容
出力形式（範囲）

aaa
曜日
Sun，Mon，Tue，Wed，Thu，Fri，Satのどれかが出力されます。

bbb
月
Jan，Feb，Mar，Apr，May，Jun，Jul，Aug，Sep，Oct，Nov，Decのどれかが出力されます。

cc
日
2けたの10進数（01～31）で出力されます。

dd
時
2けたの10進数（00～23）で出力されます。

ee
分
2けたの10進数（00～59）で出力されます。

ff
秒
2けたの10進数（00～59）で出力されます。

ggg
タイムゾーン
タイムゾーンが出力されます。
タイムゾーンの設定がなければ空白が出力されます。

hhhh
年
4けたの10進数で出力されます。

iii
自身の保持するミリ秒単位の時刻
自身の保持するミリ秒単位の時刻が出力されます。

出力例を次に示します。
"Thu Jan 01 09:00:01 JST 1970[timeMillis:1234]"

8.10　StreamTupleクラス（共通API）

クラス階層

java.lang.Object
 └jp.co.Hitachi.soft.sdp.common.data.StreamTuple

説明

StreamTupleクラスは，タプルを表現するためのクラスです。

コンストラクター

StreamTupleクラスのコンストラクター一覧を次の表に示します。

コンストラクター名 | 機能
StreamTuple(Object[] dataArray) | パラメーターにデータオブジェクト配列を指定して，StreamTupleクラスのインスタンス（StreamTuple型オブジェクト）を新しく生成します。

メソッド

StreamTupleクラスのメソッド一覧を次の表に示します。

戻り値 | メソッド名 | 機能
boolean | equals(Object obj) | パラメーターで指定したStreamTuple型オブジェクトのデータオブジェクト配列および時刻が，自身（StreamTuple型オブジェクト）とすべて同じ内容かどうかを判定します。
Object[] | getDataArray() | 自身（StreamTuple型オブジェクト）のデータオブジェクト配列を取得します。
StreamTime | getSystemTime() | システム時刻を取得します。
int | hashCode() | ハッシュコードを取得します。
java.lang.String | toString() | 自身（StreamTuple型オブジェクト）のタプル情報を表す文字列を取得します。

注意事項

タプルの時刻（StreamTime型オブジェクト）には，タプルがSDPサーバに到着したときのシステム時刻が自動的に設定されます。カスタムアダプターでタプルを生成したときには，初期値としてタイムオブジェクトにはnullが設定されています。

使用例

Javaのデータ型のデータを使用してdataを作成して，StreamTuple型オブジェクトを生成する例を示します。

この例では，Integer型データおよびString型データを要素とするタプルを生成します。

 Object[] data = new Object[] {
     new Integer (1),
     new String ("AAA")
 };
 tuple = new StreamTuple(data);

CQLのデータ型に対応するJavaのデータ型については，「3.3　CQLのデータ型」を参照してください。

＜この節の構成＞

StreamTuple(Object[] dataArray)コンストラクター

equals(Object obj)メソッド

getDataArray()メソッド

getSystemTime()メソッド

hashCode()メソッド

toString()メソッド

StreamTuple(Object[] dataArray)コンストラクター

形式

public StreamTuple(Object[] dataArray)

説明

パラメーターにデータオブジェクト配列を指定して，StreamTupleクラスのインスタンス（StreamTuple型オブジェクト）を新しく生成します。

パラメーター

dataArray

タプルを構成するデータオブジェクトの配列を指定します。データはJavaのデータ型で指定します。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
NullPointerException | パラメーターにnullを指定した場合

equals(Object obj)メソッド

形式

boolean equals(Object obj)

説明

パラメーターで指定したStreamTuple型オブジェクトのデータオブジェクト配列および時刻が，自身（StreamTuple型オブジェクト）とすべて同じ内容かどうかを判定します。

パラメーター

obj

比較するStreamTuple型オブジェクトを指定します。

例外

例外とその発生条件を次の表に示します。

例外 | 発生条件
NullPointerException | パラメーターにnullを指定した場合

戻り値

true

タプルの内容（データオブジェクト配列および時刻）がすべて同じです。

false

タプルの内容が異なります（内容が一つでも異なる場合はfalseになります）。

getDataArray()メソッド

形式

Object[] getDataArray()

説明

自身（StreamTuple型オブジェクト）のデータオブジェクト配列を取得します。

パラメーター

なし。

例外

なし。

戻り値

Javaのデータ型のデータを含んだデータオブジェクト配列（Object[]型）。

getSystemTime()メソッド

形式

StreamTime getSystemTime()

説明

システム時刻を取得します。

パラメーター

なし。

例外

なし。

戻り値

システム時刻を表すオブジェクト（StreamTime型オブジェクト）。

hashCode()メソッド

形式

int hashCode()

説明

ハッシュコードを取得します。

このメソッドは，java.util.Hashtableクラスによって提供されるようなハッシュテーブルで使用するために用意されているメソッドです。

パラメーター

なし。

例外

なし。

戻り値

StreamTuple型オブジェクトのハッシュコード（int）。

toString()メソッド

形式

java.lang.String toString()

説明

自身（StreamTuple型オブジェクト）のタプル情報を表す文字列を取得します。次のデータを文字列に変換したデータが取得できます。

データオブジェクト配列（Object[]型オブジェクト）

システム時刻（StreamTime型オブジェクト）

パラメーター

なし。

例外

なし。

戻り値

自身のタプル情報を表す文字列（java.lang.String型）。

8.11　例外クラス（共通API）

クラス階層

＜この節の構成＞

SDPClientExceptionクラス（共通API）

SDPClientFreeInputQueueSizeThresholdOverExceptionクラス（共通API）

SDPClientFreeInputQueueSizeLackExceptionクラス（共通API）

SDPClientExceptionクラス（共通API）

クラス階層

説明

ストリームデータ処理システムのSDPサーバで検知された例外の内容をカスタムアダプターに返す例外クラスです。

フィールド

なし。

コンストラクター

なし。

メソッド

java.lang.Exceptionクラスを継承しているため，getMessageメソッドなどのjava.lang.Exceptionクラスのメソッドを使用できます。

サブクラス

SDPClientExceptionクラスのサブクラスを次の表に示します。

表8-3　SDPClientExceptionクラスのサブクラス

項番 | サブクラス | 説明
1 | SDPClientQueryGroupException（共通API） | カスタムアダプター実行時に，SDPサーバで検知したクエリグループの例外をカスタムアダプターに返すための例外クラスです。
2 | SDPClientQueryGroupNotExistException（共通API） | 指定したクエリグループがない場合に生成される例外クラスです。
3 | SDPClientQueryGroupStateException（共通API） | 指定したクエリグループが実行中ではない場合に生成される例外クラスです。
4 | SDPClientQueryGroupHoldException（共通API） | 閉塞状態のクエリグループに対してメソッドを呼び出した場合に生成される例外クラスです。
5 | SDPClientQueryGroupStopException（共通API） | 停止状態のクエリグループに対してメソッドを呼び出した場合に生成される例外クラスです。
6 | SDPClientEndOfStreamException（共通API） | 入力ストリームデータが終了している場合に生成される例外クラスです。
7 | SDPClientRelationStateException（共通API） | 指定したストリームがリレーション状態の場合に生成される例外クラスです。
8 | SDPClientCommunicationException(RMI連携用) | ストリームデータ処理システムで発生したRMI通信例外をカスタムアダプターに返すための通信例外クラスです。

サブクラスのクラス階層を次に示します。

SDPClientFreeInputQueueSizeThresholdOverExceptionクラス（共通API）

クラス階層

説明

入力ストリームキューの空きサイズがsystem_config.propertiesのstream.freeInputQueueSizeThresholdキーで指定したしきい値以下になったことを示す例外クラスです。

フィールド

なし。

コンストラクター

なし。

サブクラス

なし。

SDPClientFreeInputQueueSizeLackExceptionクラス（共通API）

クラス階層

説明

入力ストリームキューの空きサイズが不足していることを示す例外クラスです。

フィールド

なし。

コンストラクター

なし。

サブクラス

なし。

9.　データ送受信用APIを使用したサンプルプログラム

この章では，データ送受信APIを使用したサンプルプログラムについて説明します。

なお，ここで説明するサンプルプログラムは，インストール後，運用ユーザーの登録と運用ディレクトリの作成を実施したあとで実行してください。運用ディレクトリ作成までの手順については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

＜この章の構成＞

9.1　サンプルプログラムの構成

9.2　RMI連携カスタムアダプターのサンプルプログラム

9.3　インプロセス連携カスタムアダプターのサンプルプログラム

9.1　サンプルプログラムの構成

Stream Data Platform - AFが提供するサンプルプログラムの構成について説明します。

サンプルプログラムを実行する場合は，次の表に示すファイルを＜インストールディレクトリ＞¥samples¥api¥から＜運用ディレクトリ＞¥samples¥api¥にディレクトリごとコピーして使用します。

なお，カスタムアダプターのプロセス構成によって，使用するサンプルプログラムのファイルが異なります。

表9-1　サンプルプログラムの構成

ディレクトリ | ファイル | カスタムアダプターのプロセス構成 | 説明
RMI連携 | インプロセス連携
query¥ | Inprocess_QueryTest | － | ○ | インプロセス連携クエリ定義ファイル
RMI_QueryTest | ○ | － | RMI連携クエリ定義ファイル
conf¥ | Inprocess_QueryGroupTest※1 | － | ○ | インプロセス連携クエリグループ用プロパティファイル
jvm_client_options.cfg※2 | ○ | － | RMI連携用JavaVMオプションファイル
jvm_options.cfg※3 | ○ | ○ | SDPサーバ用JavaVMオプションファイル
logger.properties | ○ | ○ | ログファイル出力用プロパティファイル
RMI_QueryGroupTest※4 | ○ | － | RMI連携クエリグループ用プロパティファイル
system_config.properties | ○ | ○ | システムコンフィグプロパティファイル
user_app.InprocessAPTest.properties※5 | － | ○ | インプロセス連携用プロパティファイル
src¥samples¥ | Inprocess_Main.java | － | ○ | インプロセス連携送受信制御AP
Inprocess_Receiver.java | － | ○ | インプロセス連携データ受信AP
Inprocess_Sender.java | － | ○ | インプロセス連携データ送信AP
RMI_ReceiveTupleTest.java | ○ | － | RMI連携データ受信AP
RMI_SendTupleTest.java | ○ | － | RMI連携データ送信AP

（凡例）

○：使用します。　－：使用しません。

注※1

Inprocess_QueryGroupTestには，インプロセス連携用クエリ定義ファイルのパスとして，次のパスが設定されています。

querygroup.cqlFilePath=.¥¥samples¥¥api¥¥query¥¥Inprocess_QueryTest

注※2

jvm_client_options.cfgには，ログファイルの出力先（＜運用ディレクトリ＞¥logs¥）とクラスパスとして，次のパスが設定されています。

SDP_JVM_LOG=-XX:HitachiJavaLog:.¥¥logs¥¥SDPClientVM

SDP_CLASS_PATH=.¥¥samples¥¥api¥¥src

注※3

jvm_options.cfgには，ログファイルの出力先（＜運用ディレクトリ＞¥logs¥）として，次のパスが設定されています。

SDP_JVM_LOG=-XX:HitachiJavaLog:.¥¥logs¥¥SDPServerVM

注※4

RMI_QueryGroupTestには，RMI連携用クエリ定義ファイルのパスとして，次のパスが設定されています。

querygroup.cqlFilePath=.¥¥samples¥¥api¥¥query¥¥RMI_QueryTest

注※5

user_app.InprocessAPTest.propertiesには，インプロセス連携用のメインクラス名とクラスパスとして，次のパスが設定されています。

user_app.classname=samples.Inprocess_Main

user_app.classpath_dir=.¥¥samples¥¥api¥¥src

9.2　RMI連携カスタムアダプターのサンプルプログラム

この節では，RMI連携カスタムアダプターのサンプルプログラムの実行手順，およびサンプルプログラムの内容について説明します。

まず，実行手順に従ってサンプルプログラムを動作させたあと，サンプルプログラムを構成する定義ファイルやソースファイルがどのように定義・実装されているかを確認してください。

＜この節の構成＞

9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順

9.2.2　クエリグループの定義内容（RMI連携カスタムアダプター）

9.2.3　RMI連携データ送信APの内容

9.2.4　RMI連携データ受信APの内容

9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順

RMI連携カスタムアダプターのサンプルプログラムの実行手順を示します。なお，この手順では，四つのコンソールを使用します。実行するコンソールを【　】で囲んで示しますので，必要に応じて新しいコンソールを開いて実行してください。

運用ディレクトリに移動します。【コンソール1】

cd ＜運用ディレクトリ＞

＜インストールディレクトリ＞¥samples¥api¥下のサンプルプログラムを＜運用ディレクトリ＞直下にディレクトリごとコピーします。【コンソール1】
なお，＜運用ディレクトリ＞直下にサンプル環境を構築済みの場合は，この手順および3.の手順は不要です。4.に進んでください。

xcopy /EY ＜インストールディレクトリ＞¥samples¥api .¥samples¥api¥

サンプルプログラムのconfディレクトリ以下を運用ディレクトリ直下のconfディレクトリ下にコピーします。【コンソール1】
＜運用ディレクトリ＞¥conf下にすでに各プロパティファイルがある場合は，上書きします。上書きしたくない場合は，あらかじめ＜運用ディレクトリ＞¥conf下のプロパティファイルをほかのディレクトリなどに退避しておいてください。

xcopy /Y samples¥api¥conf .¥conf¥

ソースファイルをコンパイルします。【コンソール1】
ソースファイルのコンパイルは，javacコマンドを実行できる環境で実行してください。

javac※ -classpath ＜インストールディレクトリ＞¥lib¥sdp.jar samples¥api¥src¥samples¥RMI*.java

注※

「7.5　コンパイル手順」を参照し，事前に環境変数を定義してください。または，環境に応じて，javacコマンドのパスを指定してください。

SDPサーバを起動します。【コンソール1】
SDPサーバのポート番号には，デフォルトでは20400が設定されています。
ポート番号を変更したい場合は，起動前に，＜運用ディレクトリ＞¥conf¥system_config.propertiesのrmi.serverPortプロパティで値を変更してください。

.¥bin¥sdpstart

クエリグループ（ストリームとクエリ）を登録します。【コンソール2】
新しいコンソールを表示して，運用ディレクトリに移動します。

cd ＜運用ディレクトリ＞

その後，次のコマンドを実行します。

.¥bin¥sdpcql RMI_QueryGroupTest

クエリグループを開始します。【コンソール2】

.¥bin¥sdpcqlstart RMI_QueryGroupTest

データ受信APを起動します。【コンソール3】
新しいコンソールを表示して，運用ディレクトリに移動します。

cd ＜運用ディレクトリ＞

その後，次のコマンドを実行します。-clientcfgオプションには，サンプルプログラムとして提供されているRMI連携用JavaVMオプションファイルを指定します。

.¥bin¥sdpstartap -clientcfg .¥conf¥jvm_client_options.cfg  samples.RMI_ReceiveTupleTest

データ送信APを起動します。【コンソール4】
新しいコンソールを表示して，運用ディレクトリに移動します。

cd ＜運用ディレクトリ＞

その後，次のコマンドを実行します。-clientcfgオプションには，サンプルプログラムとして提供されているRMI連携用JavaVMオプションファイルを指定します。

.¥bin¥sdpstartap -clientcfg .¥conf¥jvm_client_options.cfg samples.RMI_SendTupleTest

実行結果を確認します。【コンソール3】
データ受信APを起動したコンソール【コンソール3】に，ID1，VAL1，およびVAL2の値として0～9が表示されることを確認します。

Get Data:ID1=0, VAL1=data1:0, VAL2=data2:0, TIME=...
Get Data:ID1=1, VAL1=data1:1, VAL2=data2:1, TIME=...
Get Data:ID1=2, VAL1=data1:2, VAL2=data2:2, TIME=...
：
Get Data:ID1=9, VAL1=data1:9, VAL2=data2:9, TIME=...

クエリグループを停止します。【コンソール2】

.¥bin¥sdpcqlstop RMI_QueryGroupTest

SDPサーバを停止します。【コンソール2】

.¥bin¥sdpstop

9.2.2　クエリグループの定義内容（RMI連携カスタムアダプター）

ここでは，「9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順」の手順6.で登録したクエリグループ（RMI_QueryGroupTest）の内容について説明します。

このRMI連携クエリグループ用プロパティファイルでは，s1，s2という名称の2種類のストリームと，joinという名称のクエリを定義しています。生成されたストリームタプルは，クエリ名joinをストリーム名とする出力ストリームとして出力されます。

定義内容を次に示します。なお，大文字小文字の表記はサンプルと異なります。

REGISTER STREAM s1(c1 INT, c2 VARCHAR(20));
REGISTER STREAM s2(c1 INT, c2 VARCHAR(20));

REGISTER QUERY join
ISTREAM(SELECT s1.c1 AS ID1, s1.c2 AS VAL1, s2.c2 AS VAL2
FROM s1[ROWS 3], s2[ROWS 2]
WHERE s1.c1 = s2.c1);

ストリームs1とs2のデータを連結して，ストリームタプルを生成する操作が定義されています。

9.2.3　RMI連携データ送信APの内容

ここでは，「9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順」の手順4.でコンパイルしたRMI連携データ送信AP（RMI_SendTupleTest.java）の内容について説明します。

このアプリケーションは，ストリームs1，s2をSDPサーバに送信するアプリケーションです。データ送信では，StreamInputインタフェースを使用します。

ソースコードを次に示します。なお，「//【1】」「//～【1】」などのコメントは，以降の説明の番号と対応しています（これらのコメントは，実際のサンプルプログラムには記載されていません。また，一部コメントの説明は実際のサンプルプログラムと異なります）。

サンプルプログラムの内容

package samples;

import jp.co.Hitachi.soft.sdp.common.data.StreamTuple;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupHoldException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupStopException;
import jp.co.Hitachi.soft.sdp.api.SDPConnector;
import jp.co.Hitachi.soft.sdp.api.SDPConnectorFactory;
import jp.co.Hitachi.soft.sdp.api.StreamInput;

public class RMI_SendTupleTest{
 //送信対象のストリーム名称を設定します
 private static final String TARGET_STREAM1 = "s1";
 private static final String TARGET_STREAM2 = "s2";
 private static final String TARGET_QUERYGROUP = "RMI_QueryGroupTest";

 private static SDPConnector connector;
 private static StreamInput streamInput1;
 private static StreamInput streamInput2;
 private static long interval=1000;

 //【1】
 public static void main(String[] args) {
   try {
     //SDPサーバに接続します
     connector = SDPConnectorFactory.connect();
     execute();
   } catch (SDPClientException sce) {
     System.err.println(sce.getMessage());
   }
 }
 //～【1】

 // データ送信処理を実行します
 public static void execute() {
   try {
     //【2】
     //送信対象のストリームに接続します
     streamInput1 = connector.openStreamInput(TARGET_QUERYGROUP, TARGET_STREAM1);
     streamInput2 = connector.openStreamInput(TARGET_QUERYGROUP, TARGET_STREAM2);
     //～【2】

     //データを送信します
     for(int i=0; i<10; i++){
       try{
         Thread.sleep(interval);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }

     //【3】
     //タプルに設定するオブジェクトを生成します
     Object[] data1 = new Object[]{
       new Integer(i),
       new String("data1:"+i)
     };
     Object[] data2 = new Object[]{
       new Integer(i),
       new String("data2:"+i)
     };

     //オブジェクトをタプルに設定します
     StreamTuple tuple1 = new StreamTuple(data1);
     StreamTuple tuple2 = new StreamTuple(data2);
     //～【3】

     //【4】
     //タプルを送信します
     streamInput1.put(tuple1);
     streamInput2.put(tuple2);
   }
   //データ送信完了を通知します
   streamInput1.putEnd();
   streamInput2.putEnd();
   //～【4】
   } catch (SDPClientQueryGroupStopException sce) {
     //クエリグループが停止しています(sdpcqlstopコマンド)
     System.err.println(sce.getMessage());
   } catch (SDPClientQueryGroupHoldException sce) {
     //クエリグループが閉塞しています
     System.err.println(sce.getMessage());
   } catch (SDPClientException sce) {
     System.err.println(sce.getMessage());

   //【5】
   } finally {
       if (!connector.isClosed()) {
         try {
           //入力ストリームと接続を閉じます
           streamInput1.close();
           streamInput2.close();
           // SDPサーバと接続を閉じます
           connector.close();
         } catch (SDPClientException sce2) {
           System.err.println(sce2.getMessage());
         }
       }
     }
   }
   //～【5】
 }

ソースコードの内容について説明します。

SDPConnectorFactory.connectメソッドでSDPサーバに接続して，SDPConnector型オブジェクトを取得します。

SDPConnector型オブジェクトを使用して，openStreamInputメソッドを呼び出します。このメソッドによって，送信先ストリームの入力ストリームに接続して，StreamInput型オブジェクトを取得します。

送信データをオブジェクトとして生成して，タプルに設定します。

StreamInput型オブジェクトを使用してputメソッドを呼び出し，2.で接続した入力ストリームに対してデータ（タプル）を送信します。すべてのデータの送信が完了したあと，putEndメソッドで送信完了を通知します。

StreamInput型オブジェクトを使用してcloseメソッドを呼び出して，入力ストリームとの接続を切断します。その後，SDPConnector型オブジェクトを使用してcloseメソッドを呼び出して，SDPConnectorを閉じます。

9.2.4　RMI連携データ受信APの内容

ここでは，「9.2.1　RMI連携カスタムアダプターのサンプルプログラムの実行手順」の手順4.でコンパイルしたRMI連携データ受信AP（RMI_ReceiveTupleTest.java）の内容について説明します。

このアプリケーションは，ストリームs1，s2をJOINした結果を受け取るアプリケーションです。データ受信では，StreamOutputクラスを使用します。

ソースコードを次に示します。なお，「//【1】」「//～【1】」などのコメントは，以降の説明の番号と対応しています（これらのコメントは，実際のサンプルプログラムには記載されていません。また，一部コメントの説明は実際のサンプルプログラムと異なります）。

サンプルプログラムの内容

package samples;

import java.util.Iterator;
import java.util.List;

import jp.co.Hitachi.soft.sdp.api.SDPConnectorFactory;
import jp.co.Hitachi.soft.sdp.api.SDPConnector;
import jp.co.Hitachi.soft.sdp.api.StreamOutput;
import jp.co.Hitachi.soft.sdp.common.data.StreamTuple;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientCommunicationException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupHoldException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupStopException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientEndOfStreamException;
import jp.co.Hitachi.soft.sdp.common.util.StreamTime;
/**
* ストリームデータを取得し，表示します
*
*/

public class RMI_ReceiveTupleTest {
 //取得するストリーム名称を設定します
 private static final String STREAM_NAME = "JOIN";
 private static final String TARGET_QUERYGROUP = "RMI_QueryGroupTest";

 private static SDPConnector connector;
 private StreamOutput streamOutput;
 private boolean run=true;
 private long interval=10;
 public static void main(String[] args) {

   //【1】
   try {
     // SDPサーバに接続します
     connector = SDPConnectorFactory.connect();

     //受信処理を開始します
     RMI_ReceiveTupleTest receiver = new RMI_ReceiveTupleTest();
     receiver.execute();
   } catch (SDPClientException sce) {
     System.err.println(sce.getMessage());
   }
   //～【1】
 }

 //受信処理を実行します
 public void execute() {
   try {
     //【2】
     //結果ストリームに接続します
     streamOutput = connector.openStreamOutput(TARGET_QUERYGROUP, STREAM_NAME);
     //～【2】

     while (run) {
       try {
         Thread.sleep(interval);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }

     //【3】
     //タプルを受信します
     List<StreamTuple> tupleList = streamOutput.getAll();
     if (tupleList.isEmpty()) continue;
     //～【3】

     for (Iterator iterator = tupleList.iterator(); iterator.hasNext();) {
     StreamTuple tuple = (StreamTuple) iterator.next();

     //【4】
     //受信したタプルを表示します
     Object[] data = tuple.getDataArray();
     Integer id1 = (Integer)data[0];
     String val1 = (String)data[1];
     String val2 = (String)data[2];
     StreamTime time = tuple.getSystemTime();
     System.out.println("Get Data: ID1="+id1+
       ", VAL1="+val1+
       ", VAL2="+val2+
       ", TIME="+time.toString());
     //～【4】
     }
   }
 } catch (SDPClientEndOfStreamException see) {
   //送信ストリームデータが終了しました
   System.out.println(see.getMessage());
 } catch (SDPClientQueryGroupStopException sce) {
   //クエリグループが停止しています(sdpcqlstopコマンド)
   System.err.println(sce.getMessage());
 } catch (SDPClientQueryGroupHoldException sce) {
   //クエリグループが閉塞しています
   System.err.println(sce.getMessage());
 } catch (SDPClientCommunicationException sce) {
   System.err.println(sce.getMessage());
 } catch (SDPClientException sce) {
   System.err.println(sce.getMessage());
 } finally {
     if (!connector.isClosed()) {
       //【5】
       try {
         //出力ストリームと接続を閉じます
         streamOutput.close();
         // SDPサーバと接続を閉じます
         connector.close();
       } catch (SDPClientException sce) {
         System.err.println(sce.getMessage());
       }
       //～【5】
     }
   }
 }
}

ソースコードの内容について説明します。

SDPConnectorFactory.connectメソッドでSDPサーバに接続して，SDPConnector型オブジェクトを取得します。

SDPConnector型オブジェクトを使用して，openStreamOutputメソッドを呼び出します。このメソッドによって，受信元ストリームの出力ストリームに接続して，StreamOutput型オブジェクトを取得します。

StreamOutput型オブジェクトを使用してgetAllメソッドを呼び出し，2.で接続した出力ストリームからStreamTuple型オブジェクトのタプルをまとめて受信します。

StreamTuple型オブジェクトを使用してgetDataArrayメソッドを呼び出し，タプルのオブジェクト配列を取得します。このサンプルプログラムでは，タプルのデータをInteger型およびString型で取り出して，標準出力に出力しています。

StreamOutput型オブジェクトのcloseメソッドで出力ストリームとの接続を切断します。その後，SDPConnector型オブジェクトのcloseメソッドでSDPConnectorを閉じます。

9.3　インプロセス連携カスタムアダプターのサンプルプログラム

この節では，インプロセス連携カスタムアダプターのサンプルプログラムの実行手順，およびサンプルプログラムの内容について説明します。

まず，実行手順に従ってサンプルプログラムを動作させたあと，サンプルプログラムを構成する定義ファイルやソースファイルがどのように定義・実装されているかを確認してください。

＜この節の構成＞

9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順

9.3.2　クエリグループの定義内容（インプロセス連携カスタムアダプター）

9.3.3　インプロセス連携送受信制御APの内容

9.3.4　インプロセス連携データ送信APの内容

9.3.5　インプロセス連携データ受信APの内容（ポーリング方式）

9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順

インプロセス連携カスタムアダプターのサンプルプログラムの実行手順を示します。なお，この手順では，二つのコンソールを使用します。実行するコンソールを【　】で囲んで示しますので，必要に応じて新しいコンソールを開いて実行してください。

運用ディレクトリに移動します。【コンソール1】

cd ＜運用ディレクトリ＞

＜インストールディレクトリ＞¥samples¥api¥下のサンプルプログラムを＜運用ディレクトリ＞直下にディレクトリごとコピーします。【コンソール1】
なお，＜運用ディレクトリ＞直下にサンプル環境を構築済みの場合は，この手順および3.の手順は不要です。4.に進んでください。

xcopy /EY ＜インストールディレクトリ＞¥samples¥api .¥samples¥api¥

サンプルプログラムのconfディレクトリ以下を運用ディレクトリ直下のconfディレクトリ下にコピーします。【コンソール1】
＜運用ディレクトリ＞¥conf下にすでに各プロパティファイルがある場合は，上書きします。上書きしたくない場合は，あらかじめ＜運用ディレクトリ＞¥conf下のプロパティファイルをほかのディレクトリなどに退避しておいてください。

xcopy /Y samples¥api¥conf .¥conf¥

ソースファイルをコンパイルします。【コンソール1】
ソースファイルのコンパイルは，javacコマンドを実行できる環境で実行してください。

javac※ -classpath ＜インストールディレクトリ＞¥lib¥sdp.jar samples¥api¥src¥samples¥Inprocess*.java

注※

「7.5　コンパイル手順」を参照し，事前に環境変数を定義してください。または，環境に応じて，javacコマンドのパスを指定してください。

SDPサーバを起動します。【コンソール1】

.¥bin¥sdpstart

クエリグループ（ストリームとクエリ）を登録します。【コンソール2】
新しいコンソールを表示して，運用ディレクトリに移動します。

cd ＜運用ディレクトリ＞

その後，次のコマンドを実行します。

.¥bin¥sdpcql Inprocess_QueryGroupTest

クエリグループを開始します。【コンソール2】

.¥bin¥sdpcqlstart Inprocess_QueryGroupTest

インプロセス連携用アプリケーションを開始します。【コンソール2】

.¥bin¥sdpstartinpro InprocessAPTest

実行結果を確認します。【コンソール1】
SDPサーバを起動したコンソール【コンソール1】に，結果が表示されることを確認します。サンプルプログラムのデータ受信AP（ポーリング方式）では，["ad0", 0]～["ad24", 24]の結果を受信した結果が，コンソールに出力されます。

Receiver : Tuple Get on FILTER1 [ VAL=ad0, ID=0, TIME=... ]
：
Receiver : Tuple Get on FILTER1 [ VAL=ad23, ID=23, TIME=... ]
Receiver : Tuple Get on FILTER1 [ VAL=ad24, ID=24, TIME=... ]

インプロセス連携用アプリケーションを停止します。【コンソール2】

.¥bin¥sdpstopinpro InprocessAPTest

クエリグループを停止します。【コンソール2】

.¥bin¥sdpcqlstop Inprocess_QueryGroupTest

SDPサーバを停止します。【コンソール2】

.¥bin¥sdpstop

9.3.2　クエリグループの定義内容（インプロセス連携カスタムアダプター）

ここでは，「9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順」の手順6.で登録したインプロセス連携クエリグループ用プロパティファイル（Inprocess_QueryGroupTest）の内容について説明します。

このクエリグループでは，送信先ストリーム名としてdata0を定義して，受信元ストリーム名として，ポーリング受信用にfilter1を定義しています。

定義内容を次に示します。なお，大文字小文字の表記はサンプルと異なります。

REGISTER STREAM data0(name VARCHAR(10), num BIGINT);
REGISTER QUERY filter1 ISTREAM(SELECT * FROM data0[ROWS 1] WHERE data0.num <= 24);

9.3.3　インプロセス連携送受信制御APの内容

ここでは，「9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順」の手順4.でコンパイルしたインプロセス連携送受信制御AP（Inprocess_Main.java）の内容について説明します。このプログラムは，タプルを送受信するアプリケーションを制御する，メインプログラムです。

ソースコードを次に示します。なお，「//【1】」「//～【1】」などのコメントは，以降の説明の番号と対応しています（これらのコメントは，実際のサンプルプログラムには記載されていません。また，一部コメントの説明は実際のサンプルプログラムと異なります）。

サンプルプログラムの内容

package samples;

import jp.co.Hitachi.soft.sdp.api.SDPConnector;
import jp.co.Hitachi.soft.sdp.api.inprocess.StreamInprocessUP;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientException;

public class Inprocess_Main implements StreamInprocessUP {

 // 受信用スレッドオブジェクト
 Inprocess_Receiver receiver = null;

 // 送信用スレッドオブジェクト
 Inprocess_Sender sender = null;

 // SDPサーバとのコネクター
 SDPConnector connector = null;

 //【1】
 public void execute(SDPConnector sc) {
 //～【1】

   this.connector = sc;

   //【2】
   // ポーリング用受信スレッドを開始します
   this.receiver = new Inprocess_Receiver(sc);
   receiver.start();

   // 送信スレッドを開始します
   this.sender = new Inprocess_Sender(sc);
   sender.start();
   //～【2】
 }

 //【1】
 public void stop() {
 //～【1】

   try {
     //【3】
     // 送信スレッドを停止します
     if(sender != null) {
       sender.terminate();
       sender.join();
     }
     // 受信スレッドを停止します
     if(receiver != null){
       receiver.terminate();
       receiver.join();
     }
   } catch (InterruptedException e) {
     System.err.println("Main    : " + e.getMessage());
   }

   try {
     // コネクターを閉じます
     connector.close();
   } catch (SDPClientException sce) {
     System.err.println("Main    : " + sce.getMessage());
   }
   //～【3】
 }
}

ソースコードの内容について説明します。

このアプリケーションのInprocess_Mainクラスは，StreamInprocessUPインタフェースを実装したクラスです。このため，StreamInprocessUPインタフェースで定義されているexecuteメソッドとstopメソッドを実装します。

アプリケーション開始時に実行されるexecuteメソッドで，データ受信スレッドとデータ送信スレッドを開始します。

アプリケーション停止時に実行されるstopメソッドでは，2.で開始したデータ受信スレッドとデータ送信スレッドを停止します。その後，SDPConnector型オブジェクトのcloseメソッドを呼び出して，SDPConnectorを閉じます。

9.3.4　インプロセス連携データ送信APの内容

ここでは，「9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順」の手順4.でコンパイルしたインプロセス連携データ送信AP（Inprocess_Sender.java）の内容について説明します。

参考

このサンプルプログラムでは，送信専用のスレッドクラスを別に定義して，クライアントAPのメインクラス（StreamInprocessUPインタフェースを実装したInprocess_Mainクラス）側からそのスレッドを生成して送信を委譲する例を示しています。これ以外の方法として，Inprocess_Mainクラス自身がSDPサーバにタプルを送信する処理もできます。

ソースコードを次に示します。なお，「//【1】」「//～【1】」などのコメントは，以降の説明の番号と対応しています（これらのコメントは，実際のサンプルプログラムには記載されていません）。

サンプルプログラムの内容

package samples;

import java.util.ArrayList;

import jp.co.Hitachi.soft.sdp.common.data.StreamTuple;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupHoldException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupStopException;
import jp.co.Hitachi.soft.sdp.api.SDPConnector;
import jp.co.Hitachi.soft.sdp.api.StreamInput;

public class Inprocess_Sender extends Thread{

 //【2】
 // スレッドの起動状態
 private volatile boolean running = true;
 //～【2】

 // SDPサーバとのコネクター
 private SDPConnector connector;

 // 送信スレッドの生成処理
 public Inprocess_Sender(SDPConnector c) {
   this.connector = c;
 }

 ArrayList<StreamTuple> list = new ArrayList<StreamTuple>();

 public void run()  {

   final String group_name = "Inprocess_QueryGroupTest";
   final String stream_name = "DATA0";

   // 送信ストリームオブジェクト
   StreamInput si = null;

   // 送信ストリームに接続します
   try {
     si = connector.openStreamInput(group_name,stream_name);
   } catch (SDPClientException sce) {
     System.err.println("Sender   :" + sce.getMessage());
     running = false;
   }

   for(int i = 0; i < 50;i++){
     if(!running) {
       break;
     }

     // 送信データを生成します
     Object[] data = new Object[]{
       new String("ad"+i),
       new Long(i)
     };

     // タプルオブジェクトを生成します
     StreamTuple tuple = new StreamTuple(data);

     try {
       Thread.sleep(100);
     } catch (InterruptedException e) {
       System.err.println("Sender   : Thread is interrupted");
       e.printStackTrace();
     }

     // 単一のタプルを送信します
     try {
       si.put(tuple);
     } catch (SDPClientQueryGroupStopException sce) {
       //クエリグループが停止しています(sdpcqlstopコマンド)
       //何もせずに処理を続行します
     } catch (SDPClientQueryGroupHoldException sce) {
       //クエリグループが閉塞しています
       //何もせずに処理を続行します
     } catch (SDPClientException sce) {
       System.err.println("Sender   :" + sce.getMessage());
       running = false;
     }
   }

   //【1】
   if(running) {
     try {
       si.putEnd();
   //～【1】
     } catch (SDPClientQueryGroupStopException sce) {
       //クエリグループが停止しています(sdpcqlstopコマンド)
       //何もせずに処理を続行します
     } catch (SDPClientQueryGroupHoldException sce) {
       //クエリグループが閉塞しています
       //何もせずに処理を続行します
     } catch (SDPClientException sce) {
       System.err.println("Sender   :" + sce.getMessage());  
     }
   }

   try {
     if (si != null) {
       // 送信ストリームを閉じます
       si.close();
     }
   } catch (SDPClientException sce) {
     System.err.println("Sender   :" + sce.getMessage());
   }

 }
 //【2】
 public void terminate() {
   System.out.println("Sender   : terminate called");
   this.running = false;
 //～【2】
 }
}

ソースコードの内容について説明します。

データの送信方法は，RMI連携の場合と同様です。ただし，データ送信完了通知は，terminateメソッドによって終了条件が設定されていない場合に実行します。

terminateメソッドにはタプルの送信を停止させる処理，つまりInprocess_Senderスレッドの終了条件を記述しています。
terminateメソッドは，SDPサーバのスレッドから呼び出されるため，Inprocess_Receiverクラスのrunningフィールドは二つのスレッドから同時に読み取られる場合があります。このため，runningフィールドは，volatile属性にする必要があります。

9.3.5　インプロセス連携データ受信APの内容（ポーリング方式）

ここでは，「9.3.1　インプロセス連携カスタムアダプターのサンプルプログラムの実行手順」の手順4.でコンパイルしたインプロセス連携データ受信AP（Inprocess_Receiver.java）の内容について説明します。このプログラムでは，Inprocess_Receiverスレッドが100ミリ秒間隔でSDPサーバに対してポーリング方式でタプル取得処理を実行します。このスレッドは，送受信制御プログラムであるInprocess_Mainクラスによって起動されます。

ソースコードを次に示します。なお，「//【1】」「//～【1】」などのコメントは，以降の説明の番号と対応しています（これらのコメントは，実際のサンプルプログラムには記載されていません）。

サンプルプログラムの内容

package samples;

import jp.co.Hitachi.soft.sdp.common.data.StreamTuple;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupHoldException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientQueryGroupStopException;
import jp.co.Hitachi.soft.sdp.common.exception.SDPClientEndOfStreamException;
import jp.co.Hitachi.soft.sdp.common.util.StreamTime;
import jp.co.Hitachi.soft.sdp.api.SDPConnector;
import jp.co.Hitachi.soft.sdp.api.StreamOutput;

public class Inprocess_Receiver extends Thread {

 // SDPサーバとのコネクター
 private SDPConnector connector;

 //【2】
 // スレッドの起動状態
 private volatile boolean running = true;
 //～【2】

 // 受信スレッドの生成処理
 public Inprocess_Receiver(SDPConnector c) {
   this.connector = c;
 }

 public void run() {

   final String groupName = "Inprocess_QueryGroupTest";
   final String streamName = "FILTER1";

   // 結果ストリームオブジェクト
   StreamOutput so = null;

   // 結果ストリームに接続します
   try {
     so = connector.openStreamOutput(groupName,streamName);
   } catch (SDPClientException sce) {
     System.err.println("Receiver : " + sce.getMessage());
     running = false;
   }

   //【1】
   // タプルの受信処理を開始します
   while(running){
   //～【1】
     try {
       Thread.sleep(100);
     } catch (InterruptedException e) {
       System.err.println("Receiver : Thread is interrupted");
       e.printStackTrace();
     }

     // タプルオブジェクト
     StreamTuple tuple = null;

     // タプルをポーリングで取得します
     try {
       tuple = so.get();
     } catch (SDPClientEndOfStreamException see) {
       //送信ストリームデータが終了しました
       System.out.println("Receiver : " + see.getMessage());
       break;
     } catch (SDPClientQueryGroupStopException sce) {
       //クエリグループが停止しています(sdpcqlstopコマンド)
       System.err.println("Receiver : " + sce.getMessage());
       break;
     } catch (SDPClientQueryGroupHoldException sce) {
       //クエリグループが閉塞しています
       System.err.println("Receiver : " + sce.getMessage());
       break;
     } catch (SDPClientException sce) {
       System.err.println("Receiver : " + sce.getMessage());
       break;
     }

     //受信したタプルを表示します
     if (tuple != null) {
       Object[] data = tuple.getDataArray();
       String val = (String) data[0];
       Long id = (Long) data[1];
       StreamTime time = tuple.getSystemTime();
       System.out.println("Receiver : Tuple Get on " + streamName
         +" [ VAL="+val+", ID="+id+", TIME="+time.toString()+" ]");
     }
   }

   try {
     if (so != null) {
       // 結果ストリームを閉じます
       so.close();
     }
   } catch (SDPClientException sce) {
     System.err.println("Receiver : " + sce.getMessage());
   }

 }

 //【2】
 public void terminate() {
     System.out.println"Receiver : terminate called");
   this.running = false;
 }
 //～【2】
}

ソースコードの内容について説明します。

データ受信処理は，2.のterminateメソッドによって終了条件が設定されるまで，実行されます。

terminateメソッドには，タプルの受信を停止させる処理，つまりInprocess_Receiverスレッドの終了条件を記述しています。
terminateメソッドはSDPサーバのスレッドから呼び出されるため，Inprocess_Receiverクラスのrunningフィールドは二つのスレッドから同時に読み取られる場合があります。このため，runningフィールドは，volatile属性にする必要があります。

10.　外部定義関数の作成

ストリーム間演算を使用する場合は，CQLでストリーム間演算関数を定義するほかに，外部定義関数の作成が必要です。

この章では，外部定義関数の作成方法について説明します。

＜この章の構成＞

10.1　外部定義関数の概要

10.2　外部定義関数の実装

10.3　外部定義関数の作成例

10.1　外部定義関数の概要

外部定義関数は，ユーザーがJavaのAPIなどを使用して作成する関数です。外部定義関数の処理ロジックを，ユーザーがJavaで記述して作成するクラスファイルにメソッドとして実装することで，任意の処理を実行できます。

ストリーム間演算を使用する場合は，CQLでストリーム間演算関数を定義するほかに，外部定義関数を作成します。外部定義関数の作成手順を次に示します。

関数の実装
外部定義関数の処理ロジックを，Javaで記述して作成するクラスファイルにメソッドとして実装します。関数の実装方法については，「10.2　外部定義関数の実装」を参照してください。

定義ファイルでの関数の記述
外部定義関数を実装したクラスとの関連づけを外部定義関数定義ファイルに記述して，SDPサーバに外部定義関数を認識させます。外部定義関数定義ファイルについては，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

CQLでの関数の記述
外部定義関数定義ファイルに記述した外部定義関数をクエリ定義ファイルのCQLに記述します。外部定義関数のCQLへの記述方法については，「4.4.25　外部定義ストリーム間演算関数」を参照してください。

外部定義関数で使用するファイルの関連を次の図に示します。

図10-1　外部定義関数で使用するファイルの関連

10.2　外部定義関数の実装

外部定義関数の実装では，外部定義関数の処理ロジックを，Javaで記述して作成するクラスファイルにメソッドとして実装します。

ここでは，外部定義関数のクラスとメソッドの実装方法について説明します。また，外部定義関数の変更について説明します。

なお，外部定義関数インタフェースの詳細については，「11.　外部定義関数インタフェース」を参照してください。

＜この節の構成＞

10.2.1　外部定義関数のクラスの実装

10.2.2　外部定義関数のメソッドの実装

10.2.3　外部定義関数の変更

10.2.1　外部定義関数のクラスの実装

外部定義関数のクラスを実装する場合の作成規則，および注意事項を説明します。

＜この項の構成＞

(1)　作成規則

(2)　注意事項

(1)　作成規則

外部定義関数を実装するクラスファイルは，次の規則に従って作成してください。

使用できるフィールド
外部定義関数を実装するクラスで，staticフィールドを使用できます。
staticフィールドの値は，同一のクエリグループ内で同じクラスファイルを使用する，すべての外部定義関数の使用個所で共有されます。ただし，クエリグループが異なる場合は，同じクラスファイルを使用してもstaticフィールドの値は個別に管理されます。

パッケージ名，およびクラス名
パッケージ名，およびクラス名には，任意の名前を使用できます。
ただし，「jp.co.Hitachi.soft.sdp」から始まるパッケージ名は指定できません。

コンストラクターの指定
外部定義関数を実装するクラスは，クエリ内で外部定義関数の使用個所ごとに，CQLの定義内容に一致するコンストラクターを使用して，クエリグループの登録・削除時にインスタンスを作成・破棄します。このため，次の条件を満たすように作成してください。

クラスは，修飾子に必ずpublicを指定して作成してください。インスタンス化できない抽象クラス（abstract）や内部クラスは使用できません。

コンストラクターは，修飾子に必ずpublicを指定し，CQLで指定する初期化パラメーターの数およびデータ型が一致するように作成してください。
ただし，プリミティブ型を引数とするコンストラクターは使用できません。
なお，CQLで初期化パラメーターを省略する場合には，コンストラクターを作成しないでデフォルトコンストラクターを使用するか，または引数を持たないコンストラクターを作成してください。

これらの条件を満たしていない場合，外部定義関数を実装するクラスのインスタンスを生成できないため，クエリグループの登録でエラーになります。

実装するインタフェース
外部定義関数を実装するクラスは，SDPExternalStreamFunctionインタフェースを実装してください。SDPExternalStreamFunctionインタフェースは，次のメソッドを実装する必要があります。

executeStreamFuncメソッド
このメソッドには，外部定義関数の処理を実装してください。

initializeメソッド
このメソッドには，外部定義関数を実装するクラスが持つフィールドの初期設定など，関数実行前の初期化処理を実装してください。

terminateメソッド
このメソッドには，外部定義関数を実装するクラスが持つフィールドのクリアなど，関数実行後の終了処理を実装してください。

SDPExternalStreamFunctionインタフェースの詳細については，「11.3　SDPExternalStreamFunctionインタフェース」を参照してください。

(2)　注意事項

外部定義関数を実装するクラスファイルの注意事項を次に示します。

外部定義関数を実装するクラスファイルのパッケージ名を含むクラス名は，jvm_options.cfgのSDP_CLASS_PATHパラメーターに指定したクラスパスのクラスファイルと重複しないようにしてください。
重複した場合は，SDP_CLASS_PATHパラメーターに指定したクラスパスのクラスが優先して読み込まれるため，次に示すようなエラーが発生して外部定義関数が正しく動作しなくなるおそれがあります。
（例）

SDPExternalStreamFunctionインタフェースの未実装，またはメソッドが存在しないなどの要因で，クエリグループの登録でエラーになる。

SDP_CLASS_PATHパラメーターに指定したクラスパスのクラスのメソッドが外部定義関数として実行されてしまう。

外部定義関数を実装するクラスの中で，自身のクラスパス以外のクラスパスにあるクラスを参照している場合は，jvm_options.cfgのSDP_CLASS_PATHパラメーターにそのクラスパスを指定してください。
指定しない場合は，参照個所がフィールドやコンストラクターのときは，インスタンスの生成ができないため，クエリグループの登録でエラーになります。参照個所がメソッドのときは，そのメソッドの実行時に例外java.lang.NoClassDefFoundErrorが発生してクエリグループが閉塞します。
特に，次の場合には，クエリグループが閉塞し，クエリグループを削除しないと再開始できなくなるため注意してください。

クエリグループの停止・閉塞またはputEndメソッドの処理の途中で実行する，terminateメソッドで例外が発生した。

クエリグループの開始またはputEndメソッドの処理の途中で実行する，initializeメソッドで例外が発生した。

なお，jvm_options.cfgは，SDPサーバの起動後には変更できません。SDPサーバの起動前にjvm_options.cfgを編集してください。

外部定義関数を実装するクラスファイルのクラスパスは，jvm_options.cfgのSDP_CLASS_PATHパラメーターには指定しないでください。指定した場合は，次のようになるため注意してください。

SDPサーバの起動中に，クラスやメソッドの変更を反映できなくなります。

外部定義関数を実装するクラスのstaticフィールドの値は，すべてのクエリグループで共有されます。

外部定義関数を実装するクラスの中で，標準出力および標準エラー出力への出力を行った場合，SDPサーバを実行しているJavaVMプロセスに出力します。また，相対パスでファイル参照などを行った場合は，運用ディレクトリからの相対パスとして扱います。

外部定義関数はクエリ実行中に呼び出されるため，外部定義関数の実行時間が長いほど，ストリームデータ処理システムの処理性能が低下します。また，単位時間当たりに処理できるタプル数が減り，入力ストリームキューでキューあふれが発生する要因にもなります。このため，最長でも10ミリ秒程度で外部定義関数の処理が完了するように実装することをお勧めします。

外部定義関数でJNIを使用する場合，外部定義関数の実装クラスとは別にネイティブライブラリのロード専用のJavaクラスを作成し，そのクラスパスをjvm_options.cfgのSDP_CLASS_PATHパラメーターに指定してください。外部定義関数実装クラス内でネイティブライブラリをロードすると，クエリの登録に失敗するおそれがあります。

10.2.2　外部定義関数のメソッドの実装

外部定義関数のメソッドを実装する場合の作成規則，および注意事項を説明します。

＜この項の構成＞

(1)　作成規則

(2)　注意事項

(1)　作成規則

外部定義関数を実装するメソッドは，次の規則に従って作成してください。

修飾子とメソッド名
メソッドは，修飾子に必ずpublicを指定し，名前は「executeStreamFunc」で作成してください。

メソッドの引数
外部定義ストリーム間演算関数に使用するメソッドの引数は，次の二つです。

第1引数：Collection<Object[]>[]型
メソッドの実行時，この引数には，クエリ定義ファイルで指定した入力ストリームごとに，同時刻に発生したタプルが格納されたデータオブジェクト配列を渡します。

第2引数：Timestamp型
メソッドの実行時，この引数には，第1引数で渡されるタプルの時刻情報を渡します。
同時刻のタイムスタンプを持つタプルを複数回に分けてメソッドに渡す場合があるため，第2引数の時刻情報には，前回のメソッド実行時と同時刻のタイムスタンプが渡されることがあります。

メソッドの戻り値
外部定義関数に使用するメソッドの戻り値は，List<Object[]>型とします。

メソッドの実行時，出力ストリームのタプルが格納されたデータオブジェクト配列のリストを返してください。出力対象のタプルが存在しない場合は，空のリストを返してください。

メソッドの戻り値（List<Object[]>型）のObject[]に格納する各要素（タプル）のデータ型は，CQLのデータ型に対応するJavaのデータ型をすべて使用できます。しかし，外部定義関数定義ファイルで指定する出力ストリームのカラムのデータ型（CQLのデータ型）に対応する型で実装してください。
また，これらのデータ型でプリミティブ型と対応するラッパークラスを持つデータ型（intなど）は，プリミティブ型とラッパークラスのどちらも使用できます。
それ以外のデータ型を指定した場合は，クエリ実行時にエラーになります。

メソッドの戻り値の検証
外部定義関数を使用するクエリの実行木は，外部定義関数定義ファイルに指定した戻り値の情報を基に生成されます。
クエリ実行時の外部定義関数の戻り値が，外部定義関数定義ファイルの戻り値の情報と一致していない場合，結果の不正や例外の発生などの意図しない動作が発生するおそれがあります。これらの現象を回避するため，双方の戻り値の情報が一致しているかどうかを検証できます。
戻り値の情報の一致を検証するかどうかは，system_config.propertiesのengine.externalStreamFuncVerifyModeパラメーターで指定します。
このパラメーターにtrueを指定し，検証結果が不正だった場合は，エラーメッセージが出力されて，クエリグループが閉塞されます。この場合は，実装メソッドの処理および外部定義関数定義ファイルを見直してください。
外部定義関数のクラスファイルまたは外部定義関数定義ファイルを修正する場合は，クエリグループの削除と再登録が必要です。外部定義関数の変更，またはクエリグループの変更については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

(2)　注意事項

外部定義関数を実装するメソッドの注意事項を次に示します。

メソッドの実行時に，一つの入力ストリームに対して複数のタプルが入力された場合，そのタプル間の順序は不定となります。メソッドでは，引数で渡されるタプルの順序に依存しない処理を実装する必要があります。

メソッドでは，次の処理を実行しないでください。

SDPサーバのプロセスを終了する処理（System#exit()，Runtime#halt()など）

Thread#currentThread()などで取得したSDPサーバのスレッドに対するメソッドの実行

無限ループなど，メソッドが終了しない処理

SDPサーバに対して，直接API（put()など）を発行する処理や，運用コマンドを実行する処理

これらの処理を外部定義関数で実行した場合，SDPサーバの動作は保障されません。

メソッドでは，新たにスレッドを起動する場合には，スレッドを停止させる処理も実装してください。

メソッドでは，次に示すような事象の発生でクエリを続行できないと判断する場合には，戻り値を返さないで例外をスローしてください。

エラーの発生によって，次回の関数の実行でもエラーが発生する確率が高く，関数が正しい戻り値を返せない場合。

関数内での演算によってNaNが発生したなど，以降の関数の戻り値がNaNになって正しい戻り値を返せない場合。

例外をスローすると，メッセージKFSP42401-Eを出力して，クエリグループを閉塞します。
なお，今回は一時的な要因で正しい戻り値を返せなくても，次回の関数の実行では正常に動作可能と判断できる場合には，例外をスローしないで空のリストを返すことで，クエリ処理を継続できます。

メソッドの戻り値，および戻り値の各要素としてnullを返さないでください。nullを返した場合，メッセージKFSP42400-EまたはKFSP42403-Eを出力して，クエリグループを閉塞します。

メソッドでは，長さを指定できるデータ型を返すときに，定義値を超えるデータを返さないでください。返した場合には，メッセージを出力して，クエリグループを閉塞します。
ただし，system_config.propertiesのengine.externalStreamFuncVerifyModeパラメーターにfalseを指定した場合には，外部定義関数が返したデータをクエリ実行結果としてそのまま利用するため，メソッドを実装するときに注意してください。

クエリ定義ファイルで外部定義関数の引数に指定した入力ストリームの数が，実装したメソッドの処理内容に対応しているかはSDPサーバではチェックしません。引数のチェック処理が必要な場合は，メソッド内でチェック処理を実装してください。

10.2.3　外部定義関数の変更

実装したメソッドの処理内容が原因で障害が発生した場合などに，クラスやメソッドを変更するときは，クエリグループの削除と再登録が必要です。

外部定義関数定義ファイルに指定した外部定義関数の実装クラスとメソッドは，クエリグループの登録時に読み込まれます。このため，外部定義関数の実装クラスとメソッドの変更は，クエリグループを削除して再登録することで反映されます。再登録をしていないクエリグループには，メソッドの変更は反映されません。

外部定義関数の変更，またはクエリグループの変更については，マニュアル「uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド」を参照してください。

10.3　外部定義関数の作成例

外部定義ストリーム間演算関数を使用する場合の，外部定義関数の作成例を次に示します。

外部定義関数のクラスファイルの作成例

package samples;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.co.Hitachi.soft.sdp.plugin.function.stream.SDPExternalStreamFunction;

public class ExternalStreamFunction implements SDPExternalStreamFunction {
   // 合計値格納マップ
   Map<String, Long> tempMap = new HashMap<String, Long>();
   // 乗数
   int mul;
   // 実行回数
   int loopCount;

   // 外部定義関数の実装クラスのコンストラクタ。
   // mul:乗数。クエリに記述した外部定義関数の初期化パラメーターに指定した値。
   public ExternalStreamFunction(Integer mul) {
       this.mul = mul;
       loopCount = 0;
   }

   // 外部定義関数の処理を実装するメソッド。
   // ID毎にVALの合計値を保持し、乗数で乗算した結果を出力します。
   // inputs:タプルの集合。入力ストリーム毎にタプルが格納されています。
   // ts    :inputsに格納されているタプルの時刻(タイムスタンプ)。
   public List<Object[]> executeStreamFunc(Collection<Object[]>[] inputs, Timestamp ts) {
       // 戻り値格納リスト
       List<Object[]> res = new ArrayList<Object[]>();
       // 入力ストリーム数分ループ
       for (int i = 0; i < inputs.length; i++) {
           // 入力ストリームを取得します
           Collection<Object[]> values = inputs[i];
           // タプル数分ループ
           for (Object[] value : values) {
               // IDを取得します
               String id = (String) value[0];
               // VALを取得します
               Long val = (Long) value[1];
               // 合計値をID毎に合計値格納マップに保存します
               if (tempMap.containsKey(id)) {
                   // 既出IDの場合、加算します
                   tempMap.put(id, tempMap.get(id) + val);
               } else {
                   // 新規IDの場合、新規に登録します
                   tempMap.put(id, val);
               }
           }
       }
       // IDの数分ループ
       for (String key : tempMap.keySet()) {
           // 戻り値格納リストに出力タプルを格納します
           res.add(new Object[] { loopCount, key, tempMap.get(key) * mul, ts });
       }
       loopCount++;
       return res;
   }
   // 初期化メソッド
   public void initialize() {
       tempMap.clear();
       loopCount = 0;
   }

   // 終了メソッド
   public void terminate() {
       // 処理なし
   }
}

外部定義関数定義ファイルの作成例

<?xml version="1.0" encoding="UTF-8"?>
<!-- All Rights Reserved. Copyright (C) 2013, Hitachi, Ltd.  -->
<root:ExternalFunctionDefinition
xmlns:root="http://www.hitachi.co.jp/soft/xml/sdp/function"
xmlns:group="http://www.hitachi.co.jp/soft/xml/sdp/function/functiongroup">
   <!-- 外部定義関数グループ定義 -->
   <group:FunctionGroup name="FG1" path="samples/external/src">
       <!-- 関数定義 -->
       <group:StreamFunction name="FUNC1" class="samples.ExternalStreamFunction">
           <!-- 戻り値定義 -->
           <group:ReturnInformation name="R1" type="INT" />
           <group:ReturnInformation name="R2" type="VARCHAR(10)" />
           <group:ReturnInformation name="R3" type="BIGINT" />
           <group:ReturnInformation name="R4" type="TIMESTAMP(9)" />
       </group:StreamFunction>
   </group:FunctionGroup>
</root:ExternalFunctionDefinition>

クエリ定義ファイルの作成例

REGISTER STREAM DATA0(ID VARCHAR(10), VAL BIGINT);

// 入力ストリームDATA0から、カラムID毎に最新のタプルを保持するクエリ
REGISTER QUERY Q1 SELECT ID, VAL FROM DATA0[PARTITION BY ID ROWS 1];
// 最新のタプルを出力するクエリ
REGISTER QUERY Q2 ISTREAM (SELECT * FROM Q1);
// 直前のタプルを出力するクエリ
REGISTER QUERY Q3 DSTREAM (SELECT * FROM Q1);
// 入力タプルのカラムID毎にカラムVALの値を合計し、乗数3で乗算した結果を出力するクエリ
REGISTER QUERY SUM1 $*FG1.FUNC1[3](Q2,Q3);

上記の作成例での入力ストリームDATA0と出力ストリームSUM1の関係を，一例として次の図に示します。

図10-2　入力ストリームDATA0と出力ストリームSUM1の関係

図中のクエリでは，次の四つの列を持つ出力ストリームSUM1を出力します。

R1（1列目）：外部定義関数の呼び出し回数-1

R2（2列目）：カラムID

R3（3列目）：カラムIDごとにVALの値を合計して3で乗算した値

R4（4列目）：時刻（タプルのタイムスタンプ）

図に示した一例でのexecuteStreamFuncメソッドの引数を次に示します。

外部定義関数の呼び出し回数
第1引数
第2引数

Collection<Object[]>[0]
（出力ストリームQ2）
Collection<Object[]>[1]
（出力ストリームQ3）
Timestamp
（タプルのタイムスタンプ）

Object[0]
（ID）
Object[1]
（VAL）
Object[0]
（ID）
Object[1]
（VAL）

1回目
A
100
なし
なし
10:00:00

2回目
B
200
A
100
10:00:01

A
300
なし
なし

11.　外部定義関数インタフェース

この章では，外部定義関数の作成で使用する外部定義関数インタフェースの文法について説明します。

＜この章の構成＞

11.1　外部定義関数インタフェースの記述形式

11.2　外部定義関数インタフェースの一覧

11.3　SDPExternalStreamFunctionインタフェース

11.1　外部定義関数インタフェースの記述形式

ここでは，外部定義関数インタフェースの記述形式について説明します。

各インタフェースで説明する項目は次のとおりです。ただし，インタフェースによっては説明しない項目もあります。

形式

インタフェースの記述形式を示します。

説明

インタフェースの機能について説明します。

パラメーター

インタフェースのパラメーターについて説明します。

例外

インタフェースを利用する際に発生する例外について説明します。

戻り値

インタフェースの戻り値について説明します。

注意事項

インタフェースを利用する上での注意事項について説明します。

11.2　外部定義関数インタフェースの一覧

外部定義関数インタフェースの一覧を次に示します。

表11-1　外部定義関数インタフェースの一覧

項番 | パッケージ名 | インタフェース名 | 機能
1 | jp.co.Hitachi.soft.sdp.plugin.function.stream | SDPExternalStreamFunction | 外部定義ストリーム間演算関数を実装するクラスが継承するインタフェースです。

11.3　SDPExternalStreamFunctionインタフェース

説明

外部定義ストリーム間演算関数を実装するクラスが継承するインタフェースです。ストリーム間演算関数の処理の抽象メソッドを実装します。

メソッド

SDPExternalStreamFunctionインタフェースのメソッド一覧を次に示します。

戻り値 | メソッド名 | 機能
List<Object[]> | executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp) | 外部定義ストリーム間演算関数の処理を実装します。
void | initialize() | 外部定義関数の実装クラスが持つフィールドなどの初期化処理を実装します。
void | terminate() | 外部定義関数の実装クラスが持つフィールドのクリアなど，終了処理を実装します。

＜この節の構成＞

executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp)メソッド

initialize()メソッド

terminate()メソッド

executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp)メソッド

形式

abstract List<Object[]> executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp)

説明

外部定義ストリーム間演算関数の処理を実装する抽象メソッドです。

SDPサーバは，クエリ定義で指定した外部定義関数の入力ストリームにタプルが到着したときに，このメソッドを実行します。

パラメーター

ObjectArrayCollection

Collection<Object[]>[]型で，入力ストリーム別に，同時刻に発生したタプルが格納されたデータオブジェクト配列を指定します。

timestamp

Timestamp型で，ストリームデータのタプルの時刻情報を指定します。

例外

なし。

戻り値

出力ストリームのタプルが格納されたデータオブジェクト配列のリスト（List <Object[]>型オブジェクト）。

注意事項

一つの入力ストリームに対して複数のタプルが入力された場合，そのタプル間の順序は不定となります。メソッドでは，引数で渡されるタプルの順序に依存しない処理を実装する必要があります。

initialize()メソッド

形式

abstract void initialize()

説明

外部定義関数の実装クラスが持つフィールドなどの初期化処理を実装する抽象メソッドです。

SDPサーバは，外部定義関数の使用個所ごとに実装クラスのインスタンスを作成し，次の契機でこのメソッドを実行します。

クエリグループを開始したとき

StreamInputインタフェースのputEndメソッドを実行したときのterminateメソッド実行後

パラメーター

なし。

例外

なし。

戻り値

なし。

注意事項

なし。

terminate()メソッド

形式

abstract void terminate()

説明

外部定義関数の実装クラスが持つフィールドのクリアなど，終了処理を実装する抽象メソッドです。

SDPサーバは，外部定義関数の使用個所ごとに実装クラスのインスタンスを作成し，次の契機でこのメソッドを実行します。

クエリグループを停止または閉塞したとき

クエリグループのすべての入力ストリームにStreamInputインタフェースのputEndメソッドを実行したとき

パラメーター

なし。

例外

なし。

戻り値

なし。

注意事項

このメソッドでクリアしないフィールドは，クエリグループを削除するまで値の変更が保持されます。

付録

＜この付録の構成＞

付録A　各バージョンの変更内容

付録B　このマニュアルの参考情報

付録A　各バージョンの変更内容

変更内容（3020-3-V03-10）uCosminexus Stream Data Platform - Application Framework　01-05

追加・変更内容

リレーションを生成しないで直接ストリームデータに対して演算（ストリーム間演算）を実行できるようにした。
また，CQLで，ユーザーがJavaでプログラミングした外部定義関数を使用できるようにした。
ストリームデータに対する演算機能の追加に伴い，操作系CQLに次の関数を追加した。

ストリーム間演算関数

外部定義ストリーム間演算関数

次のファイルを追加した。

外部定義関数定義ファイル

また，予約語としてシステムに登録されている文字列を追加した。

操作系CQLに次の関数を追加した。

組み込み集合関数

スカラ関数

組み込みスカラ関数

これに伴い，予約語としてシステムに登録されている文字列を追加した。

DECIMAL型およびNUMERIC型についての注意事項で，query.decimalRoundingModeパラメーターの指定値を変更した。

StreamInprocessUPインタフェースの説明で，String型の可変長引数を持つコンストラクターの実装に関する注意事項を追加した。

uCosminexus Stream Data Platform - Application Framework　01-01

追加・変更内容

適用OSにLinuxを追加した。

日付データの指定で，年，月，日に，範囲外の値を指定した場合の注意事項を変更した。

英語版のサンプルファイルを追加した。

付録B　このマニュアルの参考情報

このマニュアルを読むに当たっての参考情報を示します。

＜この節の構成＞

付録B.1　関連マニュアル

付録B.2　このマニュアルでの表記

付録B.3　英略語

付録B.4　KB（キロバイト）などの単位表記について

付録B.1　関連マニュアル

関連マニュアルを次に示します。必要に応じてお読みください。

ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework 解説（3020-3-V01）
Stream Data Platform - AFの概要や前提知識について説明しています。
Stream Data Platform - AFの特長やシステム構成などの概要，およびシステムを構築・運用するために必要な前提知識を習得したい場合に参照してください。

ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド（3020-3-V02）
Stream Data Platform - AFの設計・構築・運用方法，および構築時に設定できる機能の詳細について説明しています。
Stream Data Platform - AFのシステムを設計・構築・運用して，ストリームデータの分析を実施する場合に参照してください。

ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework メッセージ（3020-3-V04）
Stream Data Platform - AFが出力するメッセージについて説明しています。
メッセージが出力された際に，必要に応じて参照してください。

なお，このマニュアルでは，関連マニュアルについて，「ストリームデータ処理基盤」を省略して表記しています。

付録B.2　このマニュアルでの表記

このマニュアルでは，製品名およびJava関連用語を次のように表記しています。

表記 | 製品名またはJava関連用語
jar | JavaTM Archive
Java | JavaTM
JavaVM | JavaTM Virtual Machine
JDBC | JavaTM Database Connectivity
JDK | JavaTM Development Kit
JNI | JavaTM Native Interface
Linux | Linux(R)
Linux | Red Hat Enterprise Linux 5 | Red Hat Enterprise Linux(R) 5 Advanced Platform（AMD/Intel 64）
Red Hat Enterprise Linux(R) 5（AMD/Intel 64）
Red Hat Enterprise Linux 6 | Red Hat Enterprise Linux(R) Server 6（64-bit x86_64）
Stream Data Platform - AF | uCosminexus Stream Data Platform - Application Framework

付録B.3　英略語

このマニュアルで使用する英略語を次に示します。

英略語 | 英語での表記
AP | Application Program
API | Application Programming Interface
CPU | Central Processing Unit
CQL | Continuous Query Language
FIFO | First-In First-Out
HTTP | Hyper Text Transfer Protocol
IEEE | Institute of Electrical and Electronic Engineers
RMI | Remote Method Invocation
UCS | Universal multi-octet coded Character Set
UTF | UCS Transformation Format

付録B.4　KB（キロバイト）などの単位表記について

1KB（キロバイト），1MB（メガバイト），1GB（ギガバイト），1TB（テラバイト）はそれぞれ1,024バイト，1,024²バイト，1,024³バイト，1,024⁴バイトです。

索引

[記号]
[数字]
[Ａ][Ｂ][Ｃ][Ｄ][Ｅ][Ｆ][Ｇ][Ｈ][Ｉ][Ｊ][Ｌ][Ｍ][Ｎ][Ｏ][Ｐ][Ｒ][Ｓ][Ｔ][Ｕ][Ｖ][Ｗ]
[ア行][カ行][サ行][タ行][ナ行][ハ行][マ行][ヤ行][ラ行]

(記号)

$*

* ,[2]

(数字)

10進定数

(英字)

(Ａ)

ABS関数

ACOS関数

ALL

APIの一覧

ASIN関数

ATAN2関数

ATAN関数

AVG

(Ｂ)

BIGINT_TOSTRING関数

(Ｃ)

CEIL関数

close()メソッド〔SDPConnectorインタフェース〕

close()メソッド〔StreamInputインタフェース〕

close()メソッド〔StreamOutputインタフェース〕

CONCAT関数

connect()メソッド〔SDPConnectorFactoryクラス〕

CORREL関数

COSH関数

COS関数

COUNT

COVAR_POP関数

COVAR関数

CQL

CQLで使用できる文字

CQLの一覧

CQLの記述形式

CQLの基本項目の指定方法

CQLの体系

CQLのデータ型

CQLのデータ型とJavaのデータ型のマッピング

CQL文法説明で使用する記号

CQLリファレンス

(Ｄ)

DAY

DECIMAL_TOSTRING関数

DECIMAL型およびNUMERIC型についての注意事項

DISTANCE3関数

DISTANCE関数

DOUBLE_TOSTRING関数

DSTREAM ,[2]

(Ｅ)

equals(Object obj)メソッド〔StreamTupleクラス〕

equals(StreamTime when)メソッド〔StreamTimeクラス〕

execute(SDPConnector con)メソッド〔StreamInprocessUPインタフェース〕

executeStreamFunc(Collection<Object[]>[] ObjectArrayCollection,Timestamp timestamp)メソッド〔SDPExternalStreamFunctionインタフェース〕

EXP関数

(Ｆ)

FLOOR関数

FROM句

(Ｇ)

get()メソッド〔StreamOutputインタフェース〕

get(int count, long timeout)メソッド〔StreamOutputインタフェース〕

get(int count)メソッド〔StreamOutputインタフェース〕

getAll()メソッド〔StreamOutputインタフェース〕

getAll(long timeout)メソッド〔StreamOutputインタフェース〕

getDataArray()メソッド〔StreamTupleクラス〕

getFreeQueueSize()メソッド〔StreamInputインタフェース〕

getFreeQueueSize()メソッド〔StreamOutputインタフェース〕

getMaxQueueSize()メソッド〔StreamInputインタフェース〕

getMaxQueueSize()メソッド〔StreamOutputインタフェース〕

getSystemTime()メソッド〔StreamTupleクラス〕

getTimeMillis()メソッド〔StreamTimeクラス〕

GROUP BY句

(Ｈ)

hashCode()メソッド〔StreamTimeクラス〕

hashCode()メソッド〔StreamTupleクラス〕

HAVING句

HOUR

(Ｉ)

initialize()メソッド〔SDPExternalStreamFunctionインタフェース〕

INT_TOSTRING関数

isClosed()メソッド〔SDPConnectorインタフェース〕

isStarted()メソッド〔StreamInputインタフェース〕

ISTREAM ,[2]

(Ｊ)

jar

javac

Javaのデータ型

jp.co.Hitachi.soft.sdp.api ,[2]

jp.co.Hitachi.soft.sdp.api.inprocess

jp.co.Hitachi.soft.sdp.common.data

jp.co.Hitachi.soft.sdp.common.util

jp.co.Hitachi.soft.sdp.plugin.function.stream

(Ｌ)

LENGTH関数

LEQ関数

LGE関数

LGT関数

LLE関数

LLT関数

LN関数

LOG関数

(Ｍ)

MAX

MILLISECOND

MIN

MINUTE

MOD関数

(Ｎ)

NAN関数

NEGATIVE_INFINITY関数

NOW

NOWウィンドウ

NUMBER_TODATE関数

NUMBER_TOTIME関数

(Ｏ)

onEvent(StreamTuple tuple)メソッド〔StreamEventListenerインタフェース〕

openStreamInput(String group_name,String stream_name)メソッド〔SDPConnectorインタフェース〕

openStreamOutput(String group_name,String stream_name)メソッド〔SDPConnectorインタフェース〕

(Ｐ)

PARTITION BY

PARTITION BYウィンドウ

PI関数

POSITIVE_INFINITY関数

POWER関数

put(ArrayList<StreamTuple> tuple_list)メソッド〔StreamInputインタフェース〕

put(StreamTuple tuple)メソッド〔StreamInputインタフェース〕

putEnd()メソッド〔StreamInputインタフェース〕

(Ｒ)

RANGE

RANGEウィンドウ ,[2]

REAL_TOSTRING関数

REGEXP_FIRSTSEARCH関数

REGEXP_REPLACE関数

REGEXP_SEARCH関数

registerForNotification(StreamEventListener n)メソッド〔StreamOutputインタフェース〕

REGISTER QUERY_ATTRIBUTE句

REGISTER QUERY句

REGISTER STREAM句

RMI連携カスタムアダプター

RMI連携カスタムアダプターの作成

RMI連携カスタムアダプターのサンプルプログラム

RMI連携カスタムアダプターのサンプルプログラムの実行手順

RMI連携データ受信APの内容

RMI連携データ送信APの内容

RMI連携用API

ROUND関数

ROWS

ROWSウィンドウ

RSTREAM ,[2]

(Ｓ)

SDPClientExceptionクラス

SDPClientExceptionクラスのサブクラス

SDPClientFreeInputQueueSizeLackExceptionクラス

SDPClientFreeInputQueueSizeThresholdOverExceptionクラス

SDPConnectorFactoryクラス

SDPConnectorFactoryクラスのメソッド一覧

SDPConnectorインタフェース

SDPConnectorインタフェースのメソッド一覧

sdpcqlstopコマンドによるクエリグループ停止の流れ

sdpcqlstopコマンドの実行によるクエリグループ停止の通知

SDPExternalStreamFunctionインタフェース

SECOND

SELECT句

SINH関数

SIN関数

SPLENGTH関数

SQRT関数

STDDEV_POP関数

STDDEV関数

stop()メソッド〔StreamInprocessUPインタフェース〕

StreamEventListenerインタフェース

StreamEventListenerインタフェースのメソッド一覧

StreamInprocessUPインタフェース

StreamInprocessUPインタフェースのメソッド一覧

StreamInputインタフェース ,[2] ,[3]

StreamInputインタフェースのメソッド一覧

StreamOutputインタフェース ,[2] ,[3]

StreamOutputインタフェースのメソッド一覧

StreamTimeクラス

StreamTimeクラスのメソッド一覧

StreamTuple(Object[] dataArray)コンストラクター

StreamTupleクラス

StreamTupleクラスのメソッド一覧

SUM

(Ｔ)

TANH関数

TAN関数

terminate()メソッド〔SDPExternalStreamFunctionインタフェース〕

TIME_TONUMBER関数

TIMEDIFF関数

TIMESTAMP_TONUMBER関数

TIMESTAMPDIFF関数

TODEGREES関数

TORADIANS関数

toString()メソッド〔StreamTimeクラス〕

toString()メソッド〔StreamTupleクラス〕

(Ｕ)

UNION句

unregisterForNotification(StreamEventListener n)メソッド〔StreamOutputインタフェース〕

(Ｖ)

VAR_POP関数

VAR関数

(Ｗ)

WHERE句

(ア行)

(あ)

値式

値式一次子

値の丸め方

アプリケーション連携方式

(い)

一般集合関数

インプロセス連携カスタムアダプター

インプロセス連携カスタムアダプターの作成

インプロセス連携カスタムアダプターのサンプルプログラム

インプロセス連携カスタムアダプターのサンプルプログラムの実行手順

インプロセス連携送受信制御APの内容

インプロセス連携データ受信APの内容（ポーリング方式）

インプロセス連携データ送信APの内容

インプロセス連携用API

(う)

ウィンドウ演算

ウィンドウ演算の種類

ウィンドウ指定

(え)

演算子

演算の関係

(お)

オペランド

(カ行)

(か)

改行コード

外部定義関数インタフェース

外部定義関数定義ファイル

外部定義関数の概要

外部定義関数の作成例

外部定義関数の実装

外部定義関数の変更

外部定義ストリーム間演算関数

カスタムアダプター

カスタムアダプター作成時の留意事項

カスタムアダプターで実装する処理

カスタムアダプターの位置づけ

カスタムアダプターの作成

カスタムアダプターの作成でできること

カスタムアダプターの種類

数定数 ,[2]

数データ

数データの比較

環境変数

環境変数PATH

関係演算

関係演算の種類

関数グループ名

関数名

関連マニュアルとの関係

(き)

キーワード ,[2]

キーワードの指定

キーワードの指定例

基本項目

基本項目の指定方法

キャスト指定

キャストによって数データと比較できる文字データの書式

キューあふれが発生した場合の動作

キューあふれの事前防止

共通API

(く)

クエリ結果データの受信（RMI連携カスタムアダプター）

クエリ結果データの受信（インプロセス連携カスタムアダプター）

クエリ定義での制限値

クエリ定義での注意事項

クエリ定義での注意事項および制限値

クエリ定義のサンプル

クエリの定義

クエリの定義でできること

クエリの定義例

区切り文字の種類

区切り文字の挿入

区切り文字の挿入例

区切り文字を挿入する位置

区切り文字を挿入できない位置

区切り文字を挿入できる位置

組み込み関数の一覧

組み込み集合関数

組み込み集合関数の一覧

組み込みスカラ関数

組み込みスカラ関数の一覧

(け)

結合

結合処理とROWSウィンドウを併用する場合の注意事項

結合処理の例

(こ)

項

コールバック方式 ,[2]

このマニュアルの構成

コンパイル手順

(サ行)

(さ)

サンプルプログラムの構成

(し)

時間指定

時間による指定の例

時刻印データ

時刻印データの規定の文字列表現

時刻解像度の指定 ,[2] ,[3]

時刻解像度を指定した定義例

時刻関数

時刻データ

時刻データの規定の文字列表現

集合関数 ,[2]

集合関数による演算処理の例

修飾

出力ストリーム

出力ストリームキュー

出力ストリームキューのキューあふれが事前に防止される処理

出力ストリームキューのキューあふれが発生した場合の動作

出力ストリームキューのキューあふれの事前防止

出力ストリームデータへの変換

出力リレーション

出力リレーションから削除されたタプルを出力する指定の例

出力リレーション内のタプルの集合を一定間隔で出力する指定の例

出力リレーションに追加されたタプルを出力する指定の例

使用できる文字

使用できる文字コード

(す)

数学関数

数値の指定

スカラ関数

ストリーム化演算

ストリーム化演算の種類

ストリーム化演算の例

ストリーム間演算関数

ストリーム句

ストリームデータ受信時 ,[2]

ストリームデータ送信時 ,[2]

ストリームデータの送信（RMI連携カスタムアダプター）

ストリームデータの送信（インプロセス連携カスタムアダプター）

ストリームの定義

ストリーム名

(せ)

整数定数

選択

選択式

選択式に相関名を指定した場合

選択リスト

(そ)

相関名 ,[2]

操作系CQL ,[2]

操作系CQLの一覧

(タ行)

(た)

タブコード

タプル送信時の時刻情報の制御

タプル入力完了後の処理

タプルへの時刻情報の設定

探索条件

(て)

定義系CQL ,[2]

定義系CQLの一覧

定数 ,[2]

定数の種類

定数の表記方法

データ型一般の比較

データ識別子

データ識別子指定

データ識別子の有効範囲

データ受信AP

データ受信APの終了契機の把握（データ処理終了の通知）

データ受信APの終了契機の把握方法

データ送受信用API

データ送受信用APIを使用したサンプルプログラム

データ送信AP

データ送信APとデータ受信APで異なるデータ送受信方法を使用する場合

データ送信APによるデータ送信終了通知の流れ

データ送信APのメソッド呼び出し（putEndメソッド）によるデータ送信終了の通知

データソースモードでの時刻情報の設定

データの数による指定の例

データのグループによる指定の例

データの送受信方法による分類

データの抽出

データの比較

データを比較する際の留意点

(と)

問い合わせ

統計関数

到着したタプルのタイムスタンプ時刻の指定による例

導入から運用までの流れ

(ナ行)

(な)

名前の指定

名前の修飾

(に)

入力ストリーム

入力ストリームキュー

入力ストリームキューでキューあふれが発生した場合の動作

入力ストリームキューのキューあふれの事前防止

入力ストリームキューのキューあふれを事前に防止するデータ送信APの実装方法

入力リレーション

入力リレーションの生成

(ハ行)

(は)

範囲変数

半角空白

(ひ)

比較演算項

比較演算子

比較述語

比較できるデータ型の組み合わせ

日付，時刻，および時刻印データの比較

日付データ

日付データの規定の文字列表現

表記方法

表識別子

(ふ)

複数の入力ストリームに対して複数のデータ送信APからタプルを送信する場合の処理順序

符号

復帰コード

浮動小数点定数

フリーフォーマット形式

(へ)

変換関数

(ほ)

ポーリング方式 ,[2] ,[3]

(マ行)

(ま)

マッピング

(め)

メッシュ

メッシュ間隔

メモリ使用量増加の抑止

(も)

文字データ

文字データの比較

文字列関数

文字列定数 ,[2] ,[3]

(ヤ行)

(よ)

予約語としてシステムに登録されている文字列

(ラ行)

(り)

リスナーオブジェクト

リレーション

リレーション参照

リレーション参照に相関名を指定した場合

リレーション式

リレーション名

(れ)

例外クラス

列指定

列指定リスト

列名

■ 商標類

BSAFEは，EMC Corporationの米国およびその他の国における登録商標または商標です。
Microsoftは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
Linuxは，Linus Torvalds氏の日本およびその他の国における登録商標または商標です。
OracleとJavaは，Oracle Corporation 及びその子会社，関連会社の米国及びその他の国における登録商標です。
Red Hatは，米国およびその他の国でRed Hat, Inc. の登録商標もしくは商標です。
RSAは，EMC Corporationの米国およびその他の国における登録商標または商標です。
Windowsは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
Windows Serverは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
その他記載の会社名，製品名は，それぞれの会社の商標もしくは登録商標です。
Portions of this software were developed at the National Center for Supercomputing Applications (NCSA) at the University of Illinois at Urbana-Champaign.
Regular expression support is provided by the PCRE library package, which is open source software, written by Philip Hazel, and copyright by the University of Cambridge, England. The original software is available from ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
This product includes software developed by Andy Clark.
This product includes software developed by Ben Laurie for use in the Apache-SSL HTTP server project.
This product includes software developed by Daisuke Okajima and Kohsuke Kawaguchi (http://relaxngcc.sf.net/).
This product includes software developed by IAIK of Graz University of Technology.
This product includes software developed by Ralf S. Engelschall <rse@engelschall.com> for use in the mod_ssl project (http://www.modssl.org/).
This product includes software developed by the Apache Software Foundation (http://www.apache.org/).
This product includes software developed by the Java Apache Project for use in the Apache JServ servlet engine project (http://java.apache.org/).
This product includes software developed by the University of California, Berkeley and its contributors.
This software contains code derived from the RSA Data Security Inc. MD5 Message-Digest Algorithm, including various modifications by Spyglass Inc., Carnegie Mellon University, and Bell Communications Research, Inc (Bellcore).
uCosminexus Stream Data Platform - Application Frameworkは，米国EMC コーポレーションのRSA BSAFE(R)ソフトウェアを搭載しています。