記述されたプロセッサの例
記述されたプロセッサでのスクリプトの使用
スクリプトは、scriptという名前のウィジェット・パラメータとして定義されます。これは、<または>または&などの文字に関する問題を避けるために、XML CDATAセクションに入力されます。
デフォルトでは、スクリプト全体は、処理された各レコードに対して実行されます。functionという名前のパラメータが存在する場合、これにより、各レコードにコールされるスクリプトで関数が識別されます。この方がより効率がよくなります。
スクリプト内で、各プロセッサ入力は、JavaScript名inputNにマップされます(この場合のNは、XMLからの入力IDです)。入力で複数の属性が許可されている場合、値は配列となり、それ以外の場合はプレーン値です。
各プロセッサからの出力は、JavaScript名outputNに割り当てられます(この場合のNは、XMLからの出力IDです)。
プロパティとリソース
まず、プロセッサ・オプションは、プロパティと内部的に呼ばれており、プロパティでは参照データが使用され、これはリソースと内部的に呼ばれていることに注意してください。
パッケージ化されたスクリプト・プロセッサは、プロパティおよびリソースを参照できます。
各プロパティは、プロパティと同じ名前のJavaScript変数にマップされます。リソース以外のプロパティは、同等のJavaScriptタイプ(文字列、数値、日付など)に設定されます。各リソース・プロパティは、リソースの問合せを可能にするメソッドおよびプロパティを含む内部タイプとして作成されます。
次のプロパティおよびメソッドを、リソース値で使用できます。
| 名前 | タイプ | 意味 |
|---|---|---|
|
|
文字列 |
リソースの名前 |
|
|
数値 |
リソースに定義されているキー(ルックアップ列)の数 |
|
|
数値 |
リソースに定義されている結果値(戻り列)の数 |
|
|
文字列の配列 |
キー(ルックアップ列)のデータ・タイプ(文字列、数値、日付)および結果(戻り列) - キーが先で次が結果です。 |
|
|
リソース・レコードの配列 |
リソースのすべての要素のロード |
|
|
リソース・レコードの配列 |
リソースの問合せ(キーの数およびタイプはリソース定義と一致する必要があります)。 |
loadAllまたはqueryによって返される各リソース・レコードは、リソース・レコードのキー値および結果値を含む配列です。一致するレコードがない場合、メソッド・コールの結果は空の配列になります。
リソースの内容全体が必要な場合、次のように事前ロード・パラメータをプロパティ定義で設定し、フレームワークがリソースを1回ロードし、プロセス・スレッドで値を共有するように指定する必要があります。
<resource name="resprop" required="false" structure="1:0" loadable="true">
<guidata><label>Resource property</label></guidata>
<parameters>
<parameter name="preload">true</parameter>
</parameters>
</resource>
loadAllコールが、次に、共有配列を返します。このプロパティ定義を指定すると、次のJavaScriptコード・フラグメントをリソースに関する情報の出力に使用できます。
var records = resprop.loadall();
output1 = 'Name: ' + resprop.name + "; keys: " + resprop.keys +
"; results: " + resprop.results;
output1 += ' (' + records.length + ' records)'
完全な例
これは、クレジット・カード番号の検証プロセッサ(ウィジェット)を記述しているwidgets.xmlファイルの完全な例です。
この例の目的は、プロセッサ(ウィジェット)がどのように構築されるかを説明することであるため、クレジット・カード検証の実際の詳細は省略されています。
この場合、ウィジェットには2つの出力、つまり成功フラグ(YまたはN)とクレジット・カード・タイプ(Amex、Mastercardなど)があります。例のコードでは、合計桁数のmod 10をタイプの配列へのルックアップとして使用しています。
例2-9 完全なwidgets.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<widgets>
<comment>Example packaged JavaScript widgets</comment>
<groupid>1000:custom</groupid>
<!-- ========== -->
<!-- CC checker -->
<!-- ========== -->
<widget id="rde:scdemo" class="com.datanomic.director.widget.scripting.JavaScriptWidget">
<guidata>
<label>Simple CC check demo thing</label>
<group>Custom scripts</group>
</guidata>
<!-- inputs -->
<inputs>
<input id="1" type="string">
<guidata><label>Input CC</label></guidata>
</input>
</inputs>
<!-- outputs -->
<outputs cardinality="1:1">
<output id="1" type="string" name="valid" metadata="true">
<guidata><label>Validity</label></guidata>
</output>
<!-- CC type or message -->
<output id="2" type="string" name="type">
<guidata><label>Type</label></guidata>
</output>
</outputs>
<!-- Spigots -->
<spigots>
<!-- All -->
<spigot id="1">
<guidata><label>All</label></guidata>
</spigot>
<!-- Valid -->
<spigot id="2">
<guidata><label>Valid</label></guidata>
<filter outputid="1" value="Y" equals="true"/>
</spigot>
<!-- Invalid -->
<spigot id="3">
<guidata><label>Invalid</label></guidata>
<filter outputid="1" value="N" equals="true"/>
</spigot>
</spigots>
<!-- Results -->
<results>
<metrics>
<!-- Summary metric: key is valid string -->
<metric id="1" type="fixed">
<fixedrecords fromspigots="true"/>
<drilldowns>
<metricdrill name="types" metricid="2" view="counter"/>
<datadrill name="data" destid="1"/>
</drilldowns>
</metric>
<!-- Frequency count of types -->
<metric id="2" type="variable">
<!-- Simple counter, ignoring no data values -->
<variablerecords keyval="output:2">
<filter outputid="1" value="Y"/>
</variablerecords>
<!-- Drilldown by type -->
<drilldowns>
<datadrill name="bytype" destid="2"/>
</drilldowns>
</metric>
</metrics>
<views default="summary">
<!-- Summary view with:
1. Number and % of records with valid values
2. Number and % of records with invalid values
-->
<view name="summary" viewtype="fixed" metricid="1">
<guidata>
<label>Summary</label>
</guidata>
<columns>
<!-- Number and % of records with valid values-->
<columngroup drilldown="types">
<guidata><label>Valid</label></guidata>
<selector match="Y"/>
<column datum="$count">
<guidata><label>Valid</label></guidata>
</column>
<column datum="$percent" format="0.0">
<guidata><label>%</label></guidata>
</column>
</columngroup>
<!-- Number and % of records with invalid values-->
<columngroup drilldown="data">
<guidata><label>Invalid</label></guidata>
<selector match="N"/>
<column datum="$count">
<guidata><label>Invalid</label></guidata>
</column>
<column datum="$percent" format="0.0">
<guidata><label>%</label></guidata>
</column>
</columngroup>
</columns>
</view>
<!-- Counter view -->
<view name="counter" viewtype="variable" metricid="2" sortby="cp.countcol d" drilldown="bytype">
<guidata>
<label>Credit card types</label>
</guidata>
<!-- Type and count -->
<columns>
<column datum="$key">
<guidata><label>Type</label></guidata>
</column>
<!-- Number and % of records matching the pattern -->
<columnset name="cp" ref="countpercent"/>
</columns>
</view>
</views>
</results>
<!-- Parameters -->
<parameters>
<parameter name="script">
<![CDATA[
///*************************************************************************
// string checkcc([String CardNumber])
//
// Returns CC type or null if invalid. Simple demo mod 10 of sum of digits
// to determine CC type.
//
//*************************************************************************
var types = [ 'Amex', 'Mastercard', 'Visa' ];
function checkcc(ccnumber) {
if (ccnumber == null || ccnumber.length == 0)
return null;
var sum = 0;
for (var i = 0; i < ccnumber.length; i++)
{ var c = ccnumber.charCodeAt(i) - 48;
if (c >= 0 && c <= 9)
sum += c;
else
return null;
}
sum = sum % 10;
return sum > types.length ? null : types[sum];
}
function doit()
{ var type = checkcc(input1);
output1 = type == null ? 'N' : 'Y';
output2 = type == null ? '-' : type;
}
]]>
</parameter>
<parameter name="function">doit</parameter>
</parameters>
</widget>
<!-- Shared columnset for count and percent columns -->
<columnset name="countpercent">
<column name="countcol" datum="$count">
<guidata><label>Count</label></guidata>
</column>
<column name="percentcol" datum="$percent" format="0.0">
<guidata><label>%</label></guidata>
</column>
</columnset>
</widgets>