From ba37a68a3a5715a98d209e263f612dcd6412c621 Mon Sep 17 00:00:00 2001 From: cybnon Date: Thu, 1 Dec 2022 09:44:41 +0100 Subject: [PATCH] Fix more tests Signed-off-by: cybnon --- planetmint/backend/query.py | 13 +++++++++++++ planetmint/backend/tarantool/query.py | 18 +++++++++++++++++- planetmint/fastquery.py | 2 +- planetmint/lib.py | 9 ++++----- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/planetmint/backend/query.py b/planetmint/backend/query.py index 0af2057..b1ce577 100644 --- a/planetmint/backend/query.py +++ b/planetmint/backend/query.py @@ -100,6 +100,19 @@ def get_asset(connection, asset_id) -> Asset: raise NotImplementedError +@singledispatch +def get_assets_by_tx_id(connection, tx_id: str) -> list[Asset]: + """Get assets by transaction id. + + Args: + tx_id (str): the id of the transaction. + + Returns: + The result of the operation. + """ + + raise NotImplementedError + @singledispatch def get_spent(connection, transaction_id, condition_id): diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 6416b36..08eac29 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -33,7 +33,7 @@ def _group_transaction_by_ids(connection, txids: list): _txinputs = get_inputs_by_tx_id(connection, txid) _txoutputs = get_outputs_by_tx_id(connection, txid) _txkeys = get_keys_by_tx_id(connection, txid) - _txassets = get_assets(connection, [txid]) + _txassets = get_assets_by_tx_id(connection, txid) _txmeta = get_metadata_by_tx_id(connection, txid) _txscript = get_script_by_tx_id(connection, txid) @@ -243,12 +243,28 @@ def get_assets(connection, assets_ids: list) -> list[Asset]: _returned_data = [] for _id in list(set(assets_ids)): res = connection.run(connection.space(TARANT_TABLE_ASSETS).select(_id, index=TARANT_TX_ID_SEARCH)) + if len(res) is 0: + continue _returned_data.append(res[0]) sorted_assets = sorted(_returned_data, key=lambda k: k[1], reverse=False) return [Asset.from_tuple(asset) for asset in sorted_assets] +@register_query(TarantoolDBConnection) +def get_assets_by_tx_id(connection, tx_id: str) -> list[Asset]: + res = connection.run(connection.space(TARANT_TABLE_ASSETS).select(tx_id, index=TARANT_TX_ID_SEARCH)) + if len(res) > 1: + return _from_tuple_list_to_asset_list(res) + + sorted_assets = sorted(res, key=lambda k: k[1], reverse=False) + return _from_tuple_list_to_asset_list(sorted_assets) + + +def _from_tuple_list_to_asset_list(_data: list) -> list[Asset]: + return [Asset.from_tuple(asset) for asset in _data] + + @register_query(TarantoolDBConnection) def get_spent(connection, fullfil_transaction_id: str, fullfil_output_index: str): _inputs = connection.run( diff --git a/planetmint/fastquery.py b/planetmint/fastquery.py index 7832a5c..dae6dd8 100644 --- a/planetmint/fastquery.py +++ b/planetmint/fastquery.py @@ -18,7 +18,7 @@ class FastQuery: """Get outputs for a public key""" txs = list(query.get_owned_ids(self.connection, public_key)) return [ - TransactionLink(tx["id"], index) + TransactionLink(tx["transactions"].id, index) for tx in txs for index, output in enumerate(tx["outputs"]) if condition_details_has_owner(output["condition"]["details"], public_key) diff --git a/planetmint/lib.py b/planetmint/lib.py index 91d63ec..7b19b69 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -262,7 +262,6 @@ class Planetmint(object): def get_spent(self, txid, output, current_transactions=[]): transactions = backend.query.get_spent(self.connection, txid, output) - transactions = list(transactions) if transactions else [] if len(transactions) > 1: raise core_exceptions.CriticalDoubleSpend( "`{}` was spent more than once. There is a problem" " with the chain".format(txid) @@ -278,10 +277,10 @@ class Planetmint(object): if len(transactions) + len(current_spent_transactions) > 1: raise DoubleSpend('tx "{}" spends inputs twice'.format(txid)) elif transactions: - transaction = backend.query.get_transaction(self.connection, transactions[0]["id"]) - assets = backend.query.get_assets(self.connection, [transaction["id"]]) - transaction["assets"] = [asset.data for asset in assets] - transaction = Transaction.from_dict(transaction, False) + tx_id = transactions[0]["transactions"].id + tx = backend.query.get_transaction(self.connection, tx_id) + assets = backend.query.get_assets_by_tx_id(self.connection, tx_id) + transaction = {"transactions": tx} | {"assets": [asset.data for asset in assets]} elif current_spent_transactions: transaction = current_spent_transactions[0]