Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,6 @@ object DBInitializer extends StrictLogging {
logger.info("Create Indexes")
run(for {
_ <- BlockHeaderSchema.createBlockHeadersIndexes()
_ <- TransactionSchema.createMainChainIndex()
_ <- InputSchema.createMainChainIndex()
_ <- OutputSchema.createMainChainIndex()
_ <- TransactionPerAddressSchema.createIndexes()
_ <- OutputSchema.createNonSpentIndex()
_ <- InputSchema.createOutputRefAddressNullIndex()
Expand Down
117 changes: 115 additions & 2 deletions app/src/main/scala/org/alephium/explorer/persistence/Migrations.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import org.alephium.util.discard
object Migrations extends StrictLogging {

// scalastyle:off magic.number
val latestVersion: MigrationVersion = MigrationVersion(11)
val latestVersion: MigrationVersion = MigrationVersion(13)

def migration1(implicit ec: ExecutionContext): DBActionAll[Unit] = {
// We retrigger the download of fungible and non-fungible tokens' metadata that have sub-category
Expand Down Expand Up @@ -222,6 +222,117 @@ object Migrations extends StrictLogging {
""".map(_ => ())
}

private val unusedIndexes: ArraySeq[String] =
ArraySeq(
"utransactions_last_seen_idx",
"token_info_category_idx",
"contracts_std_interface_id_guessed_idx",
"contracts_category_idx",
"transactions_history_interval_type_idx",
"token_tx_per_address_token_idx",
"token_outputs_token_idx",
"token_outputs_spent_timestamp_idx",
"token_tx_per_addresses_timestamp_idx",
"transaction_per_token_hash_idx",
"token_tx_per_addresses_block_timestamp_tx_order_idx",
"token_tx_per_address_hash_idx",
"token_tx_per_address_groupless_idx",
"inputs_main_chain_idx",
"block_headers_main_chain_idx",
"outputs_main_chain_idx",
"transaction_per_addresses_main_chain_idx",
"transactions_main_chain_idx",
"txs_chain_to_idx",
"txs_chain_from_idx",
"txs_per_address_tx_hash_idx"
)

private def dropUnusedIndex(indexName: String)(implicit
ec: ExecutionContext
): DBActionAll[Unit] =
sqlu"DROP INDEX IF EXISTS public.#$indexName".map(_ => ())

def migration12(implicit ec: ExecutionContext): DBActionAll[Unit] =
DBIOAction
.sequence(unusedIndexes.map(indexName => dropUnusedIndex(indexName)))
.map(_ => ())

// scalastyle:off method.length
def migration13(implicit ec: ExecutionContext): DBActionAll[Unit] =
sqlu"""
CREATE INDEX IF NOT EXISTS utransactions_last_seen_idx
ON utransactions (last_seen);

CREATE INDEX IF NOT EXISTS token_info_category_idx
ON token_info (category);

CREATE INDEX IF NOT EXISTS contracts_std_interface_id_guessed_idx
ON contracts (std_interface_id_guessed);

CREATE INDEX IF NOT EXISTS contracts_category_idx
ON contracts (category);

CREATE INDEX IF NOT EXISTS transactions_history_interval_type_idx
ON transactions_history (interval_type);

CREATE INDEX IF NOT EXISTS token_tx_per_address_token_idx
ON token_tx_per_addresses (token);

CREATE INDEX IF NOT EXISTS token_outputs_token_idx
ON token_outputs (token);

CREATE INDEX IF NOT EXISTS token_outputs_spent_timestamp_idx
ON token_outputs (spent_timestamp);

CREATE INDEX IF NOT EXISTS token_tx_per_addresses_timestamp_idx
ON token_tx_per_addresses (block_timestamp DESC);

CREATE INDEX IF NOT EXISTS transaction_per_token_hash_idx
ON transaction_per_token (tx_hash);

CREATE INDEX IF NOT EXISTS token_tx_per_addresses_block_timestamp_tx_order_idx
ON token_tx_per_addresses (block_timestamp DESC, tx_order ASC);

CREATE INDEX IF NOT EXISTS token_tx_per_address_hash_idx
ON token_tx_per_addresses (tx_hash);

CREATE INDEX IF NOT EXISTS token_tx_per_address_groupless_idx
ON token_tx_per_addresses (
token, address, groupless_address, block_timestamp, tx_order, tx_hash, block_hash
)
WHERE groupless_address IS NOT NULL AND main_chain = true;

CREATE INDEX IF NOT EXISTS inputs_main_chain_idx
ON inputs (main_chain)
WHERE main_chain = true;

CREATE INDEX IF NOT EXISTS block_headers_main_chain_idx
ON block_headers (main_chain)
WHERE main_chain = true;

CREATE INDEX IF NOT EXISTS outputs_main_chain_idx
ON outputs (main_chain)
WHERE main_chain = true;

CREATE INDEX IF NOT EXISTS transaction_per_addresses_main_chain_idx
ON transaction_per_addresses (main_chain)
WHERE main_chain = true;

CREATE INDEX IF NOT EXISTS transactions_main_chain_idx
ON transactions (main_chain)
WHERE main_chain = true;

CREATE INDEX IF NOT EXISTS txs_chain_to_idx
ON transactions (chain_to);

CREATE INDEX IF NOT EXISTS txs_chain_from_idx
ON transactions (chain_from);

CREATE INDEX IF NOT EXISTS txs_per_address_tx_hash_idx
ON transaction_per_addresses (tx_hash);
""".map(_ => ())
// scalastyle:on method.length

private def migrations(implicit
explorerConfig: ExplorerConfig,
ec: ExecutionContext
Expand All @@ -236,7 +347,9 @@ object Migrations extends StrictLogging {
migration8,
migration9,
migration10,
migration11
migration11,
migration12,
migration13
)

def backgroundCoinbaseMigration()(implicit
Expand Down
Loading