class MetasploitDataModels::Search::Visitor::Relation

Generates a `ActiveRecord::Relation` from an `Metasploit::Model::Search::Query#tree`

Constants

RELATION_METHODS

`ActiveRecord::Relation` methods that can compute their argument with a visitor under the {MetasploitDataModels::Search::Visitor} namespace.

Attributes

query[RW]

@!attribute [rw] query

The query to visit.  Query supplies Class with #scope upon which to build `ActiveRecord::Relation`.

@return [Metasploit::Model::Search::Query]

Public Class Methods

visitor_class_by_relation_method() click to toggle source

Maps method on `ActiveRecord::Relation` to the `Class` under {MetasploitDataModels::Search::Visitor} whose `#visit` method can produce the arguments to the `ActiveRecord::Relation` method.

@return [Hash{Symbol => Class}]

# File app/models/metasploit_data_models/search/visitor/relation.rb, line 68
def self.visitor_class_by_relation_method
  @relation_method_by_visitor_class ||= RELATION_METHODS.each_with_object({}) { |relation_method, relation_method_by_visitor_class|
    visitor_class_name = "#{parent.name}::#{relation_method.to_s.camelize}"
    visitor_class = visitor_class_name.constantize

    relation_method_by_visitor_class[relation_method] = visitor_class
  }
end

Public Instance Methods

visit() click to toggle source

Visits {#query} tree to produce an `ActiveRecord::Relation` on the `Metasploit::Model::Search::Query#klass`.

@return [ActiveRecord::Relation]

# File app/models/metasploit_data_models/search/visitor/relation.rb, line 41
def visit
  tree = query.tree

  # Enumerable#inject does not support 3 arity for Hashes so need to unpack pair
  visitor_by_relation_method.inject(query.klass.all) do |relation, pair|
    relation_method, visitor = pair
    visited = visitor.visit(tree)
    relation.send(relation_method, visited)
  end
end
visitor_by_relation_method() click to toggle source

Map method on `ActiveRecord::Relation` to visitor that can visit `Metasploit::Model::Search::Query#tree` to produce the arguments to the method on `ActiveRecord::Relation`.

@return [Hash{Symbol => visit}]

# File app/models/metasploit_data_models/search/visitor/relation.rb, line 56
def visitor_by_relation_method
  # Enumerable#each_with_object does not support 3 arity for Hashes so need to unpack pair
  @visitor_by_relation_method ||= self.class.visitor_class_by_relation_method.each_with_object({}) { |pair, visitor_by_relation_method|
    relation_method, visitor_class = pair
    visitor_by_relation_method[relation_method] = visitor_class.new
  }
end

Private Instance Methods

valid_query() click to toggle source

Validates that {#query} is valid.

@return [void]

# File app/models/metasploit_data_models/search/visitor/relation.rb, line 82
def valid_query
  if query and !query.valid?
    errors.add(:query, :invalid)
  end
end