def _helper(meta_tree, query_func, selected_key_trails, *curr_key_trail): result = query_func(meta_tree, *curr_key_trail) if result: selected_key_trails.add(tuple(curr_key_trail)) node = metatree.get_node(meta_tree, *curr_key_trail) for key in node.keys(): _helper(meta_tree, query_func, selected_key_trails, *(curr_key_trail + (key,)))
def index_children(meta_tree, field_name, *key_trail): def _helper(node, field_name): meta_data = node.metadata if field_name in meta_data: return helpers.listify(meta_data[field_name]) else: child_agg = None for key in node.keys(): child_ret = _helper(node[key], field_name) if child_ret is not None: if child_agg is None: child_agg = [] child_agg += child_ret return helpers.listify(child_agg) node = get_node(meta_tree, *key_trail) ret = None for key in node.keys(): child_agg = _helper(node[key], field_name) if child_agg is not None: if ret is None: ret = [] ret += child_agg return helpers.listify(ret)