Items in API Script
フィードは、アイテムにより成り立ちますが、API Script ではアイテムはフィードの部品という以上の働きをします。アイテムは、オペレーションにインプットを提供するために使われることもあります。
アイテムの宣言
API Script では、アイテムは、api:set キーワードを通じて作成され、名付けられ、アトリビュート値を与えられます。
<api:set item="input" attr="mask" value="*.txt" />
このラインは、"input" という名前のアイテムの、"mask" アトリビュートに"*text" という値をセットします。この場合、インプットアイテムはAPI Script の変数の働きをします。
ただし、"input" という名前のアイテムは宣言されていません。その代わりに、初回にアトリビュートをセットしようとすると、そのアイテムが生成されます。上の例では、インプットアイテムが存在していない場合、そのアイテムが生成され、mask アトリビュートがセットされます。
アトリビュート値の選択
アトリビュートを参照するには、 item.attribute (e.g., "input.mask") シンタックスを使います。あるアトリビュート値をクエリするには、括弧 ([]) でアトリビュート名を囲います。これは、文字列リテラルとしてではなく、文字列を評価したいということを示します。
例えば、次のコードスニペットを見てください:
<api:set item="item1" attr="attr1" value="value1"/>
<api:set item="item1" attr="attr2" value="item1.attr1"/>
<api:set item="item1" attr="attr3" value="[item1.attr1]"/>
結果は次のとおりです:
- item1.attr1 は、"value1" のリテラル文字列の値を割り振られます。
- item1.attr2 は、"item1.attr1" のリテラル文字列の値を割り振られます。
- item1.attr3 は、"value1" の値を割り振られます。これは、文字列"[item1.attr1]" がitem1 のattr1 アトリビュートとして評価されるからです。
デフォルトアイテム
API Script では、デフォルトアイテムという、アイテムの層の中に黙示的で名付けられていないアイテムがあります。 次の2つのケースでは、デフォルトアイテムは共通してスクリプトをより短く、簡単に書くために使われています。
- オペレーションの呼び出し:デフォルトアイテムは、他に指定されたアイテムがない場合に、デフォルトで呼び出されたオペレーションに渡されるアイテムです。これはつまり、api:set を使って、デフォルトの名付けられていないアイテムのアトリビュートを書いて、そのアトリビュートがスクリプト内の次のオペレーションのインプットとして渡されることを意味します。これは、オペレーションに必要なパラメータを提供する一つの方法です。
- オペレーションまたはスクリプトのアウトプット内の現在のアイテムを処理:オペレーションの結果の変数名を指定しなかった場合、オペレーションを起動するapi:call ブロックの内部でデフォルトアイテムはオペレーションで生成された現在のアイテムを参照します。
<api:set attr="path" value="." />
Named Items
スクリプト内で宣言されたアイテムに加えて、スクリプトのスコープでは、いくつかのビルトインアイテムが利用可能です。 API Script では、ビルトイン、もしくは特殊なアイテムが利用可能で、接続文字列およびSQL クエリへのアクセスのインターフェースを提供します。 これらの特殊なアイテムはインプットをデータ処理オペレーションにマッピングするために役立ちます。
以下のセクションで、特殊なアイテムについて説明します。
Script Inputs (_input)
スクリプトへのインプットは_input アイテムから参照されます。 SQL ステートメントはテーブルおよびストアドプロシージャのスキーマへのインプットを提供します:SELECT ステートメントでは、_input アイテムは、WHERE 句において指定されたカラム、もしくは疑似カラムを含みます。
スクリプト内のデフォルトアイテムから値を読む場合、_input から値を読んでいます。同様に、デフォルトアイテムに書き込みたいアトリビュートは、インプットスクリプトと共にオペレーションのパラメータとして渡されます。情報ブロック、もしくはスクリプト内に定義された変数だけが_input アイテム内では有効です。
api:call ブロックの内部では、_input はデフォルトアイテムではなく、アクセスするためには名前を参照しなければなりません。
Script Outputs (_out[n])
api:call キーワードにより生成されたフィード内の現在のアイテムは、デフォルトアイテムもしくは名前を指定された特殊アイテム"_outX" を通じてアクセスすることができます。X はapi:call のネスティングのレベルです。例えば、単一のapi:call キーワードの内部の場合、アイテム名は"_out2" です。api:call キーワードの3つのネストレベルの内部の場合、_out3 となります。
接続文字列プロパティ (_connection)
_connection アイテムはconnector の接続プロパティを持ちます。connector は、接続文字列プロパティの検証を行いません。どのプロパティを必須とするか、どのように使用するかなどは、スキーマ作成者の決定に委ねられています。
_connection アイテムは、接続プロパティへのアクセスを提供するだけでなく、接続にデータの一部を格納するために使用することもできます。例えば、接続が持続している間に再利用可能なセッショントークンを保持する必要がある場合が考えられます。以下のコード例に示すようにapi:set キーワードを使って任意の値を格納することができます。
<api:set attr="_connection._token" value="[oauth.connection_token]"/>
Note:_ 記号で始まる属性のみを設定することができます。これは、ユーザーが設定した接続プロパティをオーバーライドできないようにするためです。
SQL Clauses (_query)
_query アイテムには、connector に発行されたクエリを説明する次の属性があります。
query | SQL ステートメント。次に例を示します。
SELECT Id, Name FROM Accounts WHERE City LIKE '%New%' AND COUNTRY = 'US' GROUP BY CreatedDate ORDER BY Name LIMIT 10,50; |
selectcolumns | SELECT 句のカラムのカンマ区切りリスト。例えば、この例ではId およびName カラムです。SELECT 句に "*" が指定された場合、[_query.selectcolumns] の値は "*" となります。 |
table | テーブル名。例えば、この例ではAccounts です。 |
isjoin | クエリが結合かどうか。 |
jointable | JOIN 句のテーブル。 |
criteria | WHERE 句。例えば、この例では次のWHERE 句です。
City LIKE '%New%' AND COUNTRY = 'US' |
orderby | ORDER BY 句。例えば、この例ではName です。 |
groupby | GROUP BY 句。例えば、この例ではCreatedDate です。 |
limit | SELECT ステートメントのLIMIT またはTOP 句で指定されたリミット。例えば、この例では50 です。 |
offset | SELECT ステートメントのLIMIT またはTOP 句で指定されたオフセット。例えば、この例では10 です。 |
insertselect | INSERT ステートメントにネストされたSELECT ステートメント。 |
updateselect | UPDATE ステートメントにネストされたSELECT ステートメント。 |
upsertselect | UPSERT ステートメントにネストされたSELECT ステートメント。 |
deleteselect | DELETE ステートメントにネストされたSELECT ステートメント。 |
bulkoperationcolumns | 一括操作が変更するテーブルのカラム。カンマ区切りで指定します。例えば、次のクエリを考えてみましょう:
INSERT INTO Account(account_name, account_type) SELECT customer_name, customer_type FROM Customer#TEMP[_query.bulkoperationcolumns] は次のカラムを返します。 [account_name], [account_type] |
temptablecolumns | 一括操作でtemp テーブルから選択されたカラム。カンマ区切りで指定します。例えば、次のクエリを考えてみましょう:
DELETE FROM Account WHERE EXISTS SELECT customer_name, customer_type FROM Customer#TEMP[_query.temptablecolumns] は次のカラムを返します。 [customer_name], [customer_type] |
nullupdates | null 値またはnull パラメータ値を含む、UPDATE ステートメントのカンマ区切りのカラム。 |
isschemaonly | クエリがスキーマ情報のみを取得するかどうか。 |