From b1139b473e20b40ca7c7986181a8493c55433852 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:48:10 +0300 Subject: [PATCH 1/6] Added convert.py for storing interfaces --- planetmint/backend/convert.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 planetmint/backend/convert.py diff --git a/planetmint/backend/convert.py b/planetmint/backend/convert.py new file mode 100644 index 0000000..6ec074f --- /dev/null +++ b/planetmint/backend/convert.py @@ -0,0 +1,26 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +"""Convert interfaces for backends.""" + +from functools import singledispatch + + +@singledispatch +def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset): + """ + This function is used for preparing assets, + before storing them to database. + """ + raise NotImplementedError + + +@singledispatch +def prepare_metadata(connection, transaction_id, metadata): + """ + This function is used for preparing metadata, + before storing them to database. + """ + raise NotImplementedError From eaac0845d7f1399e3e88229264458a24accccc66 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:48:29 +0300 Subject: [PATCH 2/6] Added convert.py implementation for tarantool --- planetmint/backend/tarantool/convert.py | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 planetmint/backend/tarantool/convert.py diff --git a/planetmint/backend/tarantool/convert.py b/planetmint/backend/tarantool/convert.py new file mode 100644 index 0000000..b58ec87 --- /dev/null +++ b/planetmint/backend/tarantool/convert.py @@ -0,0 +1,26 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +"""Convert implementation for Tarantool""" + +from planetmint.backend.utils import module_dispatch_registrar +from planetmint.backend import convert +from planetmint.backend.tarantool.connection import TarantoolDBConnection + +register_query = module_dispatch_registrar(convert) + + +@register_query(TarantoolDBConnection) +def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset): + asset_id = transaction_id + if transaction_type != filter_operation: + asset_id = asset['id'] + return tuple([asset, transaction_id, asset_id]) + + +@register_query(TarantoolDBConnection) +def prepare_metadata(connection, transaction_id, metadata): + return {'id': transaction_id, + 'metadata': metadata} From e65a773bae726dd9057227f26bde303050a777c7 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:49:18 +0300 Subject: [PATCH 3/6] Implemented to lib.py, functions from converted.py --- planetmint/lib.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/planetmint/lib.py b/planetmint/lib.py index e4009d0..c8f1e05 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -22,6 +22,7 @@ except ImportError: import requests import planetmint +from copy import deepcopy from planetmint.config import Config from planetmint import backend, config_utils, fastquery from planetmint.models import Transaction @@ -128,24 +129,30 @@ class Planetmint(object): txns = [] assets = [] txn_metadatas = [] + for t in transactions: transaction = t.tx_dict if t.tx_dict else rapidjson.loads(rapidjson.dumps(t.to_dict())) asset = transaction.pop('asset') - asset_id = transaction['id'] - if transaction['operation'] != t.CREATE: - asset_id = asset['id'] - assets.append((asset, - transaction['id'], - asset_id)) - metadata = transaction.pop('metadata') - txn_metadatas.append({'id': transaction['id'], - 'metadata': metadata}) + + asset = backend.convert.prepare_asset(self.connection, + transaction_type=transaction["operation"], + transaction_id=transaction["id"], + filter_operation=t.CREATE, + asset=asset) + + metadata = backend.convert.prepare_metadata(self.connection, + transaction_id=transaction["id"], + metadata=metadata) + + txn_metadatas.append(metadata) + assets.append(asset) txns.append(transaction) backend.query.store_metadatas(self.connection, txn_metadatas) - backend.query.store_assets(self.connection, assets) + if assets: + backend.query.store_assets(self.connection, assets) return backend.query.store_transactions(self.connection, txns) def delete_transactions(self, txs): @@ -511,5 +518,4 @@ class Planetmint(object): return backend.query.delete_elections(self.connection, height) - Block = namedtuple('Block', ('app_hash', 'height', 'transactions')) From 88c58a1dbf22ac768d7093e9dca285025e0d955a Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:49:58 +0300 Subject: [PATCH 4/6] Added initializing for convert.py --- planetmint/backend/__init__.py | 2 +- planetmint/backend/tarantool/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/planetmint/backend/__init__.py b/planetmint/backend/__init__.py index 8b4c6af..1468dc7 100644 --- a/planetmint/backend/__init__.py +++ b/planetmint/backend/__init__.py @@ -12,5 +12,5 @@ configuration or the ``PLANETMINT_DATABASE_BACKEND`` environment variable. """ # Include the backend interfaces -from planetmint.backend import schema, query # noqa +from planetmint.backend import schema, query, convert # noqa from planetmint.backend.connection import connect, Connection diff --git a/planetmint/backend/tarantool/__init__.py b/planetmint/backend/tarantool/__init__.py index 31dfc2e..4ee14e1 100644 --- a/planetmint/backend/tarantool/__init__.py +++ b/planetmint/backend/tarantool/__init__.py @@ -1,5 +1,5 @@ # Register the single dispatched modules on import. -from planetmint.backend.tarantool import query, connection, schema # noqa +from planetmint.backend.tarantool import query, connection, schema, convert # noqa # MongoDBConnection should always be accessed via # ``planetmint.backend.connect()``. From ce296323331eea8cc7ba29b5337daa5ee0eeb1a9 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:54:27 +0300 Subject: [PATCH 5/6] init of convert.py for mongodb implementation --- planetmint/backend/localmongodb/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planetmint/backend/localmongodb/__init__.py b/planetmint/backend/localmongodb/__init__.py index a86527a..48719c7 100644 --- a/planetmint/backend/localmongodb/__init__.py +++ b/planetmint/backend/localmongodb/__init__.py @@ -22,7 +22,7 @@ generic backend interfaces to the implementations in this module. """ # Register the single dispatched modules on import. -from planetmint.backend.localmongodb import schema, query # noqa +from planetmint.backend.localmongodb import schema, query, convert # noqa # MongoDBConnection should always be accessed via # ``planetmint.backend.connect()``. From 2ed7334b909ad30115db57212824bcda2f34c4c5 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 23 Jun 2022 13:55:09 +0300 Subject: [PATCH 6/6] implemented convert.py for mongodatabase [NOT TESTED] --- planetmint/backend/localmongodb/convert.py | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 planetmint/backend/localmongodb/convert.py diff --git a/planetmint/backend/localmongodb/convert.py b/planetmint/backend/localmongodb/convert.py new file mode 100644 index 0000000..5f0e04b --- /dev/null +++ b/planetmint/backend/localmongodb/convert.py @@ -0,0 +1,25 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +"""Convert implementation for MongoDb""" + +from planetmint.backend.utils import module_dispatch_registrar +from planetmint.backend import convert +from planetmint.backend.localmongodb.connection import LocalMongoDBConnection + +register_query = module_dispatch_registrar(convert) + + +@register_query(LocalMongoDBConnection) +def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset): + if transaction_type == filter_operation: + asset['id'] = transaction_id + return asset + + +@register_query(LocalMongoDBConnection) +def prepare_metadata(connection, transaction_id, metadata): + return {'id': transaction_id, + 'metadata': metadata}