class ParamsReady::Query::Relation

Public Instance Methods

after_page(keyset) click to toggle source
# File lib/params_ready/query/relation.rb, line 108
def after_page(keyset)
  tuple = { direction: :aft, limit: limit, keyset: keyset }
  update_in(tuple, [:pagination])
end
arel_table(default_model_class) click to toggle source
# File lib/params_ready/query/relation.rb, line 133
def arel_table(default_model_class)
  model_class(default_model_class).arel_table
end
before_page(keyset) click to toggle source
# File lib/params_ready/query/relation.rb, line 103
def before_page(keyset)
  tuple = { direction: :bfr, limit: limit, keyset: keyset }
  update_in(tuple, [:pagination])
end
build_keyset_query(limit, direction, keyset, model_class: nil, context: Restriction.blanket_permission) click to toggle source
# File lib/params_ready/query/relation.rb, line 195
def build_keyset_query(limit, direction, keyset, model_class: nil, context: Restriction.blanket_permission)
  arel_table, query = build_query(model_class, context)
  pagination.select_keysets(query, limit, direction, keyset, ordering, arel_table, context)
end
build_query(model_class, context) click to toggle source
# File lib/params_ready/query/relation.rb, line 200
def build_query(model_class, context)
  arel_table = arel_table(model_class)

  group = self.predicate_group(arel_table, context: context)
  joined = joined_tables(arel_table, context)

  query = if group.nil?
    joined
  else
    joined.where(group)
  end

  [arel_table, query]
end
build_relation(scope: nil, include: [], context: Restriction.blanket_permission, paginate: true) click to toggle source
# File lib/params_ready/query/relation.rb, line 157
def build_relation(scope: nil, include: [], context: Restriction.blanket_permission, paginate: true)
  model_class = scope || definition.model_class
  group = predicate_group(model_class.arel_table, context: context)
  relation = model_class.where(group)
  relation = relation.includes(*include) unless include.empty?
  relation = perform_joins(relation, context)

  order_and_paginate_relation(relation, context, paginate)
end
build_select(model_class: nil, context: Restriction.blanket_permission, select_list: Arel.star, paginate: true) click to toggle source
# File lib/params_ready/query/relation.rb, line 189
def build_select(model_class: nil, context: Restriction.blanket_permission, select_list: Arel.star, paginate: true)
  arel_table, query = build_query(model_class, context)
  query = order_and_paginate_query(query, arel_table, context, paginate)
  query.project(select_list)
end
child_is_definite?(name) click to toggle source
# File lib/params_ready/query/relation.rb, line 41
def child_is_definite?(name)
  return false unless definition.has_child?(name)
  return false if self[name].nil?
  return false unless self[name].is_definite?

  true
end
current_page(count: nil) click to toggle source
# File lib/params_ready/query/relation.rb, line 76
def current_page(count: nil)
  page(0, count: count)
end
first_page() click to toggle source
# File lib/params_ready/query/relation.rb, line 80
def first_page
  value = pagination.first_page_value
  update_in(value, [:pagination])
end
joined_tables(proper_table, context) click to toggle source
# File lib/params_ready/query/relation.rb, line 251
def joined_tables(proper_table, context)
  definition.joins.reduce(proper_table) do |table, join|
    join.to_arel(table, context, self)
  end
end
keysets(limit, direction, keyset, scope: nil, context: Restriction.blanket_permission, &block) click to toggle source
# File lib/params_ready/query/relation.rb, line 145
def keysets(limit, direction, keyset, scope: nil, context: Restriction.blanket_permission, &block)
  model_class = scope || definition.model_class
  group = predicate_group(model_class.arel_table, context: context)
  relation = model_class.where(group)
  relation = perform_joins(relation, context)

  sql_literal = pagination.keysets_for_relation(relation, limit, direction, keyset, ordering, context, &block)

  array = model_class.connection.execute(sql_literal.to_s).to_a
  Pagination::Direction.instance(direction).keysets(keyset, array, &block)
end
last_page(count:) click to toggle source
# File lib/params_ready/query/relation.rb, line 85
def last_page(count:)
  value = pagination.last_page_value(count: count)
  return if value.nil?
  update_in(value, [:pagination])
end
limited_at(limit) click to toggle source
# File lib/params_ready/query/relation.rb, line 113
def limited_at(limit)
  update_in(limit, [:pagination, pagination.limit_key])
end
model_class(default_model_class) click to toggle source
# File lib/params_ready/query/relation.rb, line 129
def model_class(default_model_class)
  default_model_class || definition.model_class
end
new_offset(delta) click to toggle source
# File lib/params_ready/query/relation.rb, line 63
def new_offset(delta)
  pagination.new_offset(delta)
end
next_page(delta = 1, count: nil) click to toggle source
# File lib/params_ready/query/relation.rb, line 97
def next_page(delta = 1, count: nil)
  value = pagination.next_page_value(delta, count: count)
  return if value.nil?
  page(delta, count: count)
end
order_and_paginate_query(query, arel_table, context, paginate) click to toggle source
# File lib/params_ready/query/relation.rb, line 240
def order_and_paginate_query(query, arel_table, context, paginate)
  paginate_if_applicable(paginate) do |pagination|
    query = pagination.paginate_query(query, ordering_or_nil, arel_table, context)
  end

  order_if_applicable(arel_table, context) do |ordering|
    query = query.order(*ordering)
  end
  query
end
order_and_paginate_relation(relation, context, paginate) click to toggle source
# File lib/params_ready/query/relation.rb, line 229
def order_and_paginate_relation(relation, context, paginate)
  paginate_if_applicable(paginate) do |pagination|
    relation = pagination.paginate_relation(relation, ordering_or_nil, context)
  end

  order_if_applicable(relation.arel_table, context) do |ordering|
    relation = relation.order(ordering)
  end
  relation
end
order_if_applicable(arel_table, context) { |ordering| ... } click to toggle source
# File lib/params_ready/query/relation.rb, line 215
def order_if_applicable(arel_table, context)
  if child_is_definite?(:ordering) && (context.permitted?(ordering) || ordering.required?)
    ordering = self.ordering.to_arel(arel_table, context: context)
    yield ordering if ordering.length > 0
  end
end
ordering() click to toggle source
# File lib/params_ready/query/relation.rb, line 53
def ordering
  self[:ordering]
end
ordering_or_nil() click to toggle source
# File lib/params_ready/query/relation.rb, line 57
def ordering_or_nil
  return unless child_is_definite?(:ordering)

  self[:ordering]
end
page(delta, count: nil) click to toggle source
# File lib/params_ready/query/relation.rb, line 67
def page(delta, count: nil)
  return nil unless pagination.can_yield_page?(delta, count: count)
  return self if delta == 0

  new_offset = pagination.new_offset(delta)

  update_in(new_offset, [:pagination, 0])
end
paginate_if_applicable(paginate) { |pagination| ... } click to toggle source
# File lib/params_ready/query/relation.rb, line 222
def paginate_if_applicable(paginate)
  if paginate && child_is_definite?(:pagination)
    pagination = self.pagination
    yield pagination
  end
end
pagination() click to toggle source
# File lib/params_ready/query/relation.rb, line 49
def pagination
  self[:pagination]
end
perform_count(scope: nil, context: Restriction.blanket_permission) click to toggle source
# File lib/params_ready/query/relation.rb, line 137
def perform_count(scope: nil, context: Restriction.blanket_permission)
  scope ||= definition.model_class if definition.model_class_defined?
  group = predicate_group(scope.arel_table, context: context)
  relation = scope.where(group)
  relation = perform_joins(relation, context)
  relation.count
end
perform_joins(relation, context) click to toggle source
# File lib/params_ready/query/relation.rb, line 167
def perform_joins(relation, context)
  return relation if definition.joins.empty?

  sql = joined_tables(relation.arel_table, context).join_sources.map(&:to_sql).join(' ')
  relation.joins(sql)
end
previous_page(delta = 1) click to toggle source
# File lib/params_ready/query/relation.rb, line 91
def previous_page(delta = 1)
  value = pagination.previous_page_value(delta)
  return if value.nil?
  update_in(value, [:pagination])
end
reordered(column, direction) click to toggle source
# File lib/params_ready/query/relation.rb, line 123
def reordered(column, direction)
  new_order = ordering.reordered_value(column, direction)
  reordered = update_in(new_order, [:ordering])
  reordered.update_in(0, [:pagination, 0])
end
to_count(model_class: nil, context: Restriction.blanket_permission) click to toggle source
# File lib/params_ready/query/relation.rb, line 174
def to_count(model_class: nil, context: Restriction.blanket_permission)
  model_class = model_class || definition.model_class

  arel_table = joined_tables(model_class.arel_table, context)

  group = self.predicate_group(model_class.arel_table, context: context)

  query = if group.nil?
    arel_table
  else
    arel_table.where(group)
  end
  query.project(arel_table[:id].count)
end
toggled_order(column) click to toggle source
# File lib/params_ready/query/relation.rb, line 117
def toggled_order(column)
  new_order = ordering.toggled_order_value(column)
  toggled = update_in(new_order, [:ordering])
  toggled.update_in(0, [:pagination, 0])
end