Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / lib / mcollective / aggregate / base.rb
diff --git a/lib/mcollective/aggregate/base.rb b/lib/mcollective/aggregate/base.rb
new file mode 100644 (file)
index 0000000..5a59a91
--- /dev/null
@@ -0,0 +1,40 @@
+module MCollective
+  class Aggregate
+    class Base
+      attr_accessor :name, :result, :output_name, :action, :aggregate_format, :arguments
+
+      def initialize(output_name, arguments, aggregate_format, action)
+        @name = self.class.to_s
+        @output_name = output_name
+
+        # Any additional arguments passed in the ddl after the output field will
+        # be stored in the arguments array which can be used in the function
+        @arguments = arguments
+        @aggregate_format = aggregate_format
+        @action = action
+        @result = {:value => nil, :type => nil, :output => output_name}
+
+        startup_hook
+      end
+
+      ['startup_hook', 'process_result'].each do |method|
+        define_method method do
+          raise RuntimeError, "'#{method}' method of function class #{@name} has not yet been implemented"
+        end
+      end
+
+      # Stops execution of the function and returns a specific ResultObject,
+      # aggregate functions will most likely override this but this is the simplest
+      # case so we might as well default to that
+      def summarize
+        raise "Result type is not set while trying to summarize aggregate function results" unless @result[:type]
+
+        result_class(@result[:type]).new(@result, @aggregate_format, @action)
+      end
+
+      def result_class(type)
+        Result.const_get("#{type.to_s.capitalize}Result")
+      end
+    end
+  end
+end