sequel-seek-pagination 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/sequel/extensions/seek_pagination.rb +26 -12
- data/lib/sequel/extensions/seek_pagination/version.rb +1 -1
- data/spec/seek_pagination_spec.rb +31 -28
- data/spec/spec_helper.rb +0 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f9206a9a384b1cdf9e934dc6e414c7e31a7572b
|
4
|
+
data.tar.gz: e717fb468e5a8224e5c7cd48e1b40b91bffb318f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e358d7edefd328fa41a0378f52f25c4c3e05b98b0da49a74742241a2f487ef8eb383dd615f67c678a4b8ed54c11e4d6e917baa3560a6787ac7d4cd835430c16d
|
7
|
+
data.tar.gz: 96b6e87a78cd4c93113d385f53ec37062f56fc031e1e563ca6f0b0fd67b4c95e1432a35f3dd4bc49b272470091179dc428c17b76b8b11da37e072e05e5275f22
|
@@ -11,8 +11,8 @@ module Sequel
|
|
11
11
|
|
12
12
|
if order.nil? || order.length.zero?
|
13
13
|
raise Error, "cannot seek_paginate on a dataset with no order"
|
14
|
-
elsif from
|
15
|
-
raise Error, "cannot pass
|
14
|
+
elsif [from, after, from_pk, after_pk].compact.count > 1
|
15
|
+
raise Error, "cannot pass more than one of the :from, :after, :from_pk and :after_pk arguments to seek_paginate"
|
16
16
|
elsif model.nil? && (from_pk || after_pk)
|
17
17
|
raise Error, "passed the :#{from_pk ? 'from' : 'after'}_pk option to seek_paginate on a dataset that doesn't have an associated model"
|
18
18
|
end
|
@@ -26,11 +26,14 @@ module Sequel
|
|
26
26
|
raise Error, "passed the wrong number of values in the :#{from ? 'from' : 'after'} option to seek_paginate"
|
27
27
|
end
|
28
28
|
elsif pk = from_pk || after_pk
|
29
|
-
# Need to load the order
|
30
|
-
|
29
|
+
# Need to load the values to order from for that pk from the DB, so we
|
30
|
+
# need to fetch the actual expressions being ordered by.
|
31
|
+
expressions = order.map { |o| Sequel::SQL::OrderedExpression === o ? o.expression : o }
|
31
32
|
|
32
|
-
# #get won't like it if we pass it
|
33
|
-
|
33
|
+
# Dataset#get won't like it if we pass it expressions that aren't
|
34
|
+
# simple columns, so give it aliases for everything.
|
35
|
+
al = :a
|
36
|
+
gettable = expressions.map.with_index{|s,i| Sequel.as(s, (al = al.next))}
|
34
37
|
|
35
38
|
values = where(model.qualified_primary_key_hash(pk)).get(gettable)
|
36
39
|
end
|
@@ -74,9 +77,13 @@ module Sequel
|
|
74
77
|
# Handle the common case where we can do a simpler (and faster)
|
75
78
|
# WHERE (non_nullable_1, non_nullable_2) > (1, 2) clause.
|
76
79
|
if length > 1 && orders.all?(&:not_null) && has_uniform_order_direction?
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
+
Sequel.virtual_row do |o|
|
81
|
+
o.__send__(
|
82
|
+
orders.first.inequality_method(include_exact_match),
|
83
|
+
orders.map(&:name),
|
84
|
+
orders.map(&:value)
|
85
|
+
)
|
86
|
+
end
|
80
87
|
else
|
81
88
|
Sequel.&(
|
82
89
|
*length.times.map { |i|
|
@@ -148,12 +155,11 @@ module Sequel
|
|
148
155
|
{name => nil}
|
149
156
|
end
|
150
157
|
|
151
|
-
def ineq(eq:
|
158
|
+
def ineq(eq:)
|
152
159
|
nulls_upcoming = !not_null && nulls == :last
|
153
160
|
|
154
161
|
if !value.nil?
|
155
|
-
|
156
|
-
filter = Sequel.virtual_row{|o| o.__send__(method, name, value)}
|
162
|
+
filter = Sequel.virtual_row{|o| o.__send__(inequality_method(eq), name, value)}
|
157
163
|
nulls_upcoming ? Sequel.|(filter, null_filter) : filter
|
158
164
|
else
|
159
165
|
if nulls_upcoming && eq
|
@@ -164,6 +170,14 @@ module Sequel
|
|
164
170
|
end
|
165
171
|
end
|
166
172
|
|
173
|
+
def inequality_method(eq)
|
174
|
+
case direction
|
175
|
+
when :asc then eq ? :>= : :>
|
176
|
+
when :desc then eq ? :<= : :<
|
177
|
+
else raise "Bad direction: #{direction.inspect}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
167
181
|
private
|
168
182
|
|
169
183
|
# By default, Postgres sorts NULLs as higher than any other value. So we
|
@@ -27,7 +27,7 @@ class SeekPaginationSpec < Minitest::Spec
|
|
27
27
|
dataset = dataset.order(*ordering)
|
28
28
|
|
29
29
|
# Can't pass any random expression to #get, so give them all aliases.
|
30
|
-
gettable = columns.zip(:a..:z).map{|c,a|
|
30
|
+
gettable = columns.zip(:a..:z).map{|c,a| Sequel.as(c, a)}
|
31
31
|
|
32
32
|
it "should limit the dataset appropriately when a starting point is not given" do
|
33
33
|
assert_equal_results dataset.limit(10),
|
@@ -83,23 +83,23 @@ class SeekPaginationSpec < Minitest::Spec
|
|
83
83
|
end
|
84
84
|
|
85
85
|
describe "for ordering by a single not-null column in either order" do
|
86
|
-
[:id
|
86
|
+
[Sequel.asc(:id), Sequel.desc(:id)].each do |o1|
|
87
87
|
it_should_seek_paginate_properly [o1]
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
describe "for ordering by two not-null columns in any order" do
|
92
|
-
[:not_nullable_1
|
93
|
-
[:id
|
92
|
+
[Sequel.asc(:not_nullable_1), Sequel.desc(:not_nullable_1)].each do |o1|
|
93
|
+
[Sequel.asc(:id), Sequel.desc(:id)].each do |o2|
|
94
94
|
it_should_seek_paginate_properly [o1, o2]
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
describe "for ordering by three not-null columns in any order" do
|
100
|
-
[:not_nullable_1
|
101
|
-
[:not_nullable_2
|
102
|
-
[:id
|
100
|
+
[Sequel.asc(:not_nullable_1), Sequel.desc(:not_nullable_1)].each do |o1|
|
101
|
+
[Sequel.asc(:not_nullable_2), Sequel.desc(:not_nullable_2)].each do |o2|
|
102
|
+
[Sequel.asc(:id), Sequel.desc(:id)].each do |o3|
|
103
103
|
it_should_seek_paginate_properly [o1, o2, o3]
|
104
104
|
end
|
105
105
|
end
|
@@ -108,8 +108,8 @@ class SeekPaginationSpec < Minitest::Spec
|
|
108
108
|
|
109
109
|
describe "for ordering by a nullable column" do
|
110
110
|
# We still tack on :id because the ordering needs to be unique.
|
111
|
-
[:nullable_1
|
112
|
-
[:id
|
111
|
+
[Sequel.asc(:nullable_1), Sequel.desc(:nullable_1), Sequel.asc(:nullable_1, nulls: :first), Sequel.desc(:nullable_1, nulls: :last)].each do |o1|
|
112
|
+
[Sequel.asc(:id), Sequel.desc(:id)].each do |o2|
|
113
113
|
it_should_seek_paginate_properly [o1, o2]
|
114
114
|
end
|
115
115
|
end
|
@@ -117,9 +117,9 @@ class SeekPaginationSpec < Minitest::Spec
|
|
117
117
|
|
118
118
|
describe "for ordering by multiple nullable columns" do
|
119
119
|
# We still tack on :id because the ordering needs to be unique.
|
120
|
-
[:nullable_1
|
121
|
-
[:nullable_2
|
122
|
-
[:id
|
120
|
+
[Sequel.asc(:nullable_1), Sequel.desc(:nullable_1), Sequel.asc(:nullable_1, nulls: :first), Sequel.desc(:nullable_1, nulls: :last)].each do |o1|
|
121
|
+
[Sequel.asc(:nullable_2), Sequel.desc(:nullable_2), Sequel.asc(:nullable_2, nulls: :first), Sequel.desc(:nullable_2, nulls: :last)].each do |o2|
|
122
|
+
[Sequel.asc(:id), Sequel.desc(:id)].each do |o3|
|
123
123
|
it_should_seek_paginate_properly [o1, o2, o3]
|
124
124
|
end
|
125
125
|
end
|
@@ -129,14 +129,14 @@ class SeekPaginationSpec < Minitest::Spec
|
|
129
129
|
describe "for ordering by a mix of nullable and not-nullable columns" do
|
130
130
|
20.times do
|
131
131
|
columns = [
|
132
|
-
[:not_nullable_1, :not_nullable_1
|
133
|
-
[:not_nullable_2, :not_nullable_2
|
134
|
-
[:nullable_1, :nullable_1
|
135
|
-
[:nullable_2, :nullable_2
|
132
|
+
[:not_nullable_1, Sequel.asc(:not_nullable_1), Sequel.desc(:not_nullable_1)],
|
133
|
+
[:not_nullable_2, Sequel.asc(:not_nullable_2), Sequel.desc(:not_nullable_2)],
|
134
|
+
[:nullable_1, Sequel.asc(:nullable_1), Sequel.desc(:nullable_1), Sequel.asc(:nullable_1, nulls: :first), Sequel.desc(:nullable_1, nulls: :last)],
|
135
|
+
[:nullable_2, Sequel.asc(:nullable_2), Sequel.desc(:nullable_2), Sequel.asc(:nullable_2, nulls: :first), Sequel.desc(:nullable_2, nulls: :last)],
|
136
136
|
]
|
137
137
|
|
138
138
|
testing_columns = columns.sample(rand(columns.count) + 1).map(&:sample)
|
139
|
-
testing_columns << [:id, :id
|
139
|
+
testing_columns << [:id, Sequel.asc(:id), Sequel.desc(:id)].sample
|
140
140
|
|
141
141
|
it_should_seek_paginate_properly(testing_columns)
|
142
142
|
end
|
@@ -145,14 +145,14 @@ class SeekPaginationSpec < Minitest::Spec
|
|
145
145
|
describe "for ordering by a mix of expressions and columns" do
|
146
146
|
20.times do
|
147
147
|
columns = [
|
148
|
-
[:not_nullable_1, :not_nullable_1
|
149
|
-
[:not_nullable_2, :not_nullable_2
|
150
|
-
[:nullable_1, :nullable_1
|
151
|
-
[:nullable_2, :nullable_2
|
148
|
+
[:not_nullable_1, Sequel.asc(:not_nullable_1), Sequel.desc(:not_nullable_1), Sequel.expr(:not_nullable_1).sql_number % 10, Sequel.asc(Sequel.expr(:not_nullable_1).sql_number % 10), Sequel.desc(Sequel.expr(:not_nullable_1).sql_number % 10)],
|
149
|
+
[:not_nullable_2, Sequel.asc(:not_nullable_2), Sequel.desc(:not_nullable_2), Sequel.expr(:not_nullable_2).sql_number % 10, Sequel.asc(Sequel.expr(:not_nullable_2).sql_number % 10), Sequel.desc(Sequel.expr(:not_nullable_2).sql_number % 10)],
|
150
|
+
[:nullable_1, Sequel.asc(:nullable_1), Sequel.desc(:nullable_1), Sequel.asc(:nullable_1, nulls: :first), Sequel.desc(:nullable_1, nulls: :last), Sequel.expr(:nullable_1).sql_number % 10, Sequel.asc(Sequel.expr(:nullable_1).sql_number % 10), (Sequel.expr(:nullable_1).sql_number % 10).desc, Sequel.asc(Sequel.expr(:nullable_1).sql_number % 10, nulls: :first), Sequel.desc(Sequel.expr(:nullable_1).sql_number % 10, nulls: :last)],
|
151
|
+
[:nullable_2, Sequel.asc(:nullable_2), Sequel.desc(:nullable_2), Sequel.asc(:nullable_2, nulls: :first), Sequel.desc(:nullable_2, nulls: :last), Sequel.expr(:nullable_2).sql_number % 10, Sequel.asc(Sequel.expr(:nullable_2).sql_number % 10), (Sequel.expr(:nullable_2).sql_number % 10).desc, Sequel.asc(Sequel.expr(:nullable_2).sql_number % 10, nulls: :first), Sequel.desc(Sequel.expr(:nullable_2).sql_number % 10, nulls: :last)],
|
152
152
|
]
|
153
153
|
|
154
154
|
testing_columns = columns.sample(rand(columns.count) + 1).map(&:sample)
|
155
|
-
testing_columns << [:id, :id
|
155
|
+
testing_columns << [:id, Sequel.asc(:id), Sequel.desc(:id)].sample
|
156
156
|
|
157
157
|
it_should_seek_paginate_properly(testing_columns)
|
158
158
|
end
|
@@ -162,10 +162,10 @@ class SeekPaginationSpec < Minitest::Spec
|
|
162
162
|
datasets = [
|
163
163
|
DB[:seek].order(:id),
|
164
164
|
DB[:seek].order(:seek__id),
|
165
|
-
DB[:seek].order(:id
|
166
|
-
DB[:seek].order(:seek__id
|
167
|
-
DB[:seek].order(:id
|
168
|
-
DB[:seek].order(:seek__id
|
165
|
+
DB[:seek].order(Sequel.asc(:id)),
|
166
|
+
DB[:seek].order(Sequel.asc(:seek__id)),
|
167
|
+
DB[:seek].order(Sequel.desc(:id)).reverse_order,
|
168
|
+
DB[:seek].order(Sequel.desc(:seek__id)).reverse_order,
|
169
169
|
]
|
170
170
|
|
171
171
|
# With point to start from/after:
|
@@ -187,8 +187,11 @@ class SeekPaginationSpec < Minitest::Spec
|
|
187
187
|
assert_error_message("cannot seek_paginate on a dataset with no order") { DB[:seek].seek_paginate(30) }
|
188
188
|
end
|
189
189
|
|
190
|
-
it "should raise an error if
|
191
|
-
assert_error_message("cannot pass
|
190
|
+
it "should raise an error if more than one location argument is passed to seek_paginate" do
|
191
|
+
assert_error_message("cannot pass more than one of the :from, :after, :from_pk and :after_pk arguments to seek_paginate") { DB[:seek].order(:id).seek_paginate(30, from: 3, after: 4) }
|
192
|
+
assert_error_message("cannot pass more than one of the :from, :after, :from_pk and :after_pk arguments to seek_paginate") { DB[:seek].order(:id).seek_paginate(30, from_pk: 3, after_pk: 4) }
|
193
|
+
assert_error_message("cannot pass more than one of the :from, :after, :from_pk and :after_pk arguments to seek_paginate") { DB[:seek].order(:id).seek_paginate(30, from: 3, after_pk: 4) }
|
194
|
+
assert_error_message("cannot pass more than one of the :from, :after, :from_pk and :after_pk arguments to seek_paginate") { DB[:seek].order(:id).seek_paginate(30, from_pk: 3, after: 4) }
|
192
195
|
end
|
193
196
|
|
194
197
|
it "should raise an error if given the wrong number of values to from or after" do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel-seek-pagination
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Hanks
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|