Skip to content

Commit

Permalink
fix(db)!: use address for unlock condition indexes (#1189)
Browse files Browse the repository at this point in the history
* Fix address unlock condition indexes

* Add migration

* Condense indexes with owning address

* Update chronicle version to match migration
  • Loading branch information
DaughterOfMars committed Mar 15, 2023
1 parent 5c4733f commit d4fc220
Show file tree
Hide file tree
Showing 10 changed files with 71 additions and 72 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "chronicle"
version = "1.0.0-beta.36"
version = "1.0.0-beta.37"
authors = ["IOTA Stiftung"]
edition = "2021"
description = "IOTA permanode implemented as an IOTA Node Extension (INX)."
Expand Down
38 changes: 38 additions & 0 deletions src/bin/inx-chronicle/migrations/migrate_1.rs
@@ -0,0 +1,38 @@
// Copyright 2023 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

use async_trait::async_trait;
use chronicle::db::{mongodb::collections::OutputCollection, MongoDb, MongoDbCollectionExt};

use super::Migration;

pub struct Migrate;

#[async_trait]
impl Migration for Migrate {
const ID: usize = 1;
const APP_VERSION: &'static str = "1.0.0-beta.37";
const DATE: time::Date = time::macros::date!(2023 - 03 - 14);

async fn migrate(db: &MongoDb) -> eyre::Result<()> {
let collection = db.collection::<OutputCollection>();

collection.drop_index("output_address_unlock_index", None).await?;
collection
.drop_index("output_storage_deposit_return_unlock_index", None)
.await?;
collection.drop_index("output_timelock_unlock_index", None).await?;
collection.drop_index("output_expiration_unlock_index", None).await?;
collection
.drop_index("output_state_controller_unlock_index", None)
.await?;
collection
.drop_index("output_governor_address_unlock_index", None)
.await?;
collection
.drop_index("output_immutable_alias_address_unlock_index", None)
.await?;

Ok(())
}
}
4 changes: 3 additions & 1 deletion src/bin/inx-chronicle/migrations/mod.rs
Expand Up @@ -11,14 +11,16 @@ use chronicle::db::{
use eyre::bail;

pub mod migrate_0;
pub mod migrate_1;

pub type LatestMigration = migrate_0::Migrate;
pub type LatestMigration = migrate_1::Migrate;

/// The list of migrations, in order.
const MIGRATIONS: &[&'static dyn DynMigration] = &[
// In order to add a new migration, change the `LatestMigration` type above and add an entry at the bottom of this
// list.
&migrate_0::Migrate,
&migrate_1::Migrate,
];

fn build_migrations(migrations: &[&'static dyn DynMigration]) -> HashMap<Option<usize>, &'static dyn DynMigration> {
Expand Down
11 changes: 6 additions & 5 deletions src/db/mongodb/collections/outputs/indexer/alias.rs
Expand Up @@ -4,10 +4,11 @@
use mongodb::bson::{self, doc};
use primitive_types::U256;

use super::queries::{
AppendQuery, CreatedQuery, GovernorQuery, IssuerQuery, NativeTokensQuery, SenderQuery, StateControllerQuery,
use super::queries::{AppendQuery, CreatedQuery, GovernorQuery, IssuerQuery, NativeTokensQuery, SenderQuery};
use crate::{
db::mongodb::collections::outputs::indexer::queries::AddressQuery,
model::{tangle::MilestoneTimestamp, utxo::Address},
};
use crate::model::{tangle::MilestoneTimestamp, utxo::Address};

#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[allow(missing_docs)]
Expand All @@ -27,7 +28,7 @@ impl From<AliasOutputsQuery> for bson::Document {
fn from(query: AliasOutputsQuery) -> Self {
let mut queries = Vec::new();
queries.push(doc! { "output.kind": "alias" });
queries.append_query(StateControllerQuery(query.state_controller));
queries.append_query(AddressQuery(query.state_controller));
queries.append_query(GovernorQuery(query.governor));
queries.append_query(IssuerQuery(query.issuer));
queries.append_query(SenderQuery(query.sender));
Expand Down Expand Up @@ -69,7 +70,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "alias" },
{ "output.state_controller_address_unlock_condition.address": address },
{ "details.address": address },
{ "output.governor_address_unlock_condition.address": address },
{ "output.features": {
"$elemMatch": {
Expand Down
4 changes: 2 additions & 2 deletions src/db/mongodb/collections/outputs/indexer/basic.rs
Expand Up @@ -103,7 +103,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "basic" },
{ "output.address_unlock_condition.address": address },
{ "details.address": address },
{ "output.native_tokens": { "$ne": [] } },
{ "output.native_tokens": { "$not": {
"$elemMatch": {
Expand Down Expand Up @@ -164,7 +164,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "basic" },
{ "output.address_unlock_condition.address": address },
{ "details.address": address },
{ "output.native_tokens": { "$eq": [] } },
{ "output.storage_deposit_return_unlock_condition": { "$exists": false } },
{ "output.storage_deposit_return_unlock_condition.return_address": address },
Expand Down
6 changes: 3 additions & 3 deletions src/db/mongodb/collections/outputs/indexer/foundry.rs
Expand Up @@ -4,7 +4,7 @@
use mongodb::bson::{self, doc};
use primitive_types::U256;

use super::queries::{AppendQuery, CreatedQuery, ImmutableAliasAddressQuery, NativeTokensQuery};
use super::queries::{AddressQuery, AppendQuery, CreatedQuery, NativeTokensQuery};
use crate::model::{tangle::MilestoneTimestamp, utxo::Address};

#[derive(Clone, Debug, Default, PartialEq, Eq)]
Expand All @@ -22,7 +22,7 @@ impl From<FoundryOutputsQuery> for bson::Document {
fn from(query: FoundryOutputsQuery) -> Self {
let mut queries = Vec::new();
queries.push(doc! { "output.kind": "foundry" });
queries.append_query(ImmutableAliasAddressQuery(query.alias_address));
queries.append_query(AddressQuery(query.alias_address));
queries.append_query(NativeTokensQuery {
has_native_tokens: query.has_native_tokens,
min_native_token_count: query.min_native_token_count,
Expand Down Expand Up @@ -58,7 +58,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "foundry" },
{ "output.immutable_alias_address_unlock_condition.address": address },
{ "details.address": address },
{ "output.native_tokens": { "$ne": [] } },
{ "output.native_tokens": { "$not": {
"$elemMatch": {
Expand Down
44 changes: 14 additions & 30 deletions src/db/mongodb/collections/outputs/indexer/mod.rs
Expand Up @@ -207,12 +207,12 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.address_unlock_condition": 1 })
.keys(doc! { "details.address": 1 })
.options(
IndexOptions::builder()
.name("output_address_unlock_index".to_string())
.name("output_owning_address_index".to_string())
.partial_filter_expression(doc! {
"output.address_unlock_condition": { "$exists": true },
"details.address": { "$exists": true },
})
.build(),
)
Expand All @@ -223,10 +223,10 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.storage_deposit_return_unlock_condition": 1 })
.keys(doc! { "output.storage_deposit_return_unlock_condition.return_address": 1 })
.options(
IndexOptions::builder()
.name("output_storage_deposit_return_unlock_index".to_string())
.name("output_storage_deposit_return_unlock_return_address_index".to_string())
.partial_filter_expression(doc! {
"output.storage_deposit_return_unlock_condition": { "$exists": true },
})
Expand All @@ -239,10 +239,10 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.timelock_unlock_condition": 1 })
.keys(doc! { "output.timelock_unlock_condition.timestamp": 1 })
.options(
IndexOptions::builder()
.name("output_timelock_unlock_index".to_string())
.name("output_timelock_unlock_timestamp_index".to_string())
.partial_filter_expression(doc! {
"output.timelock_unlock_condition": { "$exists": true },
})
Expand All @@ -255,10 +255,10 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.expiration_unlock_condition": 1 })
.keys(doc! { "output.expiration_unlock_condition.return_address": 1 })
.options(
IndexOptions::builder()
.name("output_expiration_unlock_index".to_string())
.name("output_expiration_unlock_return_address_index".to_string())
.partial_filter_expression(doc! {
"output.expiration_unlock_condition": { "$exists": true },
})
Expand All @@ -271,12 +271,12 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.state_controller_address_unlock_condition": 1 })
.keys(doc! { "output.expiration_unlock_condition.timestamp": 1 })
.options(
IndexOptions::builder()
.name("output_state_controller_unlock_index".to_string())
.name("output_expiration_unlock_timestamp_index".to_string())
.partial_filter_expression(doc! {
"output.state_controller_address_unlock_condition": { "$exists": true },
"output.expiration_unlock_condition": { "$exists": true },
})
.build(),
)
Expand All @@ -287,10 +287,10 @@ impl OutputCollection {

self.create_index(
IndexModel::builder()
.keys(doc! { "output.governor_address_unlock_condition": 1 })
.keys(doc! { "output.governor_address_unlock_condition.address": 1 })
.options(
IndexOptions::builder()
.name("output_governor_address_unlock_index".to_string())
.name("output_governor_address_unlock_address_index".to_string())
.partial_filter_expression(doc! {
"output.governor_address_unlock_condition": { "$exists": true },
})
Expand All @@ -301,22 +301,6 @@ impl OutputCollection {
)
.await?;

self.create_index(
IndexModel::builder()
.keys(doc! { "output.immutable_alias_address_unlock_condition": 1 })
.options(
IndexOptions::builder()
.name("output_immutable_alias_address_unlock_index".to_string())
.partial_filter_expression(doc! {
"output.immutable_alias_address_unlock_condition": { "$exists": true },
})
.build(),
)
.build(),
None,
)
.await?;

self.create_index(
IndexModel::builder()
.keys(doc! { "output.features": 1 })
Expand Down
4 changes: 2 additions & 2 deletions src/db/mongodb/collections/outputs/indexer/nft.rs
Expand Up @@ -106,7 +106,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "nft" },
{ "output.address_unlock_condition.address": address },
{ "details.address": address },
{ "output.features": { "$elemMatch": {
"kind": "issuer",
"address": address
Expand Down Expand Up @@ -172,7 +172,7 @@ mod test {
let query_doc = doc! {
"$and": [
{ "output.kind": "nft" },
{ "output.address_unlock_condition.address": address },
{ "details.address": address },
{ "output.native_tokens": { "$eq": [] } },
{ "output.storage_deposit_return_unlock_condition": { "$exists": false } },
{ "output.storage_deposit_return_unlock_condition.return_address": address },
Expand Down
28 changes: 1 addition & 27 deletions src/db/mongodb/collections/outputs/indexer/queries.rs
Expand Up @@ -138,20 +138,7 @@ impl AppendToQuery for AddressQuery {
fn append_to(self, queries: &mut Vec<Document>) {
if let Some(address) = self.0 {
queries.push(doc! {
"output.address_unlock_condition.address": address
});
}
}
}

/// Queries for an unlock condition of type `state_controller_address`.
pub(super) struct StateControllerQuery(pub(super) Option<Address>);

impl AppendToQuery for StateControllerQuery {
fn append_to(self, queries: &mut Vec<Document>) {
if let Some(address) = self.0 {
queries.push(doc! {
"output.state_controller_address_unlock_condition.address": address
"details.address": address
});
}
}
Expand All @@ -170,19 +157,6 @@ impl AppendToQuery for GovernorQuery {
}
}

/// Queries for an unlock condition of type `immutable_alias_address`.
pub(super) struct ImmutableAliasAddressQuery(pub(super) Option<Address>);

impl AppendToQuery for ImmutableAliasAddressQuery {
fn append_to(self, queries: &mut Vec<Document>) {
if let Some(address) = self.0 {
queries.push(doc! {
"output.immutable_alias_address_unlock_condition.address": address
});
}
}
}

/// Queries for an unlock condition of type `storage_deposit_return`.
pub(super) struct StorageDepositReturnQuery {
pub(super) has_storage_return_condition: Option<bool>,
Expand Down

0 comments on commit d4fc220

Please sign in to comment.