This is super simple task to do in Java but the asynchronous nature of javascript makes this task(for me) almost impossible, at least with my knowledge now.(I’m not trying to bash javascript. Love the language!).
It’s very basic. A top level tree has a parent of null in my mysql database. It’s easy finding children. The children have lines available to them. The depth of the tree is variable.
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;
}
Basically the method tests if the tree has lines available. If it does it adds all of those to a set. If not it continues until it finds lines.
The asynchronous nature of the mysql node library turns this task into hell.
Here is what I have now
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);
});
I really just need to output all the children available in this root tree.
Please let me know if this doesn’t make sense. I’ll try to refactor. I’m hoping I got some kind of point across. I’d hate to use something like Fibers to get this done but I’m out of options. Thanks.
Your use of
dig()isn’t currently consistent:Also, the
concatin the last line isn’t actually doing much, since it doesn’t alter the array it’s called on. You probably wouldn’t actually want it to asdigpasses around thetreeArrayrather than defining a newtreeSetlike ingetBranches. So, if it did, it would appendtreeArrayonto the end of itself each time.You could still use
concatwith multipletreeSets, but you’d have to store itsreturnvalue:And, you’ll have to replace the
forloop this with an asynchronous iterator as the loop won’t wait for asynchronous operations before continuing. Theasynclibrary has a few options for this, if you’re up for trying it.So, with multiple
treeSets,concat, andasync.forEachSeries, you could try: