Sha256: bf5b00ce58c20539f59e61f7f2e0280677eae3f7edc9be2fb7e2a4febf8b4679

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

module Mongoid
  module Report

    QueriesBuilder = Struct.new(:settings) do
      def do
        [].tap do |queries|
          queries.concat([{ '$project' => project_query }])
          queries.concat([{ '$group'   => group_query }])
          queries.concat([{ '$project' => project_group_fields_query }])
        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 project_query
        all_fields.inject({}) do |hash, field|
          hash.merge!(field => 1)
        end
      end

      GROUP_TEMPLATE = "$%s"
      def group_query
        {}.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 project_group_fields_query
        {}.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

4 entries across 4 versions & 1 rubygems

Version Path
mongoid-report-0.0.10 lib/mongoid/report/queries_builder.rb
mongoid-report-0.0.9 lib/mongoid/report/queries_builder.rb
mongoid-report-0.0.8 lib/mongoid/report/queries_builder.rb
mongoid-report-0.0.7 lib/mongoid/report/queries_builder.rb