class Puppet::Pops::Evaluator::CollectorTransformer

Public Instance Methods

transform(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 10
def transform(o, scope)
  raise ArgumentError, "Expected CollectExpression" unless o.is_a? Puppet::Pops::Model::CollectExpression

  raise "LHS is not a type" unless o.type_expr.is_a? Puppet::Pops::Model::QualifiedReference
  type = o.type_expr.value().downcase()

  if type == 'class'
    fail "Classes cannot be collected"
  end

  resource_type = scope.find_resource_type(type)
  fail "Resource type #{type} doesn't exist" unless resource_type

  adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(o)
  line_num = adapter.line
  position = adapter.pos
  file_path = adapter.locator.file

  if !o.operations.empty?
    overrides = {
      :parameters => o.operations.map{ |x| @@evaluator.evaluate(x, scope)}.flatten,
      :file       => file_path,
      :line       => [line_num, position],
      :source     => scope.source,
      :scope      => scope
    }
  end

  code = query_unless_nop(o.query, scope)

  case o.query
  when Puppet::Pops::Model::VirtualQuery
    newcoll = Puppet::Pops::Evaluator::Collectors::CatalogCollector.new(scope, resource_type.name, code, overrides)
  when Puppet::Pops::Model::ExportedQuery
    match = match_unless_nop(o.query, scope)
    newcoll = Puppet::Pops::Evaluator::Collectors::ExportedCollector.new(scope, resource_type.name, match, code, overrides)
  end

  scope.compiler.add_collection(newcoll)

  newcoll
end

Protected Instance Methods

match(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 59
def match(o, scope)
  @@match_visitor.visit_this_1(self, o, scope)
end
match_AndExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 160
def match_AndExpression(o, scope)
  left_match = match(o.left_expr, scope)
  right_match = match(o.right_expr, scope)
  return [left_match, 'and', right_match]
end
match_ComparisonExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 172
def match_ComparisonExpression(o, scope)
  left_match = match(o.left_expr, scope)
  right_match = match(o.right_expr, scope)
  return [left_match, o.operator.to_s, right_match]
end
match_ConcatenatedString(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 190
def match_ConcatenatedString(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_LiteralBoolean(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 182
def match_LiteralBoolean(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_LiteralNumber(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 194
def match_LiteralNumber(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_LiteralString(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 186
def match_LiteralString(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_Object(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 206
def match_Object(o, scope)
  raise ArgumentError, "Cannot transform object of class #{o.class}"
end
match_OrExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 166
def match_OrExpression(o, scope)
  left_match = match(o.left_expr, scope)
  right_match = match(o.right_expr, scope)
  return [left_match, 'or', right_match]
end
match_ParenthesizedExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 202
def match_ParenthesizedExpression(o, scope)
 match(o.expr, scope)
end
match_QualifiedName(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 198
def match_QualifiedName(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_VariableExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 178
def match_VariableExpression(o, scope)
  @@evaluator.evaluate(o, scope)
end
match_unless_nop(query, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 69
def match_unless_nop(query, scope)
  unless query.expr.nil? || query.expr.is_a?(Puppet::Pops::Model::Nop)
    match(query.expr, scope)
  end
end
query(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 55
def query(o, scope)
  @@query_visitor.visit_this_1(self, o, scope)
end
query_AndExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 75
def query_AndExpression(o, scope)
  left_code = query(o.left_expr, scope)
  right_code = query(o.right_expr, scope)
  proc do |resource|
    left_code.call(resource) && right_code.call(resource)
  end
end
query_ComparisonExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 91
def query_ComparisonExpression(o, scope)
  left_code = query(o.left_expr, scope)
  right_code = query(o.right_expr, scope)

  case o.operator
  when :'=='
    if left_code == "tag"
      # Ensure that to_s and downcase is done once, i.e. outside the proc block and
      # then use raw_tagged? instead of tagged?
      if right_code.is_a?(Array)
        tags = right_code
      else
        tags = [ right_code ]
      end
      tags = tags.collect do |t|
        raise ArgumentError, 'Cannot transform a number to a tag' if t.is_a?(Numeric)
        t.to_s.downcase
      end
      proc do |resource|
        resource.raw_tagged?(tags)
      end
    else
      proc do |resource|
        if (tmp = resource[left_code]).is_a?(Array)
          @@compare_operator.include?(tmp, right_code, scope)
        else
          @@compare_operator.equals(tmp, right_code)
        end
      end
    end
  when :'!='
    proc do |resource|
      !@@compare_operator.equals(resource[left_code], right_code)
    end
  end
end
query_ConcatenatedString(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 140
def query_ConcatenatedString(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_LiteralBoolean(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 132
def query_LiteralBoolean(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_LiteralNumber(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 144
def query_LiteralNumber(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_LiteralString(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 136
def query_LiteralString(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_Object(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 156
def query_Object(o, scope)
  raise ArgumentError, "Cannot transform object of class #{o.class}"
end
query_OrExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 83
def query_OrExpression(o, scope)
  left_code = query(o.left_expr, scope)
  right_code = query(o.right_expr, scope)
  proc do |resource|
    left_code.call(resource) || right_code.call(resource)
  end
end
query_ParenthesizedExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 152
def query_ParenthesizedExpression(o, scope)
 query(o.expr, scope)
end
query_QualifiedName(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 148
def query_QualifiedName(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_VariableExpression(o, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 128
def query_VariableExpression(o, scope)
  @@evaluator.evaluate(o, scope)
end
query_unless_nop(query, scope) click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 63
def query_unless_nop(query, scope)
  unless query.expr.nil? || query.expr.is_a?(Puppet::Pops::Model::Nop)
    query(query.expr, scope)
  end
end

Public Class Methods

new() click to toggle source
# File lib/puppet/pops/evaluator/collector_transformer.rb, line 3
def initialize
  @@query_visitor    ||= Puppet::Pops::Visitor.new(nil, "query", 1, 1)
  @@match_visitor    ||= Puppet::Pops::Visitor.new(nil, "match", 1, 1)
  @@evaluator        ||= Puppet::Pops::Evaluator::EvaluatorImpl.new
  @@compare_operator ||= Puppet::Pops::Evaluator::CompareOperator.new()
end