Skip to content

Commit

Permalink
chore: update rgbpp hourly statistic
Browse files Browse the repository at this point in the history
  • Loading branch information
rabbitz committed Dec 16, 2024
1 parent bf64f65 commit 99e9702
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 33 deletions.
3 changes: 2 additions & 1 deletion app/controllers/api/v2/rgbpp_hourly_statistics_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ def index
render json: {
data: rgbpp_statistics.map do |statistic|
{
total_count: statistic.total_count.to_s,
xudt_count: statistic.xudt_count.to_s,
dob_count: statistic.dob_count.to_s,
created_at_unixtimestamp: statistic.created_at_unixtimestamp.to_s,
}
end,
Expand Down
6 changes: 4 additions & 2 deletions app/models/cell_dependency.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ def to_raw
# Table name: cell_dependencies
#
# id :bigint not null, primary key
# contract_id :bigint
# ckb_transaction_id :bigint not null
# dep_type :integer
# contract_cell_id :bigint not null
# script_id :bigint
# contract_id :bigint
# implicit :boolean
# implicit :boolean default(TRUE), not null
# block_number :bigint
# tx_index :integer
# contract_analyzed :boolean default(FALSE)
Expand All @@ -40,6 +40,8 @@ def to_raw
#
# index_cell_dependencies_on_block_number_and_tx_index (block_number,tx_index)
# index_cell_dependencies_on_contract_analyzed (contract_analyzed)
# index_cell_dependencies_on_contract_id (contract_id)
# index_cell_dependencies_on_script_id (script_id)
# index_cell_dependencies_on_tx_id_and_cell_id_and_dep_type (ckb_transaction_id,contract_cell_id,dep_type) UNIQUE
# index_on_cell_dependencies_contract_cell_block_tx (contract_cell_id,block_number DESC,tx_index DESC)
#
3 changes: 2 additions & 1 deletion app/models/rgbpp_hourly_statistic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ class RgbppHourlyStatistic < ApplicationRecord
# Table name: rgbpp_hourly_statistics
#
# id :bigint not null, primary key
# total_count :integer default(0)
# xudt_count :integer default(0)
# dob_count :integer default(0)
# created_at_unixtimestamp :integer
# created_at :datetime not null
# updated_at :datetime not null
Expand Down
10 changes: 4 additions & 6 deletions app/workers/generate_rgbpp_hourly_statistic_worker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ class GenerateRgbppHourlyStatisticWorker
include Sidekiq::Job

def perform
xudts_count = Udt.published_xudt.joins(:xudt_tag).where("xudt_tags.tags && ARRAY[?]::varchar[]", ["rgb++"]).count
nft_collections_count = TokenCollection.where("tags && ARRAY[?]::varchar[]", ["rgb++"]).count
xudt_count = Udt.published_xudt.joins(:xudt_tag).where("xudt_tags.tags && ARRAY[?]::varchar[]", ["rgb++"]).count
dob_count = TokenCollection.where("tags && ARRAY[?]::varchar[]", ["rgb++"]).count
created_at_unixtimestamp = to_be_counted_date.beginning_of_day.to_i
RgbppHourlyStatistic.upsert(
{
total_count: xudts_count + nft_collections_count,
created_at_unixtimestamp: to_be_counted_date.beginning_of_day.to_i,
},
{ xudt_count:, dob_count:, created_at_unixtimestamp: },
unique_by: :created_at_unixtimestamp,
)
rescue StandardError => e
Expand Down
50 changes: 29 additions & 21 deletions app/workers/generate_udt_hourly_statistic_worker.rb
Original file line number Diff line number Diff line change
@@ -1,46 +1,54 @@
class GenerateUdtHourlyStatisticWorker
include Sidekiq::Job

def perform
udt_types = %i[xudt xudt_compatible spore_cell did_cell]
created_at_unixtimestamp = to_be_counted_date.beginning_of_day.to_i
def perform(datetime = nil)
ActiveRecord::Base.connection.execute("SET statement_timeout = 0")
Udt.where(udt_type: udt_types, published: true).find_each do |udt|
puts "Generating statistics for #{udt.id}"
UdtHourlyStatistic.upsert(
{
udt_id: udt.id,
amount: calc_amount(udt),
ckb_transactions_count: calc_ckb_transactions_count(udt),
holders_count: calc_holders_count(udt),
created_at_unixtimestamp:,
},
unique_by: %i[udt_id created_at_unixtimestamp],
)
end
start_time = to_be_counted_date(datetime)
generate_statistics(start_time)
ActiveRecord::Base.connection.execute("RESET statement_timeout")
rescue StandardError => e
Rails.logger.error "Error occurred during GenerateUdtHourlyStatistic error: #{e.message}"
end

private

def to_be_counted_date
def to_be_counted_date(datetime)
last_record = UdtHourlyStatistic.order(created_at_unixtimestamp: :desc).first
if last_record
Time.zone.at(last_record.created_at_unixtimestamp) + 1.day
else
Time.current.yesterday
datetime.is_a?(String) ? Time.zone.parse(datetime) : Time.current.yesterday
end
end

def generate_statistics(start_time)
puts "Generating udt hourly statistics for #{start_time}"
statistic_attributes = []
udt_types = %i[xudt xudt_compatible spore_cell did_cell]
Udt.where(udt_type: udt_types, published: true).find_each do |udt|
statistic_attributes << {
udt_id: udt.id,
amount: calc_amount(udt),
ckb_transactions_count: calc_ckb_transactions_count(udt),
holders_count: calc_holders_count(udt),
created_at_unixtimestamp: start_time.beginning_of_day.to_i,
}
end

if statistic_attributes.present?
UdtHourlyStatistic.upsert_all(statistic_attributes, unique_by: %i[udt_id created_at_unixtimestamp])
end
end

def calc_amount(udt)
inputs_amount = 0
outputs_amount = 0
ckb_transaction_ids = udt.ckb_transactions.map(&:id)
ckb_transaction_ids.each_slice(1000) do |ids|
inputs_amount += CellOutput.where(consumed_by_id: ids).sum(:udt_amount)
outputs_amount += CellOutput.where(ckb_transaction_id: ids).sum(:udt_amount)
ckb_transaction_ids.each_slice(5000) do |ids|
batch_inputs_amount = CellOutput.select(:udt_amount).where(consumed_by_id: ids).map(&:udt_amount).compact
inputs_amount += batch_inputs_amount.sum
batch_outputs_amount = CellOutput.select(:udt_amount).where(ckb_transaction_id: ids).map(&:udt_amount).compact
outputs_amount += batch_outputs_amount.sum
end
[inputs_amount, outputs_amount].max
end
Expand Down
3 changes: 2 additions & 1 deletion db/migrate/20241213053309_create_rgbpp_hourly_statistics.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
class CreateRgbppHourlyStatistics < ActiveRecord::Migration[7.0]
def change
create_table :rgbpp_hourly_statistics do |t|
t.integer :total_count, default: 0
t.integer :xudt_count, default: 0
t.integer :dob_count, default: 0
t.integer :created_at_unixtimestamp
t.timestamps
end
Expand Down
3 changes: 2 additions & 1 deletion db/structure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2350,7 +2350,8 @@ ALTER SEQUENCE public.reject_reasons_id_seq OWNED BY public.reject_reasons.id;

CREATE TABLE public.rgbpp_hourly_statistics (
id bigint NOT NULL,
total_count integer DEFAULT 0,
xudt_count integer DEFAULT 0,
dob_count integer DEFAULT 0,
created_at_unixtimestamp integer,
created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL
Expand Down

0 comments on commit 99e9702

Please sign in to comment.