Last active
December 11, 2015 22:49
-
-
Save Altech/4672652 to your computer and use it in GitHub Desktop.
experimental API of many td queries.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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