Skip to content

Instantly share code, notes, and snippets.

@Altech
Last active December 11, 2015 22:49
Show Gist options
  • Save Altech/4672652 to your computer and use it in GitHub Desktop.
Save Altech/4672652 to your computer and use it in GitHub Desktop.
experimental API of many td queries.
# case1-1: one-to-one
QuerySet.add :count_users_inflow_source, ->(from, to) do
%w[customers creators].each do |users|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|result| # queries are processed concurrently.
mongo.collection('collectionA').insert(cnt: result[0], type: uesrs)
}
end
end # return when all jobs finished.
# case1-2: many-to-one
QuerySet.add :count_users_inflow_source, ->(from, to) do
result = %w[customers creators].each_with_object(Array.new) do |users,result|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|partial_result|
result << partial_result
}
end
after do # called after all jobs finished.
mongo.collection('collectionA').insert(time: from, cnts: results.map(&:first))
end
end
# case2-1: daily query (use whenever inferface)
QuerySet.add :count_users_inflow_source, ->(from = Date.today.prev_day, to = Date.today) do
%w[customers creators].each do |users|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|result| # queries are processed concurrently.
mongo.collection('collectionA').insert(cnt: result[0], type: uesrs)
}
end
end, (every 1.day, :at => '4:30 am')
# assign schedule
QuerySet.lookup(:count_users_inflow_source).schedule = ->{ every 1.day, :at => '4:30 am' }
# grouping
QuerySet.import 'kpi' # load ./kpi.rb or ./queries/kpi.rb
QuerySet.import 'kpi', :path => 'sub_queries.rb' # load sub_queries.rb
QuerySet.import 'search/photo' # load ./search/photo.rb or ./queries/search/photo.rb or ./queries/search_photo.rb
QuerySet.look_up_by_group 'kpi' # => #<Array[Query]:0x007fa4d2a5de70>
QuerySet.import 'kpi', ->(results) do # grouping hook
results.each do |k,v|
mongo.collection('all').insert({k => v})
end
end
# execute case1
QuerySet.look_up(:count_users_inflow_source).exec!
# execute case2
# multi queries is processed concurrently.
QuerySet.look_up(:count_users_inflow_source, :calc_conversion_rate).exec!
# execute case3
# accept result interactively for debug etc.
QuerySet.look_up(:count_users_inflow_source, :calc_conversion_rate).exec!(:pry => true)
# inspect
QuerySet.look_up(:count_users_inflow_source) # => #<Query:0x007fa4d2a5de70>
QuerySet.look_up(:count_users_inflow_source).query # => [SELECT ... , ...]
QuerySet.look_up(:count_users_inflow_source).schedule # => every 1.day, :at => '4:30 am'
QuerySet.all_schedule # ...(pretty view)...
# scheduling system
# - use cron through whenever(gem)
# - https://github.com/javan/whenever
QuerySet.look_up(:count_users_inflow_source).entry_schedule(self)
# - This will execute the following.
# self.send(:every, 1.day, {:at => '4:30 am' }) do
# self.send(:runner,"QuerySet.look_up(:count_users_inflow_source).exec!")
# end
# - This is equal to following whenever configuration file.
# every 1.day, :at => '4:30 am' do
# runner "QuerySet.look_up(:count_users_inflow_source).exec!"
# end
# - entry all
QuerySet.entry_schedule(self)
# version2 - instance based.
set = QuerySet.new do # the receiver is QuerySet.
import 'kpi'
import 'search/photo'
add :count_users_inflow_source, ->(from = Date.today.prev_day, to = Date.today) do
%w[customers creators].each do |users|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|result| # queries are processed concurrently.
mongo.collection('collectionA').insert(cnt: result[0], type: uesrs)
}
end
end, (every 1.day, :at => '4:30 am')
...
end
QuerySet::Group.new 'kpi' do # the receiver is QuerySet.
add :kpi_of_new_costomers, ->(..) do
..
end
add :kpi_of_new_creators, ->(..) do
..
end
end.add_hook do |results|
results.each do |k,v|
mongo.collection('all').insert({k => v})
end
end
module QuerySet
module QueryHelper
def mongo
return Mongo::Connection.new ..
end
end
include QueryHelper
end
## block version
# case2-1: daily query (use whenever inferface)
QuerySet.add :count_users_inflow_source do |from, to|
from ||= Date.today.prev_day
to ||= Date.today
%w[customers creators].each do |users|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|result| # queries are processed concurrently.
mongo.collection('collectionA').insert(cnt: result[0], type: uesrs)
}
end
end.every(1.day, :at => '4:30 am')
QuerySet.add :count_users_inflow_source do |range|
range ||= Date.today.prev_day..Date.today
%w[customers creators].each do |users|
td.query('db',"SELECT * FROM #{users} WHERE #{specific_time(from,to)}"){|result| # queries are processed concurrently.
mongo.collection('collectionA').insert(cnt: result[0], type: uesrs)
}
end
end.every(1.day, :at => '4:30 am')
# assign schedule
QuerySet.lookup(:count_users_inflow_source).every 1.day, :at => '4:30 am'
# memo (src:http://www.ruby-forum.com/topic/174086)
# | Are all built-in objects thread safe?
#
# For MRI (1.8.x) and YARV (1.9.x), every C implemented methods are
# protected by GIL (Global Interpreter Lock), so that you don't have to
# worry about. But it might depend on each implementation.
#
# matz.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment