Merge pull request #157 from andreitricolici/planetmint-tarantool

Implementing assets and metadata preparation.
This commit is contained in:
Lorenz Herzberger 2022-06-23 15:29:56 +02:00 committed by GitHub
commit 14601b0f25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 97 additions and 14 deletions

View File

@ -12,5 +12,5 @@ configuration or the ``PLANETMINT_DATABASE_BACKEND`` environment variable.
""" """
# Include the backend interfaces # 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 from planetmint.backend.connection import connect, Connection

View File

@ -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

View File

@ -22,7 +22,7 @@ generic backend interfaces to the implementations in this module.
""" """
# Register the single dispatched modules on import. # 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 # MongoDBConnection should always be accessed via
# ``planetmint.backend.connect()``. # ``planetmint.backend.connect()``.

View File

@ -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}

View File

@ -1,5 +1,5 @@
# Register the single dispatched modules on import. # 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 # MongoDBConnection should always be accessed via
# ``planetmint.backend.connect()``. # ``planetmint.backend.connect()``.

View File

@ -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}

View File

@ -22,6 +22,7 @@ except ImportError:
import requests import requests
import planetmint import planetmint
from copy import deepcopy
from planetmint.config import Config from planetmint.config import Config
from planetmint import backend, config_utils, fastquery from planetmint import backend, config_utils, fastquery
from planetmint.models import Transaction from planetmint.models import Transaction
@ -128,23 +129,29 @@ class Planetmint(object):
txns = [] txns = []
assets = [] assets = []
txn_metadatas = [] txn_metadatas = []
for t in transactions: for t in transactions:
transaction = t.tx_dict if t.tx_dict else rapidjson.loads(rapidjson.dumps(t.to_dict())) transaction = t.tx_dict if t.tx_dict else rapidjson.loads(rapidjson.dumps(t.to_dict()))
asset = transaction.pop('asset') 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') 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) txns.append(transaction)
backend.query.store_metadatas(self.connection, txn_metadatas) backend.query.store_metadatas(self.connection, txn_metadatas)
if assets:
backend.query.store_assets(self.connection, assets) backend.query.store_assets(self.connection, assets)
return backend.query.store_transactions(self.connection, txns) return backend.query.store_transactions(self.connection, txns)
@ -511,5 +518,4 @@ class Planetmint(object):
return backend.query.delete_elections(self.connection, height) return backend.query.delete_elections(self.connection, height)
Block = namedtuple('Block', ('app_hash', 'height', 'transactions')) Block = namedtuple('Block', ('app_hash', 'height', 'transactions'))