class Puppet::Pops::Evaluator::CollectorTransformer

Public Class Methods

new() click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
 5 def initialize
 6   @@query_visitor    ||= Visitor.new(nil, "query", 1, 1)
 7   @@match_visitor    ||= Visitor.new(nil, "match", 1, 1)
 8   @@evaluator        ||= EvaluatorImpl.new
 9   @@compare_operator ||= CompareOperator.new()
10 end

Public Instance Methods

transform(o, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
12 def transform(o, scope)
13   #TRANSLATORS 'CollectExpression' is a class name and should not be translated
14   raise ArgumentError, _("Expected CollectExpression") unless o.is_a? Model::CollectExpression
15 
16   raise "LHS is not a type" unless o.type_expr.is_a? Model::QualifiedReference
17   type = o.type_expr.value().downcase()
18 
19   if type == 'class'
20     fail "Classes cannot be collected"
21   end
22 
23   resource_type = Runtime3ResourceSupport.find_resource_type(scope, type)
24 
25   fail "Resource type #{type} doesn't exist" unless resource_type
26 
27   if !o.operations.empty?
28     overrides = {
29       :parameters => o.operations.map{ |x| @@evaluator.evaluate(x, scope)}.flatten,
30       :file       => o.file,
31       :line       => o.line,
32       :source     => scope.source,
33       :scope      => scope
34     }
35   end
36 
37   code = query_unless_nop(o.query, scope)
38 
39   case o.query
40   when Model::VirtualQuery
41     newcoll = Collectors::CatalogCollector.new(scope, resource_type, code, overrides)
42   when Model::ExportedQuery
43     match = match_unless_nop(o.query, scope)
44     newcoll = Collectors::ExportedCollector.new(scope, resource_type, match, code, overrides)
45   end
46 
47   scope.compiler.add_collection(newcoll)
48 
49   newcoll
50 end

Protected Instance Methods

match(o, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
58 def match(o, scope)
59   @@match_visitor.visit_this_1(self, o, scope)
60 end
match_AccessExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
171 def match_AccessExpression(o, scope)
172   pops_object = @@evaluator.evaluate(o, scope)
173 
174   # Convert to Puppet 3 style objects since that is how they are represented
175   # in the catalog.
176   @@evaluator.convert(pops_object, scope, nil)
177 end
match_AndExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
179 def match_AndExpression(o, scope)
180   left_match = match(o.left_expr, scope)
181   right_match = match(o.right_expr, scope)
182   return [left_match, 'and', right_match]
183 end
match_ComparisonExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
191 def match_ComparisonExpression(o, scope)
192   left_match = match(o.left_expr, scope)
193   right_match = match(o.right_expr, scope)
194   return [left_match, o.operator.to_s, right_match]
195 end
match_ConcatenatedString(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
213 def match_ConcatenatedString(o, scope)
214   @@evaluator.evaluate(o, scope)
215 end
match_LiteralBoolean(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
201 def match_LiteralBoolean(o, scope)
202   @@evaluator.evaluate(o, scope)
203 end
match_LiteralNumber(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
217 def match_LiteralNumber(o, scope)
218   @@evaluator.evaluate(o, scope)
219 end
match_LiteralString(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
205 def match_LiteralString(o, scope)
206   @@evaluator.evaluate(o, scope)
207 end
match_LiteralUndef(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
209 def match_LiteralUndef(o, scope)
210   nil
211 end
match_Object(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
229 def match_Object(o, scope)
230   raise ArgumentError, _("Cannot transform object of class %{klass}") % { klass: o.class }
231 end
match_OrExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
185 def match_OrExpression(o, scope)
186   left_match = match(o.left_expr, scope)
187   right_match = match(o.right_expr, scope)
188   return [left_match, 'or', right_match]
189 end
match_ParenthesizedExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
225 def match_ParenthesizedExpression(o, scope)
226  match(o.expr, scope)
227 end
match_QualifiedName(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
221 def match_QualifiedName(o, scope)
222   @@evaluator.evaluate(o, scope)
223 end
match_VariableExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
197 def match_VariableExpression(o, scope)
198   @@evaluator.evaluate(o, scope)
199 end
match_unless_nop(query, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
68 def match_unless_nop(query, scope)
69   unless query.expr.nil? || query.expr.is_a?(Model::Nop)
70     match(query.expr, scope)
71   end
72 end
query(o, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
54 def query(o, scope)
55   @@query_visitor.visit_this_1(self, o, scope)
56 end
query_AccessExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
127 def query_AccessExpression(o, scope)
128   pops_object = @@evaluator.evaluate(o, scope)
129 
130   # Convert to Puppet 3 style objects since that is how they are represented
131   # in the catalog.
132   @@evaluator.convert(pops_object, scope, nil)
133 end
query_AndExpression(o, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
74 def query_AndExpression(o, scope)
75   left_code = query(o.left_expr, scope)
76   right_code = query(o.right_expr, scope)
77   proc do |resource|
78     left_code.call(resource) && right_code.call(resource)
79   end
80 end
query_ComparisonExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
 90 def query_ComparisonExpression(o, scope)
 91   left_code = query(o.left_expr, scope)
 92   right_code = query(o.right_expr, scope)
 93 
 94   case o.operator
 95   when '=='
 96     if left_code == "tag"
 97       # Ensure that to_s and downcase is done once, i.e. outside the proc block and
 98       # then use raw_tagged? instead of tagged?
 99       if right_code.is_a?(Array)
100         tags = right_code
101       else
102         tags = [ right_code ]
103       end
104       tags = tags.collect do |t|
105         raise ArgumentError, _('Cannot transform a number to a tag') if t.is_a?(Numeric)
106         t.to_s.downcase
107       end
108       proc do |resource|
109         resource.raw_tagged?(tags)
110       end
111     else
112       proc do |resource|
113         if (tmp = resource[left_code]).is_a?(Array)
114           @@compare_operator.include?(tmp, right_code, scope)
115         else
116           @@compare_operator.equals(tmp, right_code)
117         end
118       end
119     end
120   when '!='
121     proc do |resource|
122       !@@compare_operator.equals(resource[left_code], right_code)
123     end
124   end
125 end
query_ConcatenatedString(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
147 def query_ConcatenatedString(o, scope)
148   @@evaluator.evaluate(o, scope)
149 end
query_LiteralBoolean(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
139 def query_LiteralBoolean(o, scope)
140   @@evaluator.evaluate(o, scope)
141 end
query_LiteralNumber(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
151 def query_LiteralNumber(o, scope)
152   @@evaluator.evaluate(o, scope)
153 end
query_LiteralString(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
143 def query_LiteralString(o, scope)
144   @@evaluator.evaluate(o, scope)
145 end
query_LiteralUndef(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
155 def query_LiteralUndef(o, scope)
156   nil
157 end
query_Object(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
167 def query_Object(o, scope)
168   raise ArgumentError, _("Cannot transform object of class %{klass}") % { klass: o.class }
169 end
query_OrExpression(o, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
82 def query_OrExpression(o, scope)
83   left_code = query(o.left_expr, scope)
84   right_code = query(o.right_expr, scope)
85   proc do |resource|
86     left_code.call(resource) || right_code.call(resource)
87   end
88 end
query_ParenthesizedExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
163 def query_ParenthesizedExpression(o, scope)
164  query(o.expr, scope)
165 end
query_QualifiedName(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
159 def query_QualifiedName(o, scope)
160   @@evaluator.evaluate(o, scope)
161 end
query_VariableExpression(o, scope) click to toggle source
    # File lib/puppet/pops/evaluator/collector_transformer.rb
135 def query_VariableExpression(o, scope)
136   @@evaluator.evaluate(o, scope)
137 end
query_unless_nop(query, scope) click to toggle source
   # File lib/puppet/pops/evaluator/collector_transformer.rb
62 def query_unless_nop(query, scope)
63   unless query.expr.nil? || query.expr.is_a?(Model::Nop)
64     query(query.expr, scope)
65   end
66 end