Guest User

Untitled

a guest
Jun 20th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. class ReportProcessor
  2. attr_accessor :name, :report
  3.  
  4. def initialize(name, report)
  5. # TODO: validate report
  6. @name = name
  7. @report = report
  8. @redis = Redis.new(:host => $config.redis.host, :port => $config.redis.port, :db => 5)
  9. end
  10.  
  11. def prefix
  12. "reports_#{@name}"
  13. end
  14.  
  15. def last_collected_at=(time)
  16. @redis.set "#{prefix}_last_collected_at", time.xmlschema
  17. end
  18.  
  19. def last_collected_at
  20. value = @redis.get "#{prefix}_last_collected_at"
  21. Time.parse value if value
  22. end
  23.  
  24. def last_record_index=(int)
  25. @redis.set "#{prefix}_last_record_index", int
  26. end
  27.  
  28. def last_record_index
  29. (@redis.get("#{prefix}_last_record_index") || '-1').to_i
  30. end
  31.  
  32. # sets an in use flag on the rows till the passed block is completed
  33. def lock
  34. if @redis.getset("#{prefix}_lock", 'locked') != 'locked'
  35. begin
  36. yield
  37. rescue StandardError => e
  38. raise e
  39. ensure
  40. @redis.del "#{prefix}_lock"
  41. end
  42.  
  43. true
  44. else
  45. false
  46. end
  47. end
  48.  
  49. def lock!
  50. throw StandardError, 'Lock could not be aquired' unless lock{ yield }
  51. end
  52.  
  53. def reset!
  54. @redis.keys("#{prefix}*").each { |key| @redis.del key }
  55. end
  56.  
  57. def keys(with_value=false)
  58. @redis.smembers("#{prefix}_keys").each do |key|
  59. @redis.smembers("#{prefix}_dimensions").each do |dimension|
  60. @report[:metrics].keys.each do |metric|
  61. if with_value
  62. value = @redis.get("#{prefix}:#{key}:#{dimension}:#{metric}") || '0'
  63. yield key, dimension, metric, value.to_i
  64. else
  65. yield key, dimension, metric
  66. end
  67. end
  68. end
  69. end
  70. end
  71.  
  72. def collect(data)
  73. throw ArgumentError, "data must be enumerable" unless data.respond_to? :each
  74.  
  75. last = nil
  76.  
  77. data.each do |row|
  78. last = row
  79. key = @report[:key].call(row)
  80. dimensions = @report[:dimensions].call(row)
  81.  
  82. @redis.sadd "#{prefix}_keys", key
  83.  
  84. dimensions.each do |dimension|
  85. @redis.sadd "#{prefix}_dimensions", dimension
  86.  
  87. @report[:metrics].each do |metric, proc|
  88. @redis.incrby "#{prefix}:#{key}:#{dimension}:#{metric}", proc.call(row)
  89. end
  90. end
  91. end
  92.  
  93. if last
  94. self.last_record_index = @report[:index].call last
  95. self.last_collected_at = Time.now
  96. end
  97. end
  98. end
Add Comment
Please, Sign In to add comment