interview 0.0.7 → 0.0.8

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 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