class Puppet::Pops::Evaluator::CollectorTransformer

Public Class Methods

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

Public Instance Methods

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

Protected Instance Methods

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