From 12273709fc88e3e88ddc47570db42c8fa0087a67 Mon Sep 17 00:00:00 2001 From: Neylix Date: Tue, 2 Jan 2024 16:42:12 +0100 Subject: [PATCH] Rename DB paging_state to paging_address --- lib/archethic/db.ex | 2 +- lib/archethic/db/embedded_impl.ex | 2 +- .../db/embedded_impl/chain_reader.ex | 56 +++++++++---------- .../p2p/message/get_transaction_chain.ex | 6 +- lib/archethic/p2p/message/transaction_list.ex | 16 ++++-- lib/archethic/transaction_chain.ex | 6 +- .../archethic/bootstrap/network_init_test.exs | 8 +-- test/archethic/db/embedded_impl_test.exs | 24 ++++---- test/archethic/transaction_chain_test.exs | 9 ++- 9 files changed, 68 insertions(+), 61 deletions(-) diff --git a/lib/archethic/db.ex b/lib/archethic/db.ex index caa0329f2f..7e95eaa3a3 100644 --- a/lib/archethic/db.ex +++ b/lib/archethic/db.ex @@ -30,7 +30,7 @@ defmodule Archethic.DB do binary(), fields :: list(), opts :: [ - paging_state: nil | binary(), + paging_address: nil | binary(), after: DateTime.t(), order: :asc | :desc ] diff --git a/lib/archethic/db/embedded_impl.ex b/lib/archethic/db/embedded_impl.ex index fde9ad861c..aef23bc2ea 100644 --- a/lib/archethic/db/embedded_impl.ex +++ b/lib/archethic/db/embedded_impl.ex @@ -167,7 +167,7 @@ defmodule Archethic.DB.EmbeddedImpl do """ @spec get_transaction_chain(address :: binary(), fields :: list(), opts :: list()) :: {transactions_by_page :: list(Transaction.t()), more? :: boolean(), - paging_state :: nil | binary()} + paging_address :: nil | binary()} def get_transaction_chain(address, fields \\ [], opts \\ []) when is_binary(address) and is_list(fields) and is_list(opts) do ChainReader.get_transaction_chain(address, fields, opts, db_path()) diff --git a/lib/archethic/db/embedded_impl/chain_reader.ex b/lib/archethic/db/embedded_impl/chain_reader.ex index 5ec3f88fb0..33646a35f9 100644 --- a/lib/archethic/db/embedded_impl/chain_reader.ex +++ b/lib/archethic/db/embedded_impl/chain_reader.ex @@ -114,7 +114,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do By default, order is chronological (ASC) Opts: - paging_state :: binary() + paging_address :: binary() order :: :asc | :desc """ @spec get_transaction_chain( @@ -124,7 +124,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do db_path :: String.t() ) :: {transactions_by_page :: list(Transaction.t()), more? :: boolean(), - paging_state :: nil | binary()} + paging_address :: nil | binary()} def get_transaction_chain(address, fields, opts, db_path) do start = System.monotonic_time() @@ -134,7 +134,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do if File.exists?(filepath) do fd = File.open!(filepath, [:binary, :read]) - {transactions, more?, paging_state} = + {transactions, more?, paging_address} = case Keyword.get(opts, :order, :asc) do :asc -> process_get_chain(fd, fields, opts, db_path) @@ -154,7 +154,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do end }) - {transactions, more?, paging_state} + {transactions, more?, paging_address} else {[], false, nil} end @@ -176,12 +176,12 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do Stream.resource( fn -> process_get_chain(fd, fields, [], db_path) end, fn - {transactions, true, paging_state} -> + {transactions, true, paging_address} -> next_transactions = process_get_chain( fd, fields, - [paging_state: paging_state], + [paging_address: paging_address], db_path ) @@ -272,7 +272,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do defp process_get_chain(fd, fields, opts, db_path) do # Set the file cursor position to the paging state - case Keyword.get(opts, :paging_state) do + case Keyword.get(opts, :paging_address) do nil -> :file.position(fd, 0) do_process_get_chain(fd, fields) @@ -310,21 +310,21 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do end # Read the transactions until the nb of transactions to fullfil the page (ie. 10 transactions) - {transactions, more?, paging_state} = get_paginated_chain(fd, column_names) + {transactions, more?, paging_address} = get_paginated_chain(fd, column_names) - {transactions, more?, paging_state} + {transactions, more?, paging_address} end # in order to read the file sequentially in DESC (faster than random access) - # we have to determine the correct paging_state and limit_address + # we have to determine the correct paging_address and limit_address # then we can use the process_get_chain that does the ASC read defp process_get_chain_desc(fd, genesis_address, fields, opts, db_path) do all_addresses_asc = ChainIndex.list_chain_addresses(genesis_address, db_path) |> Enum.map(&elem(&1, 0)) - {nb_to_take, paging_state, more?, new_paging_state} = - case Keyword.get(opts, :paging_state) do + {nb_to_take, paging_address, more?, new_paging_address} = + case Keyword.get(opts, :paging_address) do nil -> chain_length = Enum.count(all_addresses_asc) @@ -333,36 +333,36 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do else idx = chain_length - 1 - @page_size - paging_state = all_addresses_asc |> Enum.at(idx) - new_paging_state = all_addresses_asc |> Enum.at(idx + 1) + paging_address = all_addresses_asc |> Enum.at(idx) + new_paging_address = all_addresses_asc |> Enum.at(idx + 1) - {@page_size, paging_state, true, new_paging_state} + {@page_size, paging_address, true, new_paging_address} end - paging_state -> - paging_state_idx = + paging_address -> + paging_address_idx = all_addresses_asc - |> Enum.find_index(&(&1 == paging_state)) + |> Enum.find_index(&(&1 == paging_address)) - if paging_state_idx <= @page_size do - {paging_state_idx, nil, false, nil} + if paging_address_idx <= @page_size do + {paging_address_idx, nil, false, nil} else - idx = paging_state_idx - 1 - @page_size + idx = paging_address_idx - 1 - @page_size - paging_state = all_addresses_asc |> Enum.at(idx) - new_paging_state = all_addresses_asc |> Enum.at(idx + 1) + paging_address = all_addresses_asc |> Enum.at(idx) + new_paging_address = all_addresses_asc |> Enum.at(idx + 1) - {@page_size, paging_state, true, new_paging_state} + {@page_size, paging_address, true, new_paging_address} end end - # call the ASC function and ignore the more? and paging_state - {transactions, _more?, _paging_state} = - process_get_chain(fd, fields, [paging_state: paging_state], db_path) + # call the ASC function and ignore the more? and paging_address + {transactions, _more?, _paging_address} = + process_get_chain(fd, fields, [paging_address: paging_address], db_path) transactions = Enum.take(transactions, nb_to_take) - {Enum.reverse(transactions), more?, new_paging_state} + {Enum.reverse(transactions), more?, new_paging_address} end defp get_paginated_chain(fd, fields, acc \\ []) do diff --git a/lib/archethic/p2p/message/get_transaction_chain.ex b/lib/archethic/p2p/message/get_transaction_chain.ex index ea7741df6c..64fe8fa8ad 100644 --- a/lib/archethic/p2p/message/get_transaction_chain.ex +++ b/lib/archethic/p2p/message/get_transaction_chain.ex @@ -20,10 +20,10 @@ defmodule Archethic.P2P.Message.GetTransactionChain do # paging_state received contains binary offset for next page, to be used for query @spec process(__MODULE__.t(), Crypto.key()) :: TransactionList.t() def process(%__MODULE__{address: tx_address, paging_state: paging_state, order: order}, _) do - {chain, more?, paging_state} = + {chain, more?, paging_address} = case TransactionChain.resolve_paging_state(tx_address, paging_state, order) do {:ok, paging_address} -> - DB.get_transaction_chain(tx_address, [], paging_state: paging_address, order: order) + DB.get_transaction_chain(tx_address, [], paging_address: paging_address, order: order) {:error, _} -> {[], false, nil} @@ -31,7 +31,7 @@ defmodule Archethic.P2P.Message.GetTransactionChain do # empty list for fields/cols to be processed # new_page_state contains binary offset for the next page - %TransactionList{transactions: chain, paging_state: paging_state, more?: more?} + %TransactionList{transactions: chain, paging_address: paging_address, more?: more?} end @spec serialize(t()) :: bitstring() diff --git a/lib/archethic/p2p/message/transaction_list.ex b/lib/archethic/p2p/message/transaction_list.ex index 3f8f716e6f..0e0928cb41 100644 --- a/lib/archethic/p2p/message/transaction_list.ex +++ b/lib/archethic/p2p/message/transaction_list.ex @@ -2,14 +2,14 @@ defmodule Archethic.P2P.Message.TransactionList do @moduledoc """ Represents a message with a list of transactions """ - defstruct transactions: [], more?: false, paging_state: nil + defstruct transactions: [], more?: false, paging_address: nil alias Archethic.TransactionChain.Transaction alias Archethic.Utils.VarInt @type t :: %__MODULE__{ transactions: list(Transaction.t()), - paging_state: nil | binary(), + paging_address: nil | binary(), more?: boolean() } @@ -26,7 +26,11 @@ defmodule Archethic.P2P.Message.TransactionList do <> end - def serialize(%__MODULE__{transactions: transactions, more?: true, paging_state: paging_state}) do + def serialize(%__MODULE__{ + transactions: transactions, + more?: true, + paging_address: paging_address + }) do transaction_bin = transactions |> Stream.map(&Transaction.serialize/1) @@ -36,7 +40,7 @@ defmodule Archethic.P2P.Message.TransactionList do encoded_transactions_length = Enum.count(transactions) |> VarInt.from_value() <> + byte_size(paging_address)::8, paging_address::binary>> end @spec deserialize(bitstring()) :: {t(), bitstring} @@ -51,10 +55,10 @@ defmodule Archethic.P2P.Message.TransactionList do rest } - <<1::1, paging_state_size::8, paging_state::binary-size(paging_state_size), + <<1::1, paging_address_size::8, paging_address::binary-size(paging_address_size), rest::bitstring>> -> { - %__MODULE__{transactions: transactions, more?: true, paging_state: paging_state}, + %__MODULE__{transactions: transactions, more?: true, paging_address: paging_address}, rest } end diff --git a/lib/archethic/transaction_chain.ex b/lib/archethic/transaction_chain.ex index bdfa4a7a3c..f81f803225 100644 --- a/lib/archethic/transaction_chain.ex +++ b/lib/archethic/transaction_chain.ex @@ -427,7 +427,7 @@ defmodule Archethic.TransactionChain do # More to fetch from DB using paging address {transactions, more?, next_paging_address} = DB.get_transaction_chain(paging_address, [], - paging_state: paging_address, + paging_address: paging_address, order: order ) @@ -475,7 +475,7 @@ defmodule Archethic.TransactionChain do # More to fetch from DB using paging address {transactions, more?, next_paging_address} = DB.get_transaction_chain(paging_address, [], - paging_state: paging_address, + paging_address: paging_address, order: order ) @@ -538,7 +538,7 @@ defmodule Archethic.TransactionChain do %TransactionList{ transactions: transactions, more?: more?, - paging_state: next_paging_address + paging_address: next_paging_address }} -> {transactions, more?, next_paging_address} diff --git a/test/archethic/bootstrap/network_init_test.exs b/test/archethic/bootstrap/network_init_test.exs index d4becfaeb4..5589deb7a2 100644 --- a/test/archethic/bootstrap/network_init_test.exs +++ b/test/archethic/bootstrap/network_init_test.exs @@ -264,7 +264,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do {:ok, %NotFound{}} _, %GetTransactionChain{}, _ -> - {:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}} + {:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}} _, %GetTransactionInputs{}, _ -> {:ok, %TransactionInputList{inputs: []}} @@ -319,7 +319,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do {:ok, %NotFound{}} _, %GetTransactionChain{}, _ -> - {:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}} + {:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}} _, %GetTransactionInputs{}, _ -> {:ok, %TransactionInputList{inputs: []}} @@ -367,7 +367,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do {:ok, %NotFound{}} _, %GetTransactionChain{}, _ -> - {:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}} + {:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}} _, %GetTransactionInputs{}, _ -> {:ok, %TransactionInputList{inputs: []}} @@ -414,7 +414,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do {:ok, %NotFound{}} _, %GetTransactionChain{}, _ -> - {:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}} + {:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}} _, %GetTransactionInputs{}, _ -> {:ok, %TransactionInputList{inputs: []}} diff --git a/test/archethic/db/embedded_impl_test.exs b/test/archethic/db/embedded_impl_test.exs index 8580ce0261..35a5d66043 100644 --- a/test/archethic/db/embedded_impl_test.exs +++ b/test/archethic/db/embedded_impl_test.exs @@ -305,16 +305,16 @@ defmodule Archethic.DB.EmbeddedTest do tx end) - {page, true, paging_state} = + {page, true, paging_address} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address) assert length(page) == 10 assert page == Enum.take(transactions, 10) - assert paging_state == List.last(page).address + assert paging_address == List.last(page).address {page2, false, nil} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], - paging_state: paging_state + paging_address: paging_address ) assert length(page2) == 10 @@ -335,16 +335,16 @@ defmodule Archethic.DB.EmbeddedTest do tx end) - {page, true, paging_state} = + {page, true, paging_address} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address) assert length(page) == 10 assert page == Enum.take(transactions, 10) - assert paging_state == List.last(page).address + assert paging_address == List.last(page).address assert {[], false, nil} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], - paging_state: :crypto.strong_rand_bytes(32) + paging_address: :crypto.strong_rand_bytes(32) ) end end @@ -392,24 +392,24 @@ defmodule Archethic.DB.EmbeddedTest do tx end) - {page1, true, paging_state1} = + {page1, true, paging_address1} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], order: :desc) assert length(page1) == 10 - assert paging_state1 == List.last(page1).address + assert paging_address1 == List.last(page1).address - {page2, true, paging_state2} = + {page2, true, paging_address2} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], - paging_state: paging_state1, + paging_address: paging_address1, order: :desc ) assert length(page2) == 10 - assert paging_state2 == List.last(page2).address + assert paging_address2 == List.last(page2).address {page3, false, nil} = EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], - paging_state: paging_state2, + paging_address: paging_address2, order: :desc ) diff --git a/test/archethic/transaction_chain_test.exs b/test/archethic/transaction_chain_test.exs index ae83cc41b6..d28682df11 100644 --- a/test/archethic/transaction_chain_test.exs +++ b/test/archethic/transaction_chain_test.exs @@ -402,9 +402,12 @@ defmodule Archethic.TransactionChainTest do |> expect(:get_genesis_address, fn ^address3 -> genesis_address end) |> expect(:list_chain_addresses, fn ^genesis_address -> chain_addresses end) |> expect(:transaction_exists?, fn ^address1, _ -> true end) - |> expect(:get_transaction_chain, fn ^address1, _, [paging_state: ^address1, order: :asc] -> - {[%Transaction{address: address2}, %Transaction{address: address3}], false, nil} - end) + |> expect( + :get_transaction_chain, + fn ^address1, _, [paging_address: ^address1, order: :asc] -> + {[%Transaction{address: address2}, %Transaction{address: address3}], false, nil} + end + ) assert [^address2, ^address3] = TransactionChain.fetch(address3, nodes, paging_state: date2)