Class: Aggrobot::QueryPlanner::GroupLimitQueryPlanner

Inherits:
DefaultQueryPlanner show all
Defined in:
lib/aggrobot/query_planner/group_limit_query_planner.rb

Instance Method Summary collapse

Methods included from ParametersValidator

#validate_and_extract_relation, #validate_options

Constructor Details

#initialize(collection, group, opts) ⇒ GroupLimitQueryPlanner

Returns a new instance of GroupLimitQueryPlanner.



5
6
7
8
9
10
11
12
13
# File 'lib/aggrobot/query_planner/group_limit_query_planner.rb', line 5

def initialize(collection, group, opts)
  required_params = [:limit_to, :sort_by]
  optional_params = [:always_include, :other_group, :order]
  validate_options(opts, required_params, optional_params)
  raise_error 'limit_to has to be a number' unless opts[:limit_to].is_a?(Fixnum)
  super(collection, group)
  @query_map = {}
  process_top_groups_options(opts)
end

Instance Method Details

#query_results(extra_cols = []) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/aggrobot/query_planner/group_limit_query_planner.rb', line 19

def query_results(extra_cols = [])
  return [] if collection_is_none?
  top_group_results = if @group.is_a? Array
    columns = @group + [SQLFunctions.count] + extra_cols
    results_query.where(@top_groups_conditions).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.where(@top_groups_conditions).pluck(*columns)
  end
  top_group_results + other_group_results(columns)
end

#sub_query(group_value) ⇒ Object



15
16
17
# File 'lib/aggrobot/query_planner/group_limit_query_planner.rb', line 15

def sub_query(group_value)
  group_value == @other_group ? @collection.where.not(@top_groups_conditions) : @collection.where(group_condition(group_value))
end