filterer 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fed029c0db1f3a900c0af648704587166c5d4f6d
4
- data.tar.gz: 6576fd8e1596594e5af46270d1bf9403b5ca34c0
3
+ metadata.gz: 7734d274d4ea4be3fa564c0d94a0b1a6fbb0910f
4
+ data.tar.gz: 09622d7c585ed55a808810ac358a1a052b5f4da5
5
5
  SHA512:
6
- metadata.gz: b5e9b5c05cbb35451391cb5ced7f1e74537399a46fee94f56a7948fd966bf4dad7c9c69712cec25d77a722f7405fff9289a6d427be725f5c6e1a5279ff1478a6
7
- data.tar.gz: 894a79cbddf677f8a2ac3ba0ce98a9537a07d5bf3cbfe22899dc99f0d2b95be3f744d79a2b0f2e04f2419ac185701711b0c7c35897047a3dcea3e799cf74fd09
6
+ metadata.gz: ba86f46c95b642b8606fdc5aac56e895c5dc5b4a4920f0be1bcb93a1eecf3b064836518b90e45c8657929819010b29bba5152ac605dbbc963231688b203ad6d4
7
+ data.tar.gz: 928079d0abddddf7a0c6b15a781332bc0bb52935190df90226852a2b417eeb9cd1f0d7a162d174311ceb41ab5e5850c25276c4e6b8313bace2c4c3347fee6aa0
data/lib/filterer/base.rb CHANGED
@@ -1,9 +1,51 @@
1
1
  module Filterer
2
2
  class Base
3
3
 
4
+ IGNORED_PARAMS = [:page]
5
+
4
6
  attr_accessor :results, :meta, :direction, :sort, :params
5
7
 
6
- IGNORED_PARAMS = [:page]
8
+ class << self
9
+ attr_accessor :sort_options
10
+
11
+ def sort_options
12
+ @sort_options ||= []
13
+ end
14
+
15
+ def inherited(subclass)
16
+ if @sort_options.present?
17
+ subclass.sort_options = @sort_options
18
+ end
19
+ end
20
+
21
+ def sort_option(key, query_string_or_proc = nil, opts = {})
22
+ if query_string_or_proc.is_a?(Hash)
23
+ opts, query_string_or_proc = query_string_or_proc.clone, nil
24
+ end
25
+
26
+ if !query_string_or_proc
27
+ if key.is_a?(String)
28
+ query_string_or_proc = key
29
+ else
30
+ raise 'Please provide a query string or a proc.'
31
+ end
32
+ end
33
+
34
+ if key.is_a?(Regexp) && opts[:default]
35
+ raise "Default sort option can't have a Regexp key."
36
+ end
37
+
38
+ if query_string_or_proc.is_a?(Proc) && opts[:tiebreaker]
39
+ raise "Tiebreaker can't be a proc."
40
+ end
41
+
42
+ sort_options << {
43
+ key: key,
44
+ query_string_or_proc: query_string_or_proc,
45
+ opts: opts
46
+ }
47
+ end
48
+ end
7
49
 
8
50
  def initialize(params = {}, opts = {})
9
51
  @params, @opts = params, opts
@@ -54,9 +96,46 @@ module Filterer
54
96
  end
55
97
 
56
98
  def order_results
57
- # noop
99
+ @direction = @params[:direction] == 'desc' ? 'DESC' : 'ASC'
100
+ @sort = (params[:sort] && get_sort_option(params[:sort])) ? params[:sort] : default_sort_param
101
+ return unless get_sort_option(@sort)
102
+
103
+ if get_sort_option(@sort)[:query_string_or_proc].is_a?(String)
104
+ @results = @results.order %Q{
105
+ #{get_sort_option(@sort)[:query_string_or_proc]}
106
+ #{@direction}
107
+ #{get_sort_option(@sort)[:opts][:nulls_last] ? 'NULLS LAST' : ''}
108
+ #{tiebreaker_sort_string ? ',' + tiebreaker_sort_string : ''}
109
+ }.squish
110
+ elsif get_sort_option(@sort)[:query_string_or_proc].is_a?(Proc)
111
+ matches = get_sort_option(@sort)[:key].is_a?(Regexp) ? @sort.match(get_sort_option(@sort)[:key]) : nil
112
+ @results = get_sort_option(@sort)[:query_string_or_proc].call(@results, matches)
113
+ end
58
114
  end
59
115
 
116
+ def get_sort_option(x)
117
+ self.class.sort_options.find { |sort_option|
118
+ if sort_option[:key].is_a?(Regexp)
119
+ x.match(sort_option[:key])
120
+ else # String
121
+ x == sort_option[:key]
122
+ end
123
+ }
124
+ end
125
+
126
+ def default_sort_param
127
+ self.class.sort_options.find { |sort_option|
128
+ sort_option[:opts][:default]
129
+ }.try(:[], :key)
130
+ end
131
+
132
+ def tiebreaker_sort_string
133
+ self.class.sort_options.find { |sort_option|
134
+ sort_option[:opts][:tiebreaker]
135
+ }.try(:[], :query_string_or_proc)
136
+ end
137
+
138
+
60
139
  def starting_query
61
140
  raise 'You must override this method!'
62
141
  end
@@ -3,9 +3,9 @@ module Filterer
3
3
 
4
4
  attr_reader :pages
5
5
 
6
- def initialize(searcher)
7
- @searcher = searcher
8
- return @pages = [1] if @searcher.meta[:last_page] == 1
6
+ def initialize(filterer)
7
+ @filterer = filterer
8
+ return @pages = [1] if @filterer.meta[:last_page] == 1
9
9
  push_default_pages
10
10
  calculate_additional_pages
11
11
  add_breaks
@@ -13,14 +13,14 @@ module Filterer
13
13
 
14
14
  def push_default_pages
15
15
  @pages = [1, 2]
16
- push_page(@searcher.meta[:last_page], @searcher.meta[:last_page] - 1)
16
+ push_page(@filterer.meta[:last_page], @filterer.meta[:last_page] - 1)
17
17
  end
18
18
 
19
19
  def calculate_additional_pages
20
20
  offset = 0
21
- current_page = @searcher.meta[:page]
21
+ current_page = @filterer.meta[:page]
22
22
 
23
- while @pages.length < 11 && ( (current_page - offset >= 1) || (current_page + offset <= @searcher.meta[:last_page]) ) do
23
+ while @pages.length < 11 && ( (current_page - offset >= 1) || (current_page + offset <= @filterer.meta[:last_page]) ) do
24
24
  push_page(current_page - offset, current_page + offset)
25
25
  offset += 1
26
26
  end
@@ -43,7 +43,7 @@ module Filterer
43
43
 
44
44
  def push_page(*args)
45
45
  args.each do |page|
46
- @pages.push(page) unless @pages.include?(page) || (page > @searcher.meta[:last_page]) || (page < 1)
46
+ @pages.push(page) unless @pages.include?(page) || (page > @filterer.meta[:last_page]) || (page < 1)
47
47
  end
48
48
  end
49
49
 
@@ -1,3 +1,3 @@
1
1
  module Filterer
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filterer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Becker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-17 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails