69 lines
2.4 KiB
Ruby
69 lines
2.4 KiB
Ruby
|
require 'active_record'
|
||
|
|
||
|
module Carto
|
||
|
class SearchTweet < ActiveRecord::Base
|
||
|
|
||
|
STATE_IMPORTING = 'importing'.freeze
|
||
|
STATE_COMPLETE = 'complete'.freeze
|
||
|
STATE_FAILED = 'failed'.freeze
|
||
|
|
||
|
belongs_to :user, inverse_of: :search_tweets, class_name: 'Carto::User'
|
||
|
belongs_to :user_table, class_name: 'Carto::UserTable'
|
||
|
belongs_to :data_import, class_name: 'Carto::DataImport'
|
||
|
|
||
|
def self.twitter_imports_count(query, date_from, date_to)
|
||
|
query
|
||
|
.where('search_tweets.state' => STATE_COMPLETE)
|
||
|
.where('search_tweets.created_at >= ? AND search_tweets.created_at <= ?', date_from, date_to + 1.days)
|
||
|
.sum("search_tweets.retrieved_items").to_i
|
||
|
end
|
||
|
|
||
|
def self.twitter_imports_count_by_date(query, date_from, date_to)
|
||
|
query
|
||
|
.where('search_tweets.state' => STATE_COMPLETE)
|
||
|
.where('search_tweets.created_at >= ? AND search_tweets.created_at <= ?', date_from, date_to + 1.days)
|
||
|
.group("date_trunc('day', search_tweets.created_at)")
|
||
|
.select("date_trunc('day', search_tweets.created_at) as date, SUM(search_tweets.retrieved_items) as count")
|
||
|
.all
|
||
|
.map { |t| { t.date.to_date => t.count.to_i } }
|
||
|
.reduce({}, &:merge)
|
||
|
end
|
||
|
|
||
|
def set_importing_state
|
||
|
self.state = STATE_IMPORTING
|
||
|
end
|
||
|
|
||
|
def set_complete_state
|
||
|
self.state = STATE_COMPLETE
|
||
|
end
|
||
|
|
||
|
def set_failed_state
|
||
|
self.state = STATE_FAILED
|
||
|
end
|
||
|
|
||
|
def calculate_used_credits
|
||
|
return 0 unless self.state == Carto::SearchTweet::STATE_COMPLETE
|
||
|
|
||
|
total_rows = self.retrieved_items
|
||
|
quota = user.effective_twitter_total_quota
|
||
|
|
||
|
remaining_quota = quota + total_rows - user.effective_get_twitter_imports_count
|
||
|
remaining_quota = (remaining_quota > 0 ? remaining_quota : 0)
|
||
|
used_credits = total_rows - remaining_quota
|
||
|
(used_credits > 0 ? used_credits : 0)
|
||
|
end
|
||
|
|
||
|
def price
|
||
|
return 0 unless self.retrieved_items > 0
|
||
|
|
||
|
if [user.effective_twitter_block_price, calculate_used_credits, user.effective_twitter_datasource_block_size].any?(&:nil?)
|
||
|
log_error('Uncomplete twitter configuration', current_user: user)
|
||
|
# As the import itself went well don't break execution, just return something
|
||
|
0
|
||
|
else
|
||
|
(user.effective_twitter_block_price * calculate_used_credits) / user.effective_twitter_datasource_block_size.to_f
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|