/usr/lib/ruby/vendor_ruby/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb is in ruby-sequel 4.1.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | module Sequel
module EmulateOffsetWithReverseAndCount
# Make empty? work with an offset with an order.
# By default it would break since the order would be based on
# a column that empty does not select.
def empty?
if o = @opts[:offset]
unlimited.count <= o
else
super
end
end
# Emulate OFFSET support using reverse order in a subselect, requiring
# a count of the number of rows.
#
# If offset is used, an order must be provided, since it needs to be
# reversed in the subselect. Note that the order needs to be unambiguous
# to work correctly, and you must select all columns that you are ordering on.
def select_sql
return super unless o = @opts[:offset]
order = @opts[:order] || default_offset_order
if order.nil? || order.empty?
raise(Error, "#{db.database_type} requires an order be provided if using an offset")
end
ds = unlimited
row_count = @opts[:offset_total_count] || ds.clone(:append_sql=>'').count
dsa1 = dataset_alias(1)
if o.is_a?(Symbol) && @opts[:bind_vars] && (match = Sequel::Dataset::PreparedStatementMethods::PLACEHOLDER_RE.match(o.to_s))
# Handle use of bound variable offsets. Unfortunately, prepared statement
# bound variable offsets cannot be handled, since the bound variable value
# isn't available until later.
s = match[1].to_sym
if prepared_arg?(s)
o = prepared_arg(s)
end
end
reverse_offset = row_count - o
ds = if reverse_offset > 0
ds.limit(reverse_offset).
reverse_order(*order).
from_self(:alias=>dsa1).
limit(@opts[:limit]).
order(*order)
else
# Sequel doesn't allow a nonpositive limit. If the offset
# is greater than the number of rows, the empty result set
# shuld be returned, so use a condition that is always false.
ds.where(1=>0)
end
sql = @opts[:append_sql] || ''
subselect_sql_append(sql, ds)
sql
end
private
# The default order to use for datasets with offsets, if no order is defined.
# By default, orders by all of the columns in the dataset.
def default_offset_order
clone(:append_sql=>'', :offset=>nil).columns
end
end
end
|