##// END OF EJS Templates
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
Eric Davis -
r2088:ea77929d62a3
parent child
Show More
@@ -309,60 +309,69 class Query < ActiveRecord::Base
309 v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
309 v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
310 end
310 end
311
311
312 sql = sql + sql_for_field(field, v, db_table, db_field, is_custom_filter)
313
314 sql << ')'
315 filters_clauses << sql
316 end if filters and valid?
317
318 (filters_clauses << project_statement).join(' AND ')
319 end
320
321 private
322
323 # Helper method to generate the WHERE sql for a +field+ with a value (+v+)
324 def sql_for_field(field, v, db_table, db_field, is_custom_filter)
325 sql = ''
312 case operator_for field
326 case operator_for field
313 when "="
327 when "="
314 sql = sql + "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
328 return "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
315 when "!"
329 when "!"
316 sql = sql + "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
330 return "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
317 when "!*"
331 when "!*"
318 sql = sql + "#{db_table}.#{db_field} IS NULL"
332 sql = "#{db_table}.#{db_field} IS NULL"
319 sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
333 sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
334 return sql
320 when "*"
335 when "*"
321 sql = sql + "#{db_table}.#{db_field} IS NOT NULL"
336 sql = "#{db_table}.#{db_field} IS NOT NULL"
322 sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
337 sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
338 return sql
323 when ">="
339 when ">="
324 sql = sql + "#{db_table}.#{db_field} >= #{v.first.to_i}"
340 return "#{db_table}.#{db_field} >= #{v.first.to_i}"
325 when "<="
341 when "<="
326 sql = sql + "#{db_table}.#{db_field} <= #{v.first.to_i}"
342 return "#{db_table}.#{db_field} <= #{v.first.to_i}"
327 when "o"
343 when "o"
328 sql = sql + "#{IssueStatus.table_name}.is_closed=#{connection.quoted_false}" if field == "status_id"
344 return "#{IssueStatus.table_name}.is_closed=#{connection.quoted_false}" if field == "status_id"
329 when "c"
345 when "c"
330 sql = sql + "#{IssueStatus.table_name}.is_closed=#{connection.quoted_true}" if field == "status_id"
346 return "#{IssueStatus.table_name}.is_closed=#{connection.quoted_true}" if field == "status_id"
331 when ">t-"
347 when ">t-"
332 sql = sql + date_range_clause(db_table, db_field, - v.first.to_i, 0)
348 return date_range_clause(db_table, db_field, - v.first.to_i, 0)
333 when "<t-"
349 when "<t-"
334 sql = sql + date_range_clause(db_table, db_field, nil, - v.first.to_i)
350 return date_range_clause(db_table, db_field, nil, - v.first.to_i)
335 when "t-"
351 when "t-"
336 sql = sql + date_range_clause(db_table, db_field, - v.first.to_i, - v.first.to_i)
352 return date_range_clause(db_table, db_field, - v.first.to_i, - v.first.to_i)
337 when ">t+"
353 when ">t+"
338 sql = sql + date_range_clause(db_table, db_field, v.first.to_i, nil)
354 return date_range_clause(db_table, db_field, v.first.to_i, nil)
339 when "<t+"
355 when "<t+"
340 sql = sql + date_range_clause(db_table, db_field, 0, v.first.to_i)
356 return date_range_clause(db_table, db_field, 0, v.first.to_i)
341 when "t+"
357 when "t+"
342 sql = sql + date_range_clause(db_table, db_field, v.first.to_i, v.first.to_i)
358 return date_range_clause(db_table, db_field, v.first.to_i, v.first.to_i)
343 when "t"
359 when "t"
344 sql = sql + date_range_clause(db_table, db_field, 0, 0)
360 return date_range_clause(db_table, db_field, 0, 0)
345 when "w"
361 when "w"
346 from = l(:general_first_day_of_week) == '7' ?
362 from = l(:general_first_day_of_week) == '7' ?
347 # week starts on sunday
363 # week starts on sunday
348 ((Date.today.cwday == 7) ? Time.now.at_beginning_of_day : Time.now.at_beginning_of_week - 1.day) :
364 ((Date.today.cwday == 7) ? Time.now.at_beginning_of_day : Time.now.at_beginning_of_week - 1.day) :
349 # week starts on monday (Rails default)
365 # week starts on monday (Rails default)
350 Time.now.at_beginning_of_week
366 Time.now.at_beginning_of_week
351 sql = sql + "#{db_table}.#{db_field} BETWEEN '%s' AND '%s'" % [connection.quoted_date(from), connection.quoted_date(from + 7.days)]
367 return "#{db_table}.#{db_field} BETWEEN '%s' AND '%s'" % [connection.quoted_date(from), connection.quoted_date(from + 7.days)]
352 when "~"
368 when "~"
353 sql = sql + "#{db_table}.#{db_field} LIKE '%#{connection.quote_string(v.first)}%'"
369 return "#{db_table}.#{db_field} LIKE '%#{connection.quote_string(v.first)}%'"
354 when "!~"
370 when "!~"
355 sql = sql + "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(v.first)}%'"
371 return "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(v.first)}%'"
356 end
372 end
357 sql << ')'
358 filters_clauses << sql
359 end if filters and valid?
360
361 (filters_clauses << project_statement).join(' AND ')
362 end
373 end
363
374
364 private
365
366 def add_custom_fields_filters(custom_fields)
375 def add_custom_fields_filters(custom_fields)
367 @available_filters ||= {}
376 @available_filters ||= {}
368
377
General Comments 0
You need to be logged in to leave comments. Login now