module Pruning module Processing class Pruner def initialize(tree) @tree = tree end def prune_tree(indicator_ids) pruned_tree = @tree.dup prune_subtree(pruned_tree, indicator_ids) pruned_tree end private def prune_subtree(nodes, indicator_ids) nodes_to_examine = nodes.dup nodes_to_examine.each do |node| if indicator_node?(node) unwanted_indicator = !indicator_ids.include?(node['id']) nodes.delete(node) if unwanted_indicator else has_no_wanted_indicators_in_children = prune_subtree(children(node), indicator_ids) nodes.delete(node) if has_no_wanted_indicators_in_children end end nodes.empty? end def children(node) node.fetch('sub_themes', false) || node.fetch('categories', false) || node.fetch('indicators', false) || [] end def indicator_node?(node) children(node).empty? end end end end