@@ -9,16 +9,28 @@ class CkbTransactions < ActiveInteraction::Base
99 integer :page_size , default : CkbTransaction . default_per_page
1010
1111 def execute
12+ is_bitcoin = BitcoinUtils . valid_address? ( key )
1213 address = Explore . run! ( key :)
1314 raise AddressNotFoundError if address . is_a? ( NullAddress )
1415
1516 address_id = address . map ( &:id )
1617 account_books = AccountBook . tx_committed . where ( address_id :) .
17- order ( "block_number desc, tx_index desc" ) .
18+ order ( account_books_ordering ) .
1819 select ( :ckb_transaction_id , :block_number , :tx_index ) .
19- distinct .
20- limit ( Settings . query_default_limit )
21- records = CkbTransaction . includes ( :account_books ) . where ( id : account_books . map ( &:ckb_transaction_id ) ) . select ( select_fields ) . order ( transactions_ordering ) . page ( page ) . per ( page_size )
20+ distinct . page ( page ) . per ( page_size )
21+
22+ includes = { :cell_inputs => [ :previous_cell_output ] , :outputs => { } , :bitcoin_annotation => [ ] }
23+ includes [ :bitcoin_transfers ] = { } if is_bitcoin
24+
25+ records = CkbTransaction . where ( id : account_books . map ( &:ckb_transaction_id ) )
26+ . includes ( includes )
27+ # .select(select_fields + ["COUNT(cell_inputs.id) AS cell_inputs_count", "COUNT(cell_outputs.id) AS cell_outputs_count"])
28+ . select ( select_fields )
29+ # .joins("LEFT JOIN cell_inputs ON cell_inputs.ckb_transaction_id = ckb_transactions.id")
30+ # .joins("LEFT JOIN cell_outputs ON cell_outputs.ckb_transaction_id = ckb_transactions.id")
31+ # .group(select_fields.join(','))
32+ . order ( transactions_ordering )
33+
2234 options = paginate_options ( records , address_id )
2335 options . merge! ( params : { previews : true , address_id : } )
2436
@@ -28,8 +40,15 @@ def execute
2840
2941 private
3042
43+ def account_books_ordering
44+ _ , sort_order = sort . split ( "." , 2 )
45+ sort_order = "asc" unless sort_order &.match? ( /^(asc|desc)$/i )
46+
47+ "block_number #{ sort_order } , tx_index desc"
48+ end
49+
3150 def transactions_ordering
32- sort_by = "ckb_transactions.block_timestamp "
51+ sort_by = "ckb_transactions.block_number "
3352 _ , sort_order = sort . split ( "." , 2 )
3453 sort_order = "asc" unless sort_order &.match? ( /^(asc|desc)$/i )
3554
@@ -38,14 +57,15 @@ def transactions_ordering
3857
3958 def paginate_options ( records , address_id )
4059 total_count = Address . where ( id : address_id ) . sum ( :ckb_transactions_count )
60+ count = [ total_count , Settings . query_default_limit ] . min
4161 FastJsonapi ::PaginationMetaGenerator . new (
42- request :, records :, page :, page_size :, total_pages : records . total_pages , total_count :,
62+ request :, records :, page :, page_size :, total_pages : ( count . to_f / page_size ) . ceil , total_count :,
4363 ) . call
4464 end
4565
4666 def select_fields
47- %i[ id tx_hash tx_index block_id block_number block_timestamp
48- is_cellbase updated_at capacity_involved created_at tx_status ]
67+ %i[ ckb_transactions. id ckb_transactions. tx_hash ckb_transactions. tx_index ckb_transactions. block_id ckb_transactions. block_number ckb_transactions. block_timestamp
68+ ckb_transactions. is_cellbase ckb_transactions. updated_at ckb_transactions. capacity_involved ckb_transactions. created_at ckb_transactions. tx_status]
4969 end
5070
5171 # A lock script can correspond to multiple CKB addresses
0 commit comments