今回はパフォーマンスを比べてみようと思います。
ご存知、resolveNodeとresolveNodesはノードの検索をかねてます。
resolveNodeの方は単一のノード
resolveNodesの方はひとつ以上のノードになります。ご存知のように、resolveNodes("test[*]")やresolveNodes("test[5]")と書けても、resolveNode("test[*]")やresolveNode("test[5]")とはかけません。Xpathのシンタックスです。
そして、
var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");
や、
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");
としてほしいノードの値を得ることができます。
でもこれって、ループでもできるよねぇ。で、こんな感じ。
var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;
for (i=0; i<chk.length; i++){
if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}
}
では、どっちが早いでしょう、。。
<u>答えはループのほうがほんの少し早いだけであんま変わりません。
こちら、XMLの構造
<root>
<l>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<l>
</root>
//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");
if (targetRows.length > 0){
var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));
}
//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");
if (targetRows.length > 0){
var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));
}
//////////TEST Paformance Time.(Loop)
var start = new Date();
var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;
for (i=0; i<chk.length; i++){
if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}
}
var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(fi + " time(s) : "+String(diff));
========================================================================
でもね、こんなテクがresolveNodesならできるんです。
こちらフォームのなんかのイベント。
if (this.rawValue != null){
//dataDOMでsearchCriteriaとsearchCriteria2の両方の検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value.toUpperCase().indexOf('"+searchCriteria.rawValue.toUpperCase+"')>=0 || s2.value.toUpperCase().indexOf('"+searchCriteria2.rawValue.toUpperCase+"')>=0)");
}else{
//dataDOMでデータがないものを検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value==null>=0 || s2.value==null)>=0)");
}
ここでtargetRowsとして検索結果を直接functionへ送る
showtargetRows.targetRowsScript(targetRows);
以下、送られた先のfunction。
function targetRowsScript(targetRows){
for (i=0; i
_dsp.addInstance(0);
var newLine = xfa.resolveNodes("dummyNode[*]").item(main._dummyNode.count - 1);
newLine.s1.rawValue = targetRows.item(i).s1.value;
newLine.s2.rawValue = targetRows.item(i).s2.value;
newLine.s3.rawValue = targetRows.item(i).s3.value;
}
これで、検索の結果がすべてひと塊のデータノードとして形成されるので、データ全体を表示したくないときにページで振り分けて表示したりできます。
なんか、もっと詳しく書きたかったなぁ。
今日は半ちゃんで、もう帰ります。
半ちゃんって、死語?
ねこでした。