sequel-keyset_pagination 0.0.1
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 +7 -0
- data/lib/sequel/extensions/keyset_pagination.rb +73 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2e196af0224272c18188558ec8985ad9fd6b0cd2
|
4
|
+
data.tar.gz: df8465b47dcae2d5c1142af8a8bba914117aa95d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6cbfcba7713d84c43b2cdbaaa090c0b832600d3a47e9b0d37caccd6d5a3697438f08b563478ac7fa68e9086ca35bdb5fd81e7b78a599e53685d81129991b1c7c
|
7
|
+
data.tar.gz: 8237d47d36a49070d34454a61738f4eaa17f621594bd068e4ccc109309496f38968a70723235117fb2484d0be7b845d86dfa957fb7d44a021db717edbb0e05c4
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "sequel"
|
4
|
+
|
5
|
+
module Sequel
|
6
|
+
module KeysetPagination
|
7
|
+
module Utils
|
8
|
+
def self.qualify_order(expression)
|
9
|
+
case expression
|
10
|
+
when Sequel::SQL::OrderedExpression
|
11
|
+
expression
|
12
|
+
else
|
13
|
+
Sequel::SQL::OrderedExpression.new(expression, false)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.cursor_conditions(columns, cursor2, reverse: false)
|
18
|
+
zipped = columns.zip(cursor2)
|
19
|
+
desc = reverse ? :> : :<
|
20
|
+
asc = reverse ? :< : :>
|
21
|
+
|
22
|
+
# Reduce the dimensions
|
23
|
+
segments = zipped.each_with_index.reverse_each.reduce([]) do |acc, ((column, cursor), idx)|
|
24
|
+
# We always start of with the leaf
|
25
|
+
segment = [Sequel[column.expression].send(column.descending ? desc : asc, cursor)]
|
26
|
+
|
27
|
+
# Scope the leaf to its higher level dimensions
|
28
|
+
zipped.slice(0, idx).each do |(col, cur)|
|
29
|
+
segment << Sequel[col.expression].send(:=~, cur)
|
30
|
+
end
|
31
|
+
|
32
|
+
acc << Sequel.&(*segment)
|
33
|
+
end
|
34
|
+
Sequel.|(*segments)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def seek(before: nil, after: nil)
|
39
|
+
raise ArgumentError, "`before` or `after` is required" unless before || after
|
40
|
+
|
41
|
+
if opts[:order].nil?
|
42
|
+
raise StandardError, "cannot call #seek on a dataset with no order"
|
43
|
+
end
|
44
|
+
|
45
|
+
cursor_size = opts[:order].count
|
46
|
+
|
47
|
+
if before
|
48
|
+
before = [before] unless before.is_a? Array
|
49
|
+
raise StandardError, "The `before` cursor has the wrong number of values. Expected #{cursor_size}, received #{before.count}." unless before.count == cursor_size
|
50
|
+
end
|
51
|
+
|
52
|
+
if after
|
53
|
+
after = [after] unless after.is_a? Array
|
54
|
+
raise StandardError, "The `after` cursor has the wrong number of values. Expected #{cursor_size}, received #{after.count}." unless after.count == cursor_size
|
55
|
+
end
|
56
|
+
|
57
|
+
columns = opts[:order].map { |o| Utils.qualify_order(o) }
|
58
|
+
conditions = []
|
59
|
+
|
60
|
+
if after
|
61
|
+
conditions << Utils.cursor_conditions(columns, after)
|
62
|
+
end
|
63
|
+
|
64
|
+
if before
|
65
|
+
conditions << Utils.cursor_conditions(columns, before, reverse: true)
|
66
|
+
end
|
67
|
+
|
68
|
+
where(Sequel.&(*conditions))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Dataset.register_extension(:keyset_pagination, KeysetPagination)
|
73
|
+
end
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sequel-keyset_pagination
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sarah Henkens
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sequel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.12'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.12'
|
27
|
+
description: Adds support to Sequel for easy cursor based pagination on datasets
|
28
|
+
email:
|
29
|
+
- sarah.a.henkens@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/sequel/extensions/keyset_pagination.rb
|
35
|
+
homepage: https://github.com/sarahhenkens/sequel-keyset_pagination
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.5.2.3
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Keyset Pagination Extension for Sequel
|
59
|
+
test_files: []
|