これはJavaで行うのは非常に簡単なタスクですが、javascriptの非同期性により、少なくとも今の私の知識では、このタスクは(私にとって)ほとんど不可能です(私はjavascriptをbashしようとはしていません。言語が大好きです!)。
それは非常に基本的です。トップレベルツリーには、私のmysqlデータベースにnullの親があります。子供を見つけるのは簡単です。子供たちは彼らに利用可能なラインを持っています。木の深さは可変です。
private static Set<Tree> getBranches( Tree trunk ) {
Set<Tree> treeSet = new HashSet<Tree>();
if ( trunk != null ) {
if ( trunk.hasLines() ) { //queries if tree has lines. returns true or false
treeSet.add( trunk );
}
for ( Tree tree : trunk.treeList ) {
treeSet.addAll( getBranches( tree ) );
}
}
return treeSet;
}
基本的に、このメソッドは、ツリーに使用可能な行があるかどうかをテストします。含まれている場合は、それらすべてをセットに追加します。そうでない場合は、行が見つかるまで続行します。
mysqlノードライブラリの非同期性により、このタスクは地獄に変わります。
これが私が今持っているものです
function hasLines(tree_id, callback) {
var ret;
pool.query('SELECT * from pkg_line_tree where tree_id = ?', [tree_id], function (err, rows) {
if (rows.length > 0) {
ret = true;
} else {
ret = false;
}
callback(ret);
});
}
function dig(tree_id, treeArray, callback) {
pool.query('SELECT * from tree where parent_id = ?', [tree_id], function (err, rows) {
if (rows) {
for (var i in rows) {
hasLines(rows[i].tree_id, function (t) {
if (t) {
treeArray.push(rows[i].tree_id);
} else {
treeArray.concat(dig(rows[i].tree_id, treeArray));
}
});
}
if (callback) {
callback(treeArray);
}
}
});
return treeArray;
}
var treeArray = [];
dig(52, treeArray, function (t) {
res.json(t);
});
私は本当にこのルートツリーで利用可能なすべての子を出力する必要があります。
これが意味をなさない場合はお知らせください。リファクタリングを試みます。ある種のポイントが伝わったことを願っています。私はこれを成し遂げるためにファイバーのようなものを使うのは嫌いですが、私は選択肢がありません。ありがとう。