sql_helper.rb 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class SqlHelper
  3. def initialize(object:)
  4. @object = object
  5. end
  6. def get_param_key(key, params)
  7. sort_by = []
  8. if params[key].present? && params[key].is_a?(String)
  9. params[key] = params[key].split(/\s*,\s*/)
  10. elsif params[key].blank?
  11. params[key] = []
  12. end
  13. sort_by
  14. end
  15. =begin
  16. This function will check the params for the "sort_by" attribute
  17. and validate its values.
  18. sql_helper = SqlHelper.new(object: Ticket)
  19. sort_by = sql_helper.get_sort_by(params, default)
  20. returns
  21. sort_by = [
  22. 'created_at',
  23. 'updated_at',
  24. ]
  25. =end
  26. def get_sort_by(params, default = nil)
  27. sort_by = get_param_key(:sort_by, params)
  28. # check order
  29. params[:sort_by].each do |value|
  30. # only accept values which are set for the db schema
  31. raise "Found invalid column '#{value}' for sorting." if @object.columns_hash[value].blank?
  32. sort_by.push(value)
  33. end
  34. if sort_by.blank? && default.present?
  35. if default.is_a?(Array)
  36. sort_by = default
  37. else
  38. sort_by.push(default)
  39. end
  40. end
  41. sort_by
  42. end
  43. =begin
  44. This function will check the params for the "order_by" attribute
  45. and validate its values.
  46. sql_helper = SqlHelper.new(object: Ticket)
  47. order_by = sql_helper.get_order_by(params, default)
  48. returns
  49. order_by = [
  50. 'asc',
  51. 'desc',
  52. ]
  53. =end
  54. def get_order_by(params, default = nil)
  55. order_by = get_param_key(:order_by, params)
  56. # check order
  57. params[:order_by].each do |value|
  58. raise "Found invalid order by value #{value}. Please use 'asc' or 'desc'." if !value.match?(/\A(asc|desc)\z/i)
  59. order_by.push(value.downcase)
  60. end
  61. if order_by.blank? && default.present?
  62. if default.is_a?(Array)
  63. order_by = default
  64. else
  65. order_by.push(default)
  66. end
  67. end
  68. order_by
  69. end
  70. def set_sql_order_default(sql, default)
  71. if sql.blank? && default.present?
  72. sql.push("#{ActiveRecord::Base.connection.quote_table_name(@object.table_name)}.#{ActiveRecord::Base.connection.quote_column_name(default)}")
  73. end
  74. sql
  75. end
  76. =begin
  77. This function will use the evaluated values for sort_by and
  78. order_by to generate the ORDER-SELECT sql statement for the sorting
  79. of the result.
  80. sort_by = [ 'created_at', 'updated_at' ]
  81. order_by = [ 'asc', 'desc' ]
  82. default = 'tickets.created_at'
  83. sql_helper = SqlHelper.new(object: Ticket)
  84. sql = sql_helper.get_order_select(sort_by, order_by, default)
  85. returns
  86. sql = 'tickets.created_at, tickets.updated_at'
  87. =end
  88. def get_order_select(sort_by, order_by, default = nil)
  89. sql = []
  90. sort_by.each_with_index do |value, index|
  91. next if value.blank?
  92. next if order_by[index].blank?
  93. sql.push( "#{ActiveRecord::Base.connection.quote_table_name(@object.table_name)}.#{ActiveRecord::Base.connection.quote_column_name(value)}" )
  94. end
  95. sql = set_sql_order_default(sql, default)
  96. sql.join(', ')
  97. end
  98. =begin
  99. This function will use the evaluated values for sort_by and
  100. order_by to generate the ORDER- sql statement for the sorting
  101. of the result.
  102. sort_by = [ 'created_at', 'updated_at' ]
  103. order_by = [ 'asc', 'desc' ]
  104. default = 'tickets.created_at DESC'
  105. sql_helper = SqlHelper.new(object: Ticket)
  106. sql = sql_helper.get_order(sort_by, order_by, default)
  107. returns
  108. sql = 'tickets.created_at ASC, tickets.updated_at DESC'
  109. =end
  110. def get_order(sort_by, order_by, default = nil)
  111. sql = []
  112. sort_by.each_with_index do |value, index|
  113. next if value.blank?
  114. next if order_by[index].blank?
  115. sql.push( "#{ActiveRecord::Base.connection.quote_table_name(@object.table_name)}.#{ActiveRecord::Base.connection.quote_column_name(value)} #{order_by[index]}" )
  116. end
  117. sql = set_sql_order_default(sql, default)
  118. sql.join(', ')
  119. end
  120. end