Sha256: 499855b53608b94eaf70641d60c44bcea1c444a3b31dbddadd14bb22c363d755
Contents?: true
Size: 1.57 KB
Versions: 2
Compression:
Stored size: 1.57 KB
Contents
module Sequel module EmulateOffsetWithRowNumber # Emulate OFFSET support with the ROW_NUMBER window function # # The implementation is ugly, cloning the current dataset and modifying # the clone to add a ROW_NUMBER window function (and some other things), # then using the modified clone in a subselect which is selected from. # # If offset is used, an order must be provided, because the use of ROW_NUMBER # requires an order. def select_sql return super unless o = @opts[:offset] order = @opts[:order] if require_offset_order? order ||= default_offset_order if order.nil? || order.empty? raise(Error, "#{db.database_type} requires an order be provided if using an offset") end end columns = clone(:append_sql=>'').columns dsa1 = dataset_alias(1) rn = row_number_column sql = @opts[:append_sql] || '' subselect_sql_append(sql, unlimited. unordered. select_append{ROW_NUMBER(:over, :order=>order){}.as(rn)}. from_self(:alias=>dsa1). select(*columns). limit(@opts[:limit]). where(SQL::Identifier.new(rn) > o). order(rn)) 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=>'').columns end # Whether an order is required when using offset emulation via ROW_NUMBER, true by default. def require_offset_order? true end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
sequel-4.5.0 | lib/sequel/adapters/utils/emulate_offset_with_row_number.rb |
sequel-4.4.0 | lib/sequel/adapters/utils/emulate_offset_with_row_number.rb |