glasses 1.6.2 → 1.7.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/glasses.rb +254 -10
- data/lib/glasses/version.rb +1 -1
- data/spec/dummy/app/controllers/search_controller.rb +29 -17
- data/spec/dummy/app/views/search/full_raw_search_range.html.erb +0 -0
- data/spec/dummy/app/views/search/full_search.html.erb +0 -0
- data/spec/dummy/app/views/search/full_search_range.html.erb +0 -0
- data/spec/dummy/app/views/search/range_search.html.erb +30 -0
- data/spec/dummy/app/views/search/raw_full_search.html.erb +0 -0
- data/spec/dummy/app/views/search/raw_range_search.html.erb +25 -0
- data/spec/dummy/app/views/search/simple_search.html.erb +4 -2
- data/spec/dummy/config/routes.rb +3 -54
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/seeds.rb +2 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +2628 -0
- data/spec/dummy/log/test.log +42280 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/-n4kyDOdRxiiiIJEFA9cId9azJmW5g6hmwbs8SJ4qRg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2SBt5E86bhaTcl7TkcrIXPVQyQtH9yIRArRC_UxPck4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2Tqd0MZWTPMTu8CoqlOCudnpF2UapAVb-1Qd3gZnzWs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4m7rzZ6NLrCLYY8Klx2qByvjsF9EwTrhkqhffC_ddIU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4wucpOHsDYdErjU4sC9i1FT33L-WRugEHtfQdiz-CXY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/AE40Tp96RkdOo7EhY00dhAOG17GUBn6QkZxp0HQVRQA.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CtIOdYL64ZUZ8_1ALDOZWNEis9WeBXUYTZ95MGCwJxk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DMb_4zR5zBmQGRtZlXIrUCrkOrY-Wzw_ESjc3NoXX6s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/FfRbjoX7fHHQqnXiehqlD233T1kj4rzNPybfmQ_GUWI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JlLKJj3SMeXmPLYJvdO955A6OPH9wSTWF3QFOvbaT0k.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Mo_r4nJu9qt0iEhVH0CXGZkIh_SCKfu3LoDU6GlMT-U.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/PjzZwmbYJUPXBPEKfYAIld32mtAk3H0hBz7ONWVqza4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/QYBC6SiWic96YuGP27vORM8frM2yoCxYATSeAuu3q3s.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/QfZ4TPv_vTZ6WmGKJEhbsZ0Ou73XHsnuUlsaYV3ZQEY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XIp7H1NvI9qObEEUnVrJoJ0TgF9dsNRmdw7bkMLyf64.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aCkopDHgOZcXcLJcYI3sgc_SuAZhhr9RkRQshzmldF8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bkZWDwb871tTLoM-W80twc_qhQ_ziPfInIfbzCcLnpE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gLJlx0p_IOKb7r9m3hjLdN2jGSicQ_Ns4SS1jWlFDAQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/i9TsnRfu6oqRsV9V2v_6Ulubst2IVveepQEkimUU6QE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/iEVE5Kzzv15cyQWfQGEbgnKSSO0xiblZzP-sO26AYGQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rRXYm5yDdh2lrn8etfERia5zGqWg3_cJ3siQQG6h9UU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/t3hd5M5Qs7xWqz8gFCvXf781-4lYaem1SZCLRh47qCc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yHIJ2OseWB_qclWx7fwHLHPAVYOch64QqS8Y07WHhRk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yuW5Zfj9wAku7kLsnPBHwLsetLDeWKm9ju_dm_GLgf0.cache +1 -0
- data/spec/features/full_search_form_test.rb +0 -0
- data/spec/features/range_search_form_test.rb +79 -0
- data/spec/features/search_performance_test_in_app.rb +0 -0
- data/spec/features/simple_search_form_test.rb +34 -9
- data/spec/glasses_spec.rb +8 -1
- data/spec/test_only_methods/example_only_methods.rb +65 -0
- data/spec/tests/full_search_test.rb +63 -0
- data/spec/tests/parameters_priority_test.rb +51 -0
- data/spec/tests/performance_test.rb +0 -0
- data/spec/tests/range_search_test.rb +43 -0
- data/spec/tests/sanitized_search_test.rb +19 -7
- data/spec/tests/search_test.rb +18 -8
- metadata +78 -4
- data/spec/scratches/example_only_methods.rb +0 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 13db292133e47a1ff62d1b2883a0ded68a386683
|
|
4
|
+
data.tar.gz: a9f1733f0750ae3271ee4b25d338f319f0631fdf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01dfee05abdcdba4886d9e7e040355a6c39237f2312026bcf2e4ed7ebb6ab6c90a88c272f7e482733fb8637abcf1e80dba8fd761388213e11db361e24ca41e81
|
|
7
|
+
data.tar.gz: 29577cb0555a7efa09c548cd613713cedecf4a1d6e4eb19377b649d2eb6a5bda33744c7b63cdb25ccb1445ef62b1d6dbd55c0cce8fef1805b363a8e0e1d75dc7
|
data/lib/glasses.rb
CHANGED
|
@@ -2,11 +2,212 @@ require "glasses/version"
|
|
|
2
2
|
|
|
3
3
|
module Glasses
|
|
4
4
|
|
|
5
|
+
def self.prioritize_ints_over_strings(columns_to_search, values_to_search)
|
|
6
|
+
# Order params, prioritize ids and bools over over strings to boost performance at database hits.
|
|
7
|
+
for i in (0..columns_to_search.size-1) do
|
|
8
|
+
if columns_to_search[i][columns_to_search[i].size-3] == "E" #if it's a "like" statement
|
|
9
|
+
columns_to_search.insert(0, columns_to_search.delete_at(i))
|
|
10
|
+
values_to_search.insert(0, values_to_search.delete_at(i))
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
return [columns_to_search, values_to_search]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.prioritize_ints_over_strings_and_ranges(columns_to_search, values_to_search)
|
|
17
|
+
# Order params, prioritize ids and bools over ranges and both of these over strings to boost performance at database hits.
|
|
18
|
+
string_shifts = 0
|
|
19
|
+
total_columns = columns_to_search.size - 1
|
|
20
|
+
for i in (0..total_columns) do
|
|
21
|
+
if columns_to_search[i][columns_to_search[i].size-3] == "E" #if it's a "like" statement
|
|
22
|
+
columns_to_search.insert(0, columns_to_search.delete_at(i))
|
|
23
|
+
values_to_search.insert(0, values_to_search.delete_at(i))
|
|
24
|
+
string_shifts += 1
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
if string_shifts < total_columns # string_shifts will begin at the 'last index which contains a string' + 1
|
|
28
|
+
for i in (string_shifts..columns_to_search.size-1) do
|
|
29
|
+
if columns_to_search[i][columns_to_search[i].size-4] != " " #if it's empty at this index, value is a range;
|
|
30
|
+
columns_to_search.insert(string_shifts, columns_to_search.delete_at(i))
|
|
31
|
+
values_to_search.insert(string_shifts, values_to_search.delete_at(i))
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
return [columns_to_search, values_to_search]
|
|
36
|
+
end
|
|
37
|
+
|
|
5
38
|
def self.search(model_to_search,params_hash)
|
|
6
|
-
query =
|
|
39
|
+
query = []
|
|
40
|
+
query_params = []
|
|
41
|
+
params_hash.each do |key,val|
|
|
42
|
+
if !val.empty?
|
|
43
|
+
#key = key.to_s
|
|
44
|
+
key_suffix = key[key.size-3,key.size]
|
|
45
|
+
if key_suffix == "ool"
|
|
46
|
+
if val == "1"
|
|
47
|
+
query.push("#{key[0,key.size-5]} = ?") # excludes 'bool'
|
|
48
|
+
query_params.push(true)
|
|
49
|
+
#else
|
|
50
|
+
# query.push("#{key[0,key.size-5]} = ?") # excludes 'bool'
|
|
51
|
+
# query_params.push(false)
|
|
52
|
+
end
|
|
53
|
+
elsif key_suffix == "min"
|
|
54
|
+
query.push("#{key[0,key.size-4]} >= ?") # excludes 'min'
|
|
55
|
+
query_params.push(val.to_s)
|
|
56
|
+
elsif key_suffix == "max"
|
|
57
|
+
query.push("#{key[0,key.size-4]} <= ?") # excludes 'max'
|
|
58
|
+
query_params.push(val.to_s)
|
|
59
|
+
elsif key_suffix == "_id"
|
|
60
|
+
query.push("#{key} = ?")
|
|
61
|
+
query_params.push(val.to_s)
|
|
62
|
+
else
|
|
63
|
+
query.push("#{key} LIKE ?") # percent sign matches any string of 0 or more chars.
|
|
64
|
+
query_params.push(val + "%")
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
if !query.empty?
|
|
69
|
+
if query.size == 1
|
|
70
|
+
return model_to_search.where(query.pop(), query_params.pop())
|
|
71
|
+
else
|
|
72
|
+
prioritized = Glasses.prioritize_ints_over_strings(query, query_params)
|
|
73
|
+
query = prioritized[0]
|
|
74
|
+
query_params = prioritized[1]
|
|
75
|
+
results = model_to_search.where(query.pop(), query_params.pop())
|
|
76
|
+
(query.size).times do |search|
|
|
77
|
+
results = results.where(query.pop(), query_params.pop()) # important to note that ".where()" is not hitting the database on this line.
|
|
78
|
+
end
|
|
79
|
+
return results
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
[]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.full_search(model_to_search,params_hash)
|
|
87
|
+
query = []
|
|
88
|
+
query_params = []
|
|
7
89
|
params_hash.each do |key,val|
|
|
8
90
|
if !val.empty?
|
|
9
91
|
if key.to_s[key.size-3,key.size] == "_id"
|
|
92
|
+
query.push("#{key} = ?")
|
|
93
|
+
query_params.push(val.to_s)
|
|
94
|
+
else
|
|
95
|
+
query.push("#{key} LIKE ?") # percent sign matches any string of 0 or more chars.
|
|
96
|
+
query_params.push("%" + val + "%")
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
if !query.empty?
|
|
101
|
+
if query.size == 1
|
|
102
|
+
return model_to_search.where(query.pop(), query_params.pop())
|
|
103
|
+
else
|
|
104
|
+
results = model_to_search.where(query.pop(), query_params.pop())
|
|
105
|
+
(query.size).times do |search|
|
|
106
|
+
results = results.where(query.pop(), query_params.pop()) # important to note that ".where()" is not hitting the database on this line.
|
|
107
|
+
end
|
|
108
|
+
return results
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
[]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def self.search_range(model_to_search,params_hash)
|
|
116
|
+
query = []
|
|
117
|
+
query_params = []
|
|
118
|
+
params_hash.each do |key,val|
|
|
119
|
+
if !val.empty?
|
|
120
|
+
#key = key.to_s
|
|
121
|
+
key_suffix = key[key.size-3,key.size]
|
|
122
|
+
if key_suffix == "ool"
|
|
123
|
+
if val == "1"
|
|
124
|
+
query.push("#{key[0,key.size-5]} = ?") # excludes 'bool'
|
|
125
|
+
query_params.push(true)
|
|
126
|
+
#else
|
|
127
|
+
# query.push("#{key[0,key.size-5]} = ?") # excludes 'bool'
|
|
128
|
+
# query_params.push(false)
|
|
129
|
+
end
|
|
130
|
+
elsif key_suffix == "min"
|
|
131
|
+
query.push("#{key[0,key.size-4]} >= ?")
|
|
132
|
+
query_params.push(val.to_s)
|
|
133
|
+
elsif key_suffix == "max"
|
|
134
|
+
query.push("#{key[0,key.size-4]} <= ?")
|
|
135
|
+
query_params.push(val.to_s)
|
|
136
|
+
elsif key_suffix == "_id"
|
|
137
|
+
query.push("#{key} = ?")
|
|
138
|
+
query_params.push(val.to_s)
|
|
139
|
+
else
|
|
140
|
+
query.push("#{key} LIKE ?") # percent sign matches any string of 0 or more chars.
|
|
141
|
+
query_params.push(val + "%")
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
if !query.empty?
|
|
146
|
+
if query.size == 1
|
|
147
|
+
return model_to_search.where(query.pop(), query_params.pop())
|
|
148
|
+
else
|
|
149
|
+
prioritized = Glasses.prioritize_ints_over_strings_and_ranges(query, query_params)
|
|
150
|
+
query = prioritized[0]
|
|
151
|
+
query_params = prioritized[1]
|
|
152
|
+
results = model_to_search.where(query.pop(), query_params.pop())
|
|
153
|
+
(query.size).times do |search|
|
|
154
|
+
results = results.where(query.pop(), query_params.pop()) # important to note that ".where()" is not hitting the database on this line.
|
|
155
|
+
end
|
|
156
|
+
return results
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
[]
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def self.full_search_range(model_to_search, params_hash)
|
|
164
|
+
query = []
|
|
165
|
+
query_params = []
|
|
166
|
+
params_hash.each do |key,val|
|
|
167
|
+
if !val.empty?
|
|
168
|
+
key_suffix = key.to_s[key.size-3,key.size]
|
|
169
|
+
if key_suffix == "min"
|
|
170
|
+
query.push("#{key[0,key.size-4]} >= ?")
|
|
171
|
+
query_params.push(val.to_s)
|
|
172
|
+
elsif key_suffix == "max"
|
|
173
|
+
query.push("#{key[0,key.size-4]} <= ?")
|
|
174
|
+
query_params.push(val.to_s)
|
|
175
|
+
elsif key_suffix == "_id"
|
|
176
|
+
query.push("#{key} = ?")
|
|
177
|
+
query_params.push(val.to_s)
|
|
178
|
+
else
|
|
179
|
+
query.push("#{key} LIKE ?") # percent sign matches any string of 0 or more chars.
|
|
180
|
+
query_params.push("%" + val + "%")
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
if !query.empty?
|
|
185
|
+
if query.size == 1
|
|
186
|
+
return model_to_search.where(query.pop(), query_params.pop())
|
|
187
|
+
else
|
|
188
|
+
prioritized = Glasses.prioritize_ints_over_strings_and_ranges(query, query_params)
|
|
189
|
+
query = prioritized[0]
|
|
190
|
+
query_params = prioritized[1]
|
|
191
|
+
results = model_to_search.where(query.pop(), query_params.pop())
|
|
192
|
+
(query.size).times do |search|
|
|
193
|
+
results = results.where(query.pop(), query_params.pop()) # important to note that ".where()" is not hitting the database on this line.
|
|
194
|
+
end
|
|
195
|
+
return results
|
|
196
|
+
end
|
|
197
|
+
else
|
|
198
|
+
[]
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def self.raw_search(model_to_search,params_hash)
|
|
203
|
+
query = ""
|
|
204
|
+
params_hash.each do |key,val|
|
|
205
|
+
if val
|
|
206
|
+
key = key.to_s
|
|
207
|
+
key_suffix = key.to_s[key.size-3,key.size]
|
|
208
|
+
if key_suffix == "ool"
|
|
209
|
+
query += "#{key[0,key.size-5]} = '1' AND "
|
|
210
|
+
elsif key_suffix == "_id"
|
|
10
211
|
query += "#{key} = #{val} AND "
|
|
11
212
|
else
|
|
12
213
|
query += "#{key} LIKE '#{val}%' AND " # percent sign matches any string of 0 or more chars.
|
|
@@ -21,25 +222,68 @@ module Glasses
|
|
|
21
222
|
end
|
|
22
223
|
end
|
|
23
224
|
|
|
24
|
-
def self.
|
|
225
|
+
def self.full_raw_search(model_to_search,params_hash)
|
|
25
226
|
query = ""
|
|
26
|
-
query_params = []
|
|
27
227
|
params_hash.each do |key,val|
|
|
28
228
|
if !val.empty?
|
|
29
229
|
if key.to_s[key.size-3,key.size] == "_id"
|
|
30
|
-
query += "#{key} =
|
|
31
|
-
query_params.push(val.to_s)
|
|
230
|
+
query += "#{key} = #{val} AND "
|
|
32
231
|
else
|
|
33
|
-
query += "#{key} LIKE
|
|
34
|
-
query_params.push(val + "%")
|
|
232
|
+
query += "#{key} LIKE '%#{val}%' AND " # percent sign matches any string of 0 or more chars.
|
|
35
233
|
end
|
|
36
234
|
end
|
|
37
235
|
end
|
|
38
236
|
if !query.empty?
|
|
39
237
|
query = query[0,query.size-5]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
238
|
+
model_to_search.where(query)
|
|
239
|
+
else
|
|
240
|
+
[]
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def self.raw_search_range(model_to_search,params_hash)
|
|
245
|
+
query = ""
|
|
246
|
+
params_hash.each do |key,val|
|
|
247
|
+
if !val.empty?
|
|
248
|
+
key_suffix = key.to_s[key.size-3,key.size]
|
|
249
|
+
if key_suffix == "min"
|
|
250
|
+
query += "#{key[0,key.size-4]} >= #{val} AND "
|
|
251
|
+
elsif key_suffix == "max"
|
|
252
|
+
query += "#{key[0,key.size-4]} <= #{val} AND "
|
|
253
|
+
elsif key_suffix == "_id"
|
|
254
|
+
query += "#{key} = #{val} AND "
|
|
255
|
+
else
|
|
256
|
+
query += "#{key} LIKE '#{val}%' AND " # percent sign matches any string of 0 or more chars.
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
if !query.empty?
|
|
261
|
+
query = query[0,query.size-5]
|
|
262
|
+
model_to_search.where(query)
|
|
263
|
+
else
|
|
264
|
+
[]
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def self.full_raw_search_range(model_to_search, params_hash)
|
|
269
|
+
query = ""
|
|
270
|
+
params_hash.each do |key,val|
|
|
271
|
+
if !val.empty?
|
|
272
|
+
key_suffix = key.to_s[key.size-3,key.size]
|
|
273
|
+
if key_suffix == "min"
|
|
274
|
+
query += "#{key[0,key.size-4]} >= #{val} AND "
|
|
275
|
+
elsif key_suffix == "max"
|
|
276
|
+
query += "#{key[0,key.size-4]} <= #{val} AND "
|
|
277
|
+
elsif key_suffix == "_id"
|
|
278
|
+
query += "#{key} = #{val} AND "
|
|
279
|
+
else
|
|
280
|
+
query += "#{key} LIKE '%#{val}%' AND " # percent sign matches any string of 0 or more chars.
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
if !query.empty?
|
|
285
|
+
query = query[0,query.size-5]
|
|
286
|
+
model_to_search.where(query)
|
|
43
287
|
else
|
|
44
288
|
[]
|
|
45
289
|
end
|
data/lib/glasses/version.rb
CHANGED
|
@@ -16,7 +16,7 @@ class SearchController < ApplicationController
|
|
|
16
16
|
|
|
17
17
|
def method_sanitized_simple_search
|
|
18
18
|
if params[:search_params]
|
|
19
|
-
@players = Glasses.
|
|
19
|
+
@players = Glasses.raw_search(Player, params[:search_params])
|
|
20
20
|
@num_results = 0
|
|
21
21
|
else
|
|
22
22
|
@players = []
|
|
@@ -40,17 +40,36 @@ class SearchController < ApplicationController
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
def range_search
|
|
44
|
+
if params[:search_params]
|
|
45
|
+
@players = Glasses.search_range(Player, params[:search_params])
|
|
46
|
+
@num_results = 0
|
|
47
|
+
else
|
|
48
|
+
@players = []
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def raw_range_search
|
|
53
|
+
if params[:search_params]
|
|
54
|
+
@players = Glasses.raw_search_range(Player, params[:search_params])
|
|
55
|
+
@num_results = 0
|
|
56
|
+
else
|
|
57
|
+
@players = []
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def full_search_range
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
43
65
|
protected
|
|
44
66
|
|
|
45
67
|
def search_params_sanitizer_defined_in_the_app(search_params, escape_char = "\\")
|
|
46
68
|
sanitized_params = {}
|
|
47
|
-
pattern = Regexp.union(escape_char, "%", "_", "
|
|
48
|
-
search_params.each do |key, val|
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
sanitized_params[key] = val.gsub(pattern) do |s|
|
|
52
|
-
[escape_char, s].join
|
|
53
|
-
end
|
|
69
|
+
pattern = Regexp.union(escape_char, "%", "_", "=")
|
|
70
|
+
search_params.each do |key, val|
|
|
71
|
+
# sanitizing data directly is not that a good idea and should be done when no other solution is available
|
|
72
|
+
sanitized_params[key] = val.gsub(/\\/, '\&\&').gsub(/'/, "''")
|
|
54
73
|
end
|
|
55
74
|
begin
|
|
56
75
|
return sanitized_params
|
|
@@ -60,16 +79,9 @@ class SearchController < ApplicationController
|
|
|
60
79
|
end
|
|
61
80
|
|
|
62
81
|
def caughts_injected_code_in_search(search_params, escape_char = "\\")
|
|
63
|
-
sanitized_params =
|
|
64
|
-
pattern = Regexp.union(escape_char, "%", "_", "--", "=")
|
|
65
|
-
search_params.each do |key, val|
|
|
66
|
-
sanitized_params[key] = val.gsub(pattern) do |s|
|
|
67
|
-
[escape_char, s].join
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
82
|
+
sanitized_params = search_params_sanitizer_defined_in_the_app(search_params, escape_char = "\\")
|
|
71
83
|
begin
|
|
72
|
-
results = Glasses.
|
|
84
|
+
results = Glasses.raw_search(Player, sanitized_params)
|
|
73
85
|
rescue SQLException
|
|
74
86
|
results = []
|
|
75
87
|
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<%= form_for(:search_params, url: range_search_path, method: "get", id: "simple_search_form") do |f| %>
|
|
2
|
+
|
|
3
|
+
<%= f.label :first_name, "First Name:" %>
|
|
4
|
+
<%= f.text_field :first_name %>
|
|
5
|
+
|
|
6
|
+
<%= f.label :age_min, "Minimum Age:" %>
|
|
7
|
+
<%= f.text_field :age_min %>
|
|
8
|
+
|
|
9
|
+
<%= f.label :age_max, "Maximum Age:" %>
|
|
10
|
+
<%= f.text_field :age_max %>
|
|
11
|
+
|
|
12
|
+
<label>Looking for a virgin loser:
|
|
13
|
+
<input name="search_params[is_virgin_bool]" type="hidden" value="0" />
|
|
14
|
+
<input checked="checked" type="checkbox" id="checked_box" name="search_params[is_virgin_bool]" value="1" />
|
|
15
|
+
</label>
|
|
16
|
+
|
|
17
|
+
<%= f.submit "Search" %>
|
|
18
|
+
<% end %>
|
|
19
|
+
|
|
20
|
+
<% if @players.empty? %>
|
|
21
|
+
<p id="fail">WOPS, NOTHING TO SEARCH</p>
|
|
22
|
+
<p>0 entries</p>
|
|
23
|
+
<% else %>
|
|
24
|
+
|
|
25
|
+
<% @players.each do |p| %>
|
|
26
|
+
<% @num_results += 1 %>
|
|
27
|
+
<p id="success"><%= p.first_name %>, GR8 SUCCESS</p>
|
|
28
|
+
<% end %>
|
|
29
|
+
<p><%= "#{@num_results}"%></p>
|
|
30
|
+
<% end %>
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<%= form_for(:search_params, url: raw_range_search_path, method: "get", id: "simple_search_form") do |f| %>
|
|
2
|
+
|
|
3
|
+
<%= f.label :first_name, "First Name:" %>
|
|
4
|
+
<%= f.text_field :first_name %>
|
|
5
|
+
|
|
6
|
+
<%= f.label :age_min, "Minimum Age:" %>
|
|
7
|
+
<%= f.text_field :age_min %>
|
|
8
|
+
|
|
9
|
+
<%= f.label :age_max, "Maximum Age:" %>
|
|
10
|
+
<%= f.text_field :age_max %>
|
|
11
|
+
|
|
12
|
+
<%= f.submit "Search" %>
|
|
13
|
+
<% end %>
|
|
14
|
+
|
|
15
|
+
<% if @players.empty? %>
|
|
16
|
+
<p id="fail">WOPS, NOTHING TO SEARCH</p>
|
|
17
|
+
<p>0 entries</p>
|
|
18
|
+
<% else %>
|
|
19
|
+
|
|
20
|
+
<% @players.each do |p| %>
|
|
21
|
+
<% @num_results += 1 %>
|
|
22
|
+
<p id="success"><%= p.first_name %>, GR8 SUCCESS</p>
|
|
23
|
+
<% end %>
|
|
24
|
+
<p><%= "#{@num_results}"%></p>
|
|
25
|
+
<% end %>
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
<%= f.label :first_name, "First Name:" %>
|
|
4
4
|
<%= f.text_field :first_name %>
|
|
5
5
|
|
|
6
|
+
<label>Looking for a virgin loser:
|
|
7
|
+
<input checked="checked" type="checkbox" id="checked_box" name="search_params[is_virgin_bool]" value="1" />
|
|
8
|
+
</label>
|
|
6
9
|
<%= f.submit "Search" %>
|
|
7
10
|
<% end %>
|
|
8
11
|
|
|
@@ -10,10 +13,9 @@
|
|
|
10
13
|
<p id="fail">WOPS, NOTHING TO SEARCH</p>
|
|
11
14
|
<p>0 entries</p>
|
|
12
15
|
<% else %>
|
|
13
|
-
|
|
14
16
|
<% @players.each do |p| %>
|
|
15
17
|
<% @num_results += 1 %>
|
|
16
|
-
<p id="success"><%= p.first_name
|
|
18
|
+
<p id="success"><%= p.first_name %>,<%= p.is_virgin.to_s %>,<%= "LOOOSERR," if p.is_virgin %> GR8 SUCCESS</p>
|
|
17
19
|
<% end %>
|
|
18
20
|
<p><%= "#{@num_results}"%> entries</p>
|
|
19
21
|
<% end %>
|