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