class Brainstem::QueryStrategies::BaseStrategy

Public Class Methods

new(options) click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 7
def initialize(options)
  @options = options
  @last_count = nil
end

Public Instance Methods

calculate_per_page() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 35
def calculate_per_page
  per_page = [(@options[:params][:per_page] || @options[:per_page] || @options[:default_per_page]).to_i, (@options[:max_per_page] || @options[:default_max_per_page]).to_i].min
  per_page = @options[:default_per_page] if per_page < 1
  per_page
end
evaluate_count(count_scope) click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 29
def evaluate_count(count_scope)
  ret = @last_count || count_scope.count
  @last_count = nil
  ret
end
evaluate_scope(scope) click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 16
def evaluate_scope(scope)
  @last_count = nil

  # Load models!
  # On complex queries, MySQL can sometimes handle 'SELECT id FROM ... ORDER BY ...' much faster than
  # 'SELECT * FROM ...', so we pluck the ids, then find those specific ids in a separate query.
  if ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql|sqlite/i
    get_ids_sql(scope)
  else
    scope.to_a
  end
end
execute(scope) click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 12
def execute(scope)
  raise NotImplemented, 'Your strategy class must implement an `execute` method'
end

Private Instance Methods

calculate_limit() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 56
def calculate_limit
  [[@options[:params][:limit].to_i, 1].max, (@options[:max_per_page] || @options[:default_max_per_page]).to_i].min
end
calculate_limit_and_offset() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 95
def calculate_limit_and_offset
  if @options[:params][:limit].present? && @options[:params][:offset].present?
    limit = calculate_limit
    offset = calculate_offset
  else
    limit = calculate_per_page
    offset = limit * (calculate_page - 1)
  end

  [limit, offset]
end
calculate_offset() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 60
def calculate_offset
  [@options[:params][:offset].to_i, 0].max
end
calculate_page() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 64
def calculate_page
  [(@options[:params][:page] || 1).to_i, 1].max
end
filter_includes() click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 68
def filter_includes
  allowed_associations = @options[:primary_presenter].allowed_associations(@options[:params][:only].present?)

  [].tap do |selected_associations|
    (@options[:params][:include] || '').split(',').each do |k|
      if association = allowed_associations[k]
        selected_associations << association
      end
    end
  end
end
get_ids_sql(scope) click to toggle source
# File lib/brainstem/query_strategies/base_strategy.rb, line 43
def get_ids_sql(scope)
  if Brainstem.mysql_use_calc_found_rows && ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql/i
    ids = scope.pluck(Arel.sql("SQL_CALC_FOUND_ROWS #{scope.table_name}.id"))
    @last_count = ActiveRecord::Base.connection.execute("SELECT FOUND_ROWS()").first.first
  else
    ids = scope.pluck("#{scope.table_name}.id")
  end

  id_lookup = {}
  ids.each.with_index { |id, index| id_lookup[id] = index }
  scope.klass.where(id: id_lookup.keys).sort_by { |model| id_lookup[model.id] }
end