Class: Deli::Query

Inherits:
Object
  • 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

#controllerObject (readonly)

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

from rack



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

from rack



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

Returns:

  • (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_sortObject



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

#joinsObject



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