Sha256: 7170cc2878bedfb284e5747df9248adbfd599e5505a5ad1656b61c678a686fac

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

module Aggrobot
  module QueryPlanner
    class DefaultQueryPlanner
      include ParametersValidator

      def initialize(collection, group = DEFAULT_GROUP_BY)
        @collection, @group = validate_and_extract_relation(collection), group
      end

      def sub_query(group_value)
        if @group == DEFAULT_GROUP_BY
          @collection
        else
          @collection.where(group_condition(group_value))
        end
      end

      def query_results(extra_cols = [])
        return [] if collection_is_none?
        if @group.is_a? Array
          columns = @group + [SQLFunctions.count] + extra_cols
          results_query.pluck(*columns).collect do |result_row|
            [result_row[0..(@group.count - 1)]] + result_row[@group.count..-1]
          end
        else
          columns = [@group, SQLFunctions.count] + extra_cols
          results_query.pluck(*columns)
        end
      end

      protected

      def group_condition(group_value)
        if @group.is_a?(Array)
          Hash[@group.zip(group_value)]
        else
          {@group => group_value}
        end
      end

      def results_query
        @result_query ||= @collection.group(@group)
      end

      def collection_is_none?
        @collection.extending_values.include?(ActiveRecord::NullRelation)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
aggrobot-0.1.0 lib/aggrobot/query_planner/default_query_planner.rb