Class: Deli::Query
- Inherits:
-
Object
show all
- Defined in:
- lib/deli/query.rb
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(deli_controller) ⇒ Query
Returns a new instance of Query.
49
50
51
|
# File 'lib/deli/query.rb', line 49
def initialize(deli_controller)
@controller = deli_controller
end
|
Instance Attribute Details
#controller ⇒ Object
Returns the value of attribute controller.
47
48
49
|
# File 'lib/deli/query.rb', line 47
def controller
@controller
end
|
Class Method Details
.build_query(params) ⇒ Object
from rack, except we don’t escape anything! keeps url’s nicely formatted… up to you to make sure you have the right input
36
37
38
39
40
41
42
43
44
|
# File 'lib/deli/query.rb', line 36
def build_query(params)
params.map do |k, v|
if v.class == Array
build_query(v.map { |x| [k, x] })
else
"#{k}=#{v}"
end
end.join("&").gsub(/\s+/, "+")
end
|
.parse_query(qs, d = nil) ⇒ Object
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/deli/query.rb', line 9
def parse_query(qs, d = nil)
params = {}
(qs || '').split(d ? /[#{d}] */n : /[&;] */n).each do |p|
k, v = p.split('=', 2).map { |x| unescape(x) }
if cur = params[k]
if cur.class == Array
params[k] << v
else
params[k] = [cur, v]
end
else
params[k] = v
end
end
return params
end
|
.parse_string(string) ⇒ Object
4
5
6
|
# File 'lib/deli/query.rb', line 4
def parse_string(string)
parse_query(::URI.parse(string).query)
end
|
.unescape(string) ⇒ Object
29
30
31
|
# File 'lib/deli/query.rb', line 29
def unescape(string)
string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) { [$1.delete('%')].pack('H*') }
end
|
Instance Method Details
#append_join(key) ⇒ Object
73
74
75
|
# File 'lib/deli/query.rb', line 73
def append_join(key)
joins.push(key.to_sym)
end
|
#conditions(params) ⇒ Object
116
117
118
|
# File 'lib/deli/query.rb', line 116
def conditions(params)
to_conditions(render(params.except("page", "limit", "sort")))
end
|
#conditions?(params) ⇒ Boolean
65
66
67
68
69
70
71
|
# File 'lib/deli/query.rb', line 65
def conditions?(params)
controller.params.select do |param|
param.key !~ /^(?:page|limit|sort)$/
end.any? do |param|
params[param.key].present?
end
end
|
#default_sort ⇒ Object
81
82
83
84
85
86
87
88
89
|
# File 'lib/deli/query.rb', line 81
def default_sort
if @default_sort_exists.nil?
sort = find("sort")
@default_sort_exists = sort.present? && sort.default.present?
@default_sort = sort.default if @default_sort_exists
end
@default_sort
end
|
#find(key) ⇒ Object
59
60
61
62
63
|
# File 'lib/deli/query.rb', line 59
def find(key)
controller.params.detect do |param|
param.key == key
end
end
|
#joins ⇒ Object
77
78
79
|
# File 'lib/deli/query.rb', line 77
def joins
@joins ||= []
end
|
#matching(params) ⇒ Object
53
54
55
56
57
|
# File 'lib/deli/query.rb', line 53
def matching(params)
controller.params.select do |param|
params[param.key].present?
end
end
|
#parse(url_or_params) ⇒ Object
99
100
101
102
103
104
105
106
|
# File 'lib/deli/query.rb', line 99
def parse(url_or_params)
case url_or_params
when ::String
parse_string(url_or_params)
else
url_or_params
end
end
|
#parse_query(qs, d = nil) ⇒ Object
95
96
97
|
# File 'lib/deli/query.rb', line 95
def parse_query(qs, d = nil)
::Deli::Query.parse_query(qs, d)
end
|
#parse_string(string) ⇒ Object
91
92
93
|
# File 'lib/deli/query.rb', line 91
def parse_string(string)
::Deli::Query.parse_string(string)
end
|
#render(params) ⇒ Object
108
109
110
111
112
113
114
|
# File 'lib/deli/query.rb', line 108
def render(params)
params = parse(params)
matching(params).inject({}) do |hash, param|
hash[param.key] = param.render(params[param.key])
hash
end
end
|
#to_conditions(hash) ⇒ Object
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/deli/query.rb', line 120
def to_conditions(hash)
keys = []
values = []
hash.values.collect do |array|
keys << array[0]
values << array[1..-1]
end
keys.map! {|i| "(#{i})"} if keys.length > 1
[keys.join(" AND "), *values.flatten]
end
|