DFS is working
This commit is contained in:
@@ -15,3 +15,7 @@ module Pruning
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ module Pruning
|
|||||||
module HTTP
|
module HTTP
|
||||||
class Query < Struct.new(:name, :indicator_ids)
|
class Query < Struct.new(:name, :indicator_ids)
|
||||||
def initialize(params = {})
|
def initialize(params = {})
|
||||||
|
symbolised = params.map { |k, v| { k.to_sym => v } }.reduce({}, :merge)
|
||||||
values = members.map do |member|
|
values = members.map do |member|
|
||||||
value = params.fetch(member, nil)
|
value = symbolised.fetch(member, nil)
|
||||||
next if value.nil?
|
next if value.nil?
|
||||||
case member
|
case member
|
||||||
when :indicator_ids then value.map(&:to_i) # break on purpose if indicator_ids is not an array
|
when :indicator_ids then value.map(&->(indicator_id) { indicator_id.to_i } ) # break on purpose if indicator_ids is not an array
|
||||||
when :name then value.to_s.gsub(/[^A-Za-z]/,'')
|
when :name then value.to_s.gsub(/[^A-Za-z]/,'')
|
||||||
else value
|
else value
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,25 +2,35 @@ module Pruning
|
|||||||
module Processing
|
module Processing
|
||||||
class Pruner
|
class Pruner
|
||||||
|
|
||||||
def initialize(tree, indicator_ids)
|
def initialize(tree)
|
||||||
@tree = tree
|
@tree = tree
|
||||||
end
|
end
|
||||||
|
|
||||||
def prune_tree(nodes, indicator_ids)
|
def prune_tree(indicator_ids)
|
||||||
nodes.delete_if do |node|
|
pruned_tree = @tree.dup
|
||||||
unwanted_indicator = indicator_node?(node) && !indicator_ids.include?(node['id'])
|
prune_subtree(pruned_tree, indicator_ids)
|
||||||
has_no_wanted_indicators_in_children = prune_tree(children(node), indicator_ids)
|
pruned_tree
|
||||||
|
|
||||||
unwanted_indicator && has_no_wanted_indicators_in_children
|
|
||||||
end
|
|
||||||
nodes.empty?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
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)
|
def children(node)
|
||||||
node.get('sub-themes', false) ||
|
node.fetch('sub_themes', false) ||
|
||||||
node.get('categories', false) ||
|
node.fetch('categories', false) ||
|
||||||
node.get('indicators', false) ||
|
node.fetch('indicators', false) ||
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user