interview 0.0.7 → 0.0.8

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: 6e2d2216c636d036ba63292418a62839b715c0b4
4
- data.tar.gz: 8d113b3b730417a9ab24b679f9831f8cb3716116
3
+ metadata.gz: 1f72fac32d421925cb9de553456f7d05725c4307
4
+ data.tar.gz: f1fdabaee5c509642c1b927fa8ac45d757d71415
5
5
  SHA512:
6
- metadata.gz: 0206e158d51c3f65d05347b3fe351940aca9a5c76e34d8519aa482051c55a7a429159b9799fa72b45a2d7e592ceec543d188e5cf3248fd697e42c18b9f073727
7
- data.tar.gz: 40f9876819b6c93f3cfe0a2a5c8a3cbabc280387920522f61bef535e703243f73e874e2550eb6193d222e4d9a5e45c454d1e557f865c3415618354097132ed32
6
+ metadata.gz: a2a38a6cafd9890b5cf2d4b4aae750c6b7c8207d7cbaec77a8bf71d6d7d9986f2a6dd3505bfcb8cf260a2c900970eff8308e71a6fbd435020c9bb36881ea44a3
7
+ data.tar.gz: 18de1347ac17165a494057db3c5ac79c03168508ba29fa1f7b69b3d9f89703f8bab73a18d1eec961415771a2a05c18a9b3e04f643b6e74e05d60edf3a26aec78
@@ -1,3 +1,3 @@
1
1
  module Interview
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
data/lib/interview.rb CHANGED
@@ -89,9 +89,9 @@ module ActiveRecord
89
89
  # todo: auslagern in eigenes gem
90
90
  def self.filter(filter)
91
91
  relation = self
92
- self.joins_for_filter(filter).each do |join_table|
93
- relation = relation.joins(join_table)
94
- end
92
+ # self.joins_for_filter(filter).each do |join_table|
93
+ # relation = relation.joins(join_table)
94
+ # end
95
95
  return relation.where(*self.filter_to_sql(filter))
96
96
  end
97
97
 
@@ -104,8 +104,35 @@ module ActiveRecord
104
104
  end
105
105
  return join_tables.uniq
106
106
  end
107
-
107
+
108
108
  def self.filter_to_sql(filter)
109
+ if filter.is_a? Hash # todo
110
+ result = hash_filter_to_sql(filter)
111
+ elsif filter.respond_to? :each
112
+ result = filter_combination_to_sql(filter)
113
+ end # todo: else
114
+ puts result.first
115
+ return result
116
+ end
117
+
118
+ def self.filter_combination_to_sql(filter)
119
+ if [:and, :or].include? filter.first
120
+ combination = filter.first
121
+ filter = filter[1..-1]
122
+ end
123
+ combination ||= :or
124
+ sqls = []
125
+ values = []
126
+ filter.each do |f|
127
+ f = self.filter_to_sql(f)
128
+ sqls << f.first
129
+ values += f[1..-1]
130
+ end
131
+ sql = '(' + sqls.join(" #{combination.to_s.upcase} ") + ')'
132
+ return [sql] + values
133
+ end
134
+
135
+ def self.hash_filter_to_sql(filter)
109
136
  sqls = []
110
137
  values = []
111
138
  filter.each do |attr, filter|
@@ -133,7 +160,7 @@ module ActiveRecord
133
160
  return [sql] + values
134
161
  end
135
162
 
136
- def self.string_filter_to_sql(attr, filter)
163
+ def self.string_filter_to_sql(attr, filter, not_filter=false)
137
164
  if filter.respond_to?(:each)
138
165
  sql = "#{attr} in (?)"
139
166
  else
@@ -141,22 +168,12 @@ module ActiveRecord
141
168
  end
142
169
  return [sql, filter]
143
170
  end
144
-
145
- def self.number_filter_to_sql(attr, filter)
146
- if filter.respond_to?(:each) and filter.none? { |f| f.is_a? String }
147
- sql = "#{attr} in (?)"
148
- values = [filter]
149
- elsif filter.respond_to?(:each)
150
- sqls = []
151
- values = []
152
- filter.each do |f|
153
- result = self.number_filter_to_sql(attr, f)
154
- sqls << result.first
155
- values += results[1..-1]
156
- end
157
- sql = sqls.join(' OR ')
171
+
172
+ def self.number_filter_to_sql(attr, filter, not_filter=false)
173
+ if filter.respond_to?(:each)
174
+ return self.value_combination_to_sql(attr, filter, :number)
158
175
  elsif filter.is_a? String
159
- unless result = filter.match(/^([<>=]*)(\d+\.?\d*)$/)
176
+ unless result = filter.match(/^([!<>=]*)(\d+\.?\d*)$/)
160
177
  raise "invalid number filter: '#{filter}'"
161
178
  end
162
179
  operator = result[1] != '' ? result[1] : '='
@@ -170,7 +187,7 @@ module ActiveRecord
170
187
  return [sql] + values
171
188
  end
172
189
 
173
- def self.date_filter_to_sql(attr, filter)
190
+ def self.date_filter_to_sql(attr, filter, not_filter=false)
174
191
  if filter.respond_to?(:each)
175
192
  if filter.size != 2
176
193
  raise "invalid date filter: #{filter.inspect} 2 elements expected, #{filter.size} given"
@@ -184,18 +201,41 @@ module ActiveRecord
184
201
  return [sql] + values
185
202
  end
186
203
 
187
- def self.boolean_filter_to_sql(attr, filter)
204
+ def self.boolean_filter_to_sql(attr, filter, not_filter=false)
188
205
  return ["#{attr} = ?", filter]
189
206
  end
190
-
191
- def self.assoc_filter_to_sql(attr, filter)
207
+
208
+ def self.assoc_filter_to_sql(attr, filter, not_filter=false)
209
+ if filter.respond_to?(:each)
210
+ return self.value_combination_to_sql(attr, filter, :assoc)
211
+ end
192
212
  assoc = self.reflect_on_association(attr)
193
- if assoc.macro == :belongs_to
194
- attr = "#{attr}_id"
195
- else
196
- attr = "#{assoc.plural_name}.id" # todo
213
+ if assoc.macro == :has_and_belongs_to_many
214
+ number_filter = self.number_filter_to_sql(assoc.association_foreign_key, filter)
215
+ values = number_filter[1..-1]
216
+ sql = "id #{ not_filter ? 'NOT ' : ''}IN (SELECT #{assoc.foreign_key} FROM #{assoc.join_table} WHERE #{number_filter.first})"
217
+ end # todo: erweitern
218
+ return [sql] + values
219
+ end
220
+
221
+ def self.value_combination_to_sql(attr, filter, filter_type)
222
+ # todo: check if set is possible
223
+ if filter.first == :not
224
+ return self.send("#{filter_type}_filter_to_sql", attr, filter[1], true)
225
+ elsif [:and, :or].include? filter.first
226
+ combination = filter.first
227
+ filter = filter[1..-1]
197
228
  end
198
- return self.number_filter_to_sql(attr, filter)
229
+ combination ||= :or
230
+ sqls = []
231
+ values = []
232
+ filter.each do |f|
233
+ f = self.send("#{filter_type}_filter_to_sql", attr, f)
234
+ sqls << f.first
235
+ values += f[1..-1]
236
+ end
237
+ sql = '(' + sqls.join(" #{combination.to_s.upcase} ") + ')'
238
+ return [sql] + values
199
239
  end
200
240
 
201
241
  def self.human_name(options={})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interview
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jannes Köhler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-24 00:00:00.000000000 Z
11
+ date: 2014-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler