Class: Archsight::Query::Evaluator
- Inherits:
-
Object
- Object
- Archsight::Query::Evaluator
- Defined in:
- lib/archsight/query/evaluator.rb
Instance Method Summary collapse
-
#filter(query_node) ⇒ Object
Filter all instances matching query.
-
#initialize(database) ⇒ Evaluator
constructor
A new instance of Evaluator.
-
#matches?(query_node, instance) ⇒ Boolean
Main entry point: evaluate query against instance, returns boolean.
Constructor Details
#initialize(database) ⇒ Evaluator
Returns a new instance of Evaluator.
7 8 9 10 |
# File 'lib/archsight/query/evaluator.rb', line 7 def initialize(database) @database = database @subquery_cache = {} # Cache for pre-computed subquery results end |
Instance Method Details
#filter(query_node) ⇒ Object
Filter all instances matching query
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/archsight/query/evaluator.rb', line 31 def filter(query_node) results = [] target_instances = if query_node.kind_filter klass = Archsight::Resources[query_node.kind_filter] return [] unless klass @database.instances[klass]&.values || [] else all = [] @database.instances.each_value { |h| all.concat(h.values) } all end # If no expression, return all target instances (kind filter only) return target_instances if query_node.expression.nil? # Pre-compute ALL subqueries before the main filter loop # This is the key optimization - subqueries are evaluated once, not per-instance @subquery_cache = {} precompute_subqueries(query_node.expression) target_instances.each do |instance| results << instance if evaluate(query_node.expression, instance) end results end |
#matches?(query_node, instance) ⇒ Boolean
Main entry point: evaluate query against instance, returns boolean
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/archsight/query/evaluator.rb', line 13 def matches?(query_node, instance) # Check kind filter first if query_node.kind_filter instance_kind = instance.class.to_s.split("::").last return false unless instance_kind == query_node.kind_filter end # If no expression, kind filter alone is sufficient (match all of that kind) return true if query_node.expression.nil? # Pre-compute subqueries for this evaluation @subquery_cache = {} precompute_subqueries(query_node.expression) evaluate(query_node.expression, instance) end |