def evaluate(source, filter_indices)
if type == :detail_page
return @filters[0].evaluate(source)
end
indices_to_evaluate = filter_indices.nil? ? 0...@filters.size : filter_indices
all_filter_results = []
indices_mapping = {}
indices_to_evaluate.each do |filter_index|
filter = @filters[filter_index]
filter_results = filter.evaluate(source)
filter_results.each do |result|
all_filter_results << result if all_filter_results.index(result).nil?
(indices_mapping[result] ||= []) << filter_index
end
end
if @constraints.size > 0
all_filter_results = all_filter_results.select do |result|
@constraints.inject(true) { |accepted, constraint| accepted && constraint.check(result) }
end
end
all_filter_results = @result_indexer.select_indices_to_extract(all_filter_results) if !@result_indexer.nil?
result_nodes = []
all_filter_results.each do |result|
node = ResultNode.new(@name, result, @options)
node.generated_by_leaf = (@children.size == 0)
@children.each do |child|
raise if self.filter_count != 1 && child.filter_count != self.filter_count
if self.filter_count == 1
node.push(*child.evaluate(result, nil))
else
node.push(*child.evaluate(result, indices_mapping[result]))
end
end
required_child_names = @constraints.select {|c| c.type == Scrubyt::Constraint::CONSTRAINT_TYPE_ENSURE_PRESENCE_OF_PATTERN }.map {|c| c.target}
unless required_child_names.empty?
check = lambda { |node_to_check|
required_child_names.delete node_to_check.name
node_to_check.each { |child| check.call child }
}
check.call node
end
next unless required_child_names.empty?
result_nodes << node
end
if result_nodes.empty?
result_nodes << ResultNode.new(@name, @options[:default], @options) if @options[:default]
end
case output_type
when :model
return result_nodes
when :page_list
result_nodes.each do |result_node|
@extractor.add_to_next_page_list result_node
end
return []
end
end