Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Aggregate.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html 
3      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8   <title>Class: MCollective::Aggregate</title>
9   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10   <meta http-equiv="Content-Script-Type" content="text/javascript" />
11   <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12   <script type="text/javascript">
13   // <![CDATA[
14
15   function popupCode( url ) {
16     window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17   }
18
19   function toggleCode( id ) {
20     if ( document.getElementById )
21       elem = document.getElementById( id );
22     else if ( document.all )
23       elem = eval( "document.all." + id );
24     else
25       return false;
26
27     elemStyle = elem.style;
28     
29     if ( elemStyle.display != "block" ) {
30       elemStyle.display = "block"
31     } else {
32       elemStyle.display = "none"
33     }
34
35     return true;
36   }
37   
38   // Make codeblocks hidden by default
39   document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40   
41   // ]]>
42   </script>
43
44 </head>
45 <body>
46
47
48
49     <div id="classHeader">
50         <table class="header-table">
51         <tr class="top-aligned-row">
52           <td><strong>Class</strong></td>
53           <td class="class-name-in-header">MCollective::Aggregate</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../files/lib/mcollective/aggregate_rb.html">
59                 lib/mcollective/aggregate.rb
60                 </a>
61         <br />
62                 <a href="../../files/lib/mcollective/aggregate/base_rb.html">
63                 lib/mcollective/aggregate/base.rb
64                 </a>
65         <br />
66                 <a href="../../files/lib/mcollective/aggregate/result/base_rb.html">
67                 lib/mcollective/aggregate/result/base.rb
68                 </a>
69         <br />
70                 <a href="../../files/lib/mcollective/aggregate/result/collection_result_rb.html">
71                 lib/mcollective/aggregate/result/collection_result.rb
72                 </a>
73         <br />
74                 <a href="../../files/lib/mcollective/aggregate/result/numeric_result_rb.html">
75                 lib/mcollective/aggregate/result/numeric_result.rb
76                 </a>
77         <br />
78                 <a href="../../files/lib/mcollective/aggregate/result_rb.html">
79                 lib/mcollective/aggregate/result.rb
80                 </a>
81         <br />
82             </td>
83         </tr>
84
85         <tr class="top-aligned-row">
86             <td><strong>Parent:</strong></td>
87             <td>
88                 Object
89             </td>
90         </tr>
91         </table>
92     </div>
93   <!-- banner header -->
94
95   <div id="bodyContent">
96
97
98
99   <div id="contextContent">
100
101
102
103    </div>
104
105     <div id="method-list">
106       <h3 class="section-bar">Methods</h3>
107
108       <div class="name-list">
109       <a href="#M000412">call_functions</a>&nbsp;&nbsp;
110       <a href="#M000411">contains_output?</a>&nbsp;&nbsp;
111       <a href="#M000410">create_functions</a>&nbsp;&nbsp;
112       <a href="#M000414">load_function</a>&nbsp;&nbsp;
113       <a href="#M000409">new</a>&nbsp;&nbsp;
114       <a href="#M000413">summarize</a>&nbsp;&nbsp;
115       </div>
116     </div>
117
118   </div>
119
120
121     <!-- if includes -->
122
123     <div id="section">
124
125     <div id="class-list">
126       <h3 class="section-bar">Classes and Modules</h3>
127
128       Module <a href="Aggregate/Result.html" class="link">MCollective::Aggregate::Result</a><br />
129 Class <a href="Aggregate/Base.html" class="link">MCollective::Aggregate::Base</a><br />
130
131     </div>
132
133
134
135
136     <div id="attribute-list">
137       <h3 class="section-bar">Attributes</h3>
138
139       <div class="name-list">
140         <table>
141         <tr class="top-aligned-row context-row">
142           <td class="context-item-name">action</td>
143           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
144           <td class="context-item-desc"></td>
145         </tr>
146         <tr class="top-aligned-row context-row">
147           <td class="context-item-name">ddl</td>
148           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
149           <td class="context-item-desc"></td>
150         </tr>
151         <tr class="top-aligned-row context-row">
152           <td class="context-item-name">failed</td>
153           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
154           <td class="context-item-desc"></td>
155         </tr>
156         <tr class="top-aligned-row context-row">
157           <td class="context-item-name">functions</td>
158           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
159           <td class="context-item-desc"></td>
160         </tr>
161         </table>
162       </div>
163     </div>
164       
165
166
167     <!-- if method_list -->
168     <div id="methods">
169       <h3 class="section-bar">Public Class methods</h3>
170
171       <div id="method-M000409" class="method-detail">
172         <a name="M000409"></a>
173
174         <div class="method-heading">
175           <a href="#M000409" class="method-signature">
176           <span class="method-name">new</span><span class="method-args">(ddl)</span>
177           </a>
178         </div>
179       
180         <div class="method-description">
181           <p><a class="source-toggle" href="#"
182             onclick="toggleCode('M000409-source');return false;">[Source]</a></p>
183           <div class="method-source-code" id="M000409-source">
184 <pre>
185     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 8</span>
186  8:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">ddl</span>)
187  9:       <span class="ruby-ivar">@functions</span> = []
188 10:       <span class="ruby-ivar">@ddl</span> = <span class="ruby-identifier">ddl</span>
189 11:       <span class="ruby-ivar">@action</span> = <span class="ruby-identifier">ddl</span>[<span class="ruby-identifier">:action</span>]
190 12:       <span class="ruby-ivar">@failed</span> = []
191 13: 
192 14:       <span class="ruby-identifier">create_functions</span>
193 15:     <span class="ruby-keyword kw">end</span>
194 </pre>
195           </div>
196         </div>
197       </div>
198
199       <h3 class="section-bar">Public Instance methods</h3>
200
201       <div id="method-M000412" class="method-detail">
202         <a name="M000412"></a>
203
204         <div class="method-heading">
205           <a href="#M000412" class="method-signature">
206           <span class="method-name">call_functions</span><span class="method-args">(reply)</span>
207           </a>
208         </div>
209       
210         <div class="method-description">
211           <p>
212 Call all the appropriate functions with the reply data received from <a
213 href="RPC/Client.html">RPC::Client</a>
214 </p>
215           <p><a class="source-toggle" href="#"
216             onclick="toggleCode('M000412-source');return false;">[Source]</a></p>
217           <div class="method-source-code" id="M000412-source">
218 <pre>
219     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 45</span>
220 45:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">call_functions</span>(<span class="ruby-identifier">reply</span>)
221 46:       <span class="ruby-ivar">@functions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">function</span><span class="ruby-operator">|</span>
222 47:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Calling aggregate function #{function} for result&quot;</span>)
223 48:         <span class="ruby-keyword kw">begin</span>
224 49:           <span class="ruby-identifier">function</span>.<span class="ruby-identifier">process_result</span>(<span class="ruby-identifier">reply</span>[<span class="ruby-identifier">:data</span>][<span class="ruby-identifier">function</span>.<span class="ruby-identifier">output_name</span>], <span class="ruby-identifier">reply</span>)
225 50:         <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
226 51:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Could not process aggregate function for '#{function.output_name}'. #{e.to_s}&quot;</span>)
227 52:           <span class="ruby-ivar">@failed</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">function</span>.<span class="ruby-identifier">output_name</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:process_result</span>}
228 53:           <span class="ruby-ivar">@functions</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">function</span>)
229 54:         <span class="ruby-keyword kw">end</span>
230 55:       <span class="ruby-keyword kw">end</span>
231 56:     <span class="ruby-keyword kw">end</span>
232 </pre>
233           </div>
234         </div>
235       </div>
236
237       <div id="method-M000411" class="method-detail">
238         <a name="M000411"></a>
239
240         <div class="method-heading">
241           <a href="#M000411" class="method-signature">
242           <span class="method-name">contains_output?</span><span class="method-args">(output)</span>
243           </a>
244         </div>
245       
246         <div class="method-description">
247           <p>
248 Check if the function param is defined as an output for the action in the
249 ddl
250 </p>
251           <p><a class="source-toggle" href="#"
252             onclick="toggleCode('M000411-source');return false;">[Source]</a></p>
253           <div class="method-source-code" id="M000411-source">
254 <pre>
255     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 40</span>
256 40:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">contains_output?</span>(<span class="ruby-identifier">output</span>)
257 41:       <span class="ruby-ivar">@ddl</span>[<span class="ruby-identifier">:output</span>].<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">output</span>)
258 42:     <span class="ruby-keyword kw">end</span>
259 </pre>
260           </div>
261         </div>
262       </div>
263
264       <div id="method-M000410" class="method-detail">
265         <a name="M000410"></a>
266
267         <div class="method-heading">
268           <a href="#M000410" class="method-signature">
269           <span class="method-name">create_functions</span><span class="method-args">()</span>
270           </a>
271         </div>
272       
273         <div class="method-description">
274           <p>
275 Creates instances of the <a href="Aggregate.html">Aggregate</a> functions
276 and stores them in the function array. All aggregate call and <a
277 href="Aggregate.html#M000413">summarize</a> method calls operate on these
278 function as a batch.
279 </p>
280           <p><a class="source-toggle" href="#"
281             onclick="toggleCode('M000410-source');return false;">[Source]</a></p>
282           <div class="method-source-code" id="M000410-source">
283 <pre>
284     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 19</span>
285 19:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">create_functions</span>
286 20:       <span class="ruby-ivar">@ddl</span>[<span class="ruby-identifier">:aggregate</span>].<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">agg</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
287 21:         <span class="ruby-identifier">output</span> = <span class="ruby-identifier">agg</span>[<span class="ruby-identifier">:args</span>][<span class="ruby-value">0</span>]
288 22: 
289 23:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">contains_output?</span>(<span class="ruby-identifier">output</span>)
290 24:           <span class="ruby-identifier">arguments</span> = <span class="ruby-identifier">agg</span>[<span class="ruby-identifier">:args</span>][<span class="ruby-value">1</span>]
291 25:           <span class="ruby-identifier">format</span> = (<span class="ruby-identifier">arguments</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">:format</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">arguments</span>) <span class="ruby-operator">||</span> <span class="ruby-keyword kw">nil</span>
292 26:           <span class="ruby-keyword kw">begin</span>
293 27:             <span class="ruby-ivar">@functions</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">load_function</span>(<span class="ruby-identifier">agg</span>[<span class="ruby-identifier">:function</span>]).<span class="ruby-identifier">new</span>(<span class="ruby-identifier">output</span>, <span class="ruby-identifier">arguments</span>, <span class="ruby-identifier">format</span>, <span class="ruby-ivar">@action</span>)
294 28:           <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
295 29:             <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Cannot create aggregate function '#{output}'. #{e.to_s}&quot;</span>)
296 30:             <span class="ruby-ivar">@failed</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">output</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:startup</span>}
297 31:           <span class="ruby-keyword kw">end</span>
298 32:         <span class="ruby-keyword kw">else</span>
299 33:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Cannot create aggregate function '#{output}'. '#{output}' has not been specified as a valid ddl output.&quot;</span>)
300 34:           <span class="ruby-ivar">@failed</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">output</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:create</span>}
301 35:         <span class="ruby-keyword kw">end</span>
302 36:       <span class="ruby-keyword kw">end</span>
303 37:     <span class="ruby-keyword kw">end</span>
304 </pre>
305           </div>
306         </div>
307       </div>
308
309       <div id="method-M000414" class="method-detail">
310         <a name="M000414"></a>
311
312         <div class="method-heading">
313           <a href="#M000414" class="method-signature">
314           <span class="method-name">load_function</span><span class="method-args">(function_name)</span>
315           </a>
316         </div>
317       
318         <div class="method-description">
319           <p>
320 Loads function from disk for use
321 </p>
322           <p><a class="source-toggle" href="#"
323             onclick="toggleCode('M000414-source');return false;">[Source]</a></p>
324           <div class="method-source-code" id="M000414-source">
325 <pre>
326     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 76</span>
327 76:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">load_function</span>(<span class="ruby-identifier">function_name</span>)
328 77:       <span class="ruby-identifier">function_name</span> = <span class="ruby-identifier">function_name</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">capitalize</span>
329 78: 
330 79:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-node">&quot;MCollective::Aggregate::#{function_name}&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">Aggregate</span>.<span class="ruby-identifier">const_defined?</span>(<span class="ruby-identifier">function_name</span>)
331 80:       <span class="ruby-constant">Aggregate</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">function_name</span>)
332 81:     <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span>
333 82:       <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Aggregate function file '#{function_name.downcase}.rb' cannot be loaded&quot;</span>
334 83:     <span class="ruby-keyword kw">end</span>
335 </pre>
336           </div>
337         </div>
338       </div>
339
340       <div id="method-M000413" class="method-detail">
341         <a name="M000413"></a>
342
343         <div class="method-heading">
344           <a href="#M000413" class="method-signature">
345           <span class="method-name">summarize</span><span class="method-args">()</span>
346           </a>
347         </div>
348       
349         <div class="method-description">
350           <p>
351 Finalizes the function returning a result object
352 </p>
353           <p><a class="source-toggle" href="#"
354             onclick="toggleCode('M000413-source');return false;">[Source]</a></p>
355           <div class="method-source-code" id="M000413-source">
356 <pre>
357     <span class="ruby-comment cmt"># File lib/mcollective/aggregate.rb, line 59</span>
358 59:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">summarize</span>
359 60:       <span class="ruby-identifier">summary</span> = <span class="ruby-ivar">@functions</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">function</span><span class="ruby-operator">|</span>
360 61:         <span class="ruby-keyword kw">begin</span>
361 62:           <span class="ruby-identifier">function</span>.<span class="ruby-identifier">summarize</span>
362 63:         <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
363 64:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Could not summarize aggregate result for '#{function.output_name}'. #{e.to_s}&quot;</span>)
364 65:           <span class="ruby-ivar">@failed</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">function</span>.<span class="ruby-identifier">output_name</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:summarize</span>}
365 66:           <span class="ruby-keyword kw">nil</span>
366 67:         <span class="ruby-keyword kw">end</span>
367 68:       <span class="ruby-keyword kw">end</span>
368 69: 
369 70:       <span class="ruby-identifier">summary</span>.<span class="ruby-identifier">reject</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">nil?</span>}.<span class="ruby-identifier">sort</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">x</span>,<span class="ruby-identifier">y</span><span class="ruby-operator">|</span>
370 71:         <span class="ruby-identifier">x</span>.<span class="ruby-identifier">result</span>[<span class="ruby-identifier">:output</span>] <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">result</span>[<span class="ruby-identifier">:output</span>]
371 72:       <span class="ruby-keyword kw">end</span>
372 73:     <span class="ruby-keyword kw">end</span>
373 </pre>
374           </div>
375         </div>
376       </div>
377
378
379     </div>
380
381
382   </div>
383
384
385 <div id="validator-badges">
386   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
387 </div>
388
389 </body>
390 </html>