ticket_generic_time.rb 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. class Report::TicketGenericTime
  2. =begin
  3. result = Report::TicketGenericTime.aggs(
  4. range_start: '2015-01-01T00:00:00Z',
  5. range_end: '2015-12-31T23:59:59Z',
  6. interval: 'month', # year, quarter, month, week, day, hour, minute, second
  7. selector: selector, # ticket selector to get only a collection of tickets
  8. params: { field: 'created_at', selector: selector_sub },
  9. )
  10. returns
  11. [4,5,1,5,0,51,5,56,7,4]
  12. =end
  13. def self.aggs(params)
  14. interval_es = params[:interval]
  15. if params[:interval] == 'week'
  16. interval_es = 'day'
  17. end
  18. aggs_interval = {
  19. from: params[:range_start],
  20. to: params[:range_end],
  21. interval: interval_es, # year, quarter, month, week, day, hour, minute, second
  22. field: params[:params][:field],
  23. }
  24. without_merged_tickets = {
  25. 'state' => {
  26. 'operator' => 'is not',
  27. 'value' => 'merged'
  28. }
  29. }
  30. selector = params[:selector].clone
  31. if params[:params].present? && params[:params][:selector].present?
  32. selector = selector.merge(params[:params][:selector])
  33. end
  34. selector.merge!(without_merged_tickets) # do not show merged tickets in reports
  35. result_es = SearchIndexBackend.selectors(['Ticket'], selector, nil, nil, aggs_interval)
  36. if params[:interval] == 'month'
  37. start = Date.parse(params[:range_start])
  38. stop_interval = 12
  39. elsif params[:interval] == 'week'
  40. start = Date.parse(params[:range_start])
  41. stop_interval = 7
  42. elsif params[:interval] == 'day'
  43. start = Date.parse(params[:range_start])
  44. stop_interval = 31
  45. elsif params[:interval] == 'hour'
  46. start = Time.zone.parse(params[:range_start])
  47. stop_interval = 24
  48. elsif params[:interval] == 'minute'
  49. start = Time.zone.parse(params[:range_start])
  50. stop_interval = 60
  51. end
  52. result = []
  53. (1..stop_interval).each do |_counter|
  54. match = false
  55. if !result_es
  56. raise "Invalid es result #{result_es.inspect}"
  57. end
  58. if !result_es['aggregations']
  59. raise "Invalid es result, no aggregations #{result_es.inspect}"
  60. end
  61. if !result_es['aggregations']['time_buckets']
  62. raise "Invalid es result, no time_buckets #{result_es.inspect}"
  63. end
  64. if !result_es['aggregations']['time_buckets']['buckets']
  65. raise "Invalid es result, no buckets #{result_es.inspect}"
  66. end
  67. result_es['aggregations']['time_buckets']['buckets'].each do |item|
  68. if params[:interval] == 'minute'
  69. item['key_as_string'] = item['key_as_string'].sub(/:\d\d.\d\d\dZ$/, '')
  70. start_string = start.iso8601.sub(/:\d\dZ$/, '')
  71. else
  72. start_string = start.iso8601.sub(/:\d\d:\d\d.+?$/, '')
  73. end
  74. next if !item['doc_count']
  75. next if item['key_as_string'] !~ /#{start_string}/
  76. next if match
  77. match = true
  78. result.push item['doc_count']
  79. if params[:interval] == 'month'
  80. start = start.next_month
  81. elsif params[:interval] == 'week'
  82. start = start.next_day
  83. elsif params[:interval] == 'day'
  84. start = start.next_day
  85. elsif params[:interval] == 'hour'
  86. start = start + 1.hour
  87. elsif params[:interval] == 'minute'
  88. start = start + 1.minute
  89. end
  90. end
  91. next if match
  92. result.push 0
  93. if params[:interval] == 'month'
  94. start = start.next_month
  95. elsif params[:interval] == 'week'
  96. start = start.next_day
  97. elsif params[:interval] == 'day'
  98. start = start + 1.day
  99. elsif params[:interval] == 'hour'
  100. start = start + 1.hour
  101. elsif params[:interval] == 'minute'
  102. start = start + 1.minute
  103. end
  104. end
  105. result
  106. end
  107. =begin
  108. result = Report::TicketGenericTime.items(
  109. range_start: '2015-01-01T00:00:00Z',
  110. range_end: '2015-12-31T23:59:59Z',
  111. selector: selector, # ticket selector to get only a collection of tickets
  112. params: { field: 'created_at' },
  113. )
  114. returns
  115. {
  116. count: 123,
  117. ticket_ids: [4,5,1,5,0,51,5,56,7,4],
  118. assets: assets,
  119. }
  120. =end
  121. def self.items(params)
  122. aggs_interval = {
  123. from: params[:range_start],
  124. to: params[:range_end],
  125. field: params[:params][:field],
  126. }
  127. limit = 6000
  128. if params[:sheet].blank?
  129. limit = 100
  130. end
  131. without_merged_tickets = {
  132. 'state' => {
  133. 'operator' => 'is not',
  134. 'value' => 'merged'
  135. }
  136. }
  137. selector = params[:selector].clone
  138. if params[:params] && params[:params][:selector]
  139. selector = selector.merge(params[:params][:selector])
  140. end
  141. selector.merge!(without_merged_tickets) # do not show merged tickets in reports
  142. result = SearchIndexBackend.selectors(['Ticket'], selector, limit, nil, aggs_interval)
  143. return result if params[:sheet].present?
  144. assets = {}
  145. result[:ticket_ids].each do |ticket_id|
  146. ticket_full = Ticket.find(ticket_id)
  147. assets = ticket_full.assets(assets)
  148. end
  149. result[:assets] = assets
  150. result
  151. end
  152. end