Sha256: bba81cc674c842a96313c3be222272b54c84b3045421a4a2d0f204b2a42a98bd

Contents?: true

Size: 1.65 KB

Versions: 2

Compression:

Stored size: 1.65 KB

Contents

module Mongoid
  module Report

    QueriesBuilder = Struct.new(:settings) do
      def do
        [].tap do |queries|
          queries.concat([{ '$project' => query1 }])
          queries.concat([{ '$group'   => query2 }])
          queries.concat([{ '$project' => query3 }])
        end
      end

      private

      def groups
        @group_by ||= begin
          if settings[:group_by].size == 0
            [:_id]
          else
            settings[:group_by]
          end
        end
      end

      def fields
        @fields ||= settings[:fields]
      end

      def all_fields
        [:_id]
          .concat(fields)
          .concat(groups)
      end

      # Example: { '$project' => { :field1 => 1 } }
      def query1
        all_fields.inject({}) do |hash, field|
          hash.merge!(field => 1)
        end
      end

      GROUP_TEMPLATE = "$%s"
      def query2
        {}.tap do |query|
          query[:_id] = {}

          groups.inject(query[:_id]) do |hash, group|
            hash.merge!(group => GROUP_TEMPLATE % group)
          end

          fields.inject(query) do |hash, field|
            hash.merge!(field => { '$sum' => GROUP_TEMPLATE % field })
          end
        end
      end

      PROJECT_TEMPLATE = "$_id.%s"
      def query3
        {}.tap do |query|
          if groups == [:_id]
            query[:_id] = '$_id'
          else
            query[:_id] = 0

            groups.inject(query) do |hash, group|
              hash.merge!(group => PROJECT_TEMPLATE % group)
            end
          end

          fields.inject(query) do |hash, field|
            hash.merge!(field => 1)
          end
        end
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mongoid-report-0.0.6 lib/mongoid/report/queries_builder.rb
mongoid-report-0.0.5 lib/mongoid/report/queries_builder.rb