oivoodoo/mongoid-report

View on GitHub
lib/mongoid/report/scope_collection.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'thread'

module Mongoid
  module Report

    ScopeCollection = Struct.new(:context) do
      def initialize(context)
        @mutex = Mutex.new
        super
      end

      def scopes
        @scopes ||= [].tap do |collection|
          context.settings.each do |report_module, module_settings|
            module_settings[:reports].each do |report_name, _report_settings|
              collection << Scope.new(context, report_module, report_name)
            end
          end
        end
      end

      def query(conditions = {})
        scopes.each do |scope|
          scope.query(conditions)
        end
        self
      end

      def yield
        scopes.each do |scope|
          scope.yield
        end
        self
      end

      def in_batches(conditions)
        scopes.each do |scope|
          scope.in_batches(conditions)
        end
        self
      end

      def all
        Hash.new { |h, k| h[k] = {} }.tap do |hash|
          if Mongoid::Report::Config.use_threads_on_aggregate
            scopes.map do |scope|
              Thread.new do
                rows = scope.all

                @mutex.synchronize do
                  hash[scope.report_module][scope.report_name] = rows
                end
              end
            end.map(&:join)
          else
            scopes.each do |scope|
              hash[scope.report_module][scope.report_name] = scope.all
            end
          end
        end
      end

    end

  end
end