mirror of
https://github.com/planetmint/planetmint.git
synced 2025-11-24 22:45:44 +00:00
adjusted input dataclass, added queries, removed convert
Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
This commit is contained in:
parent
2694974a37
commit
caa2fc54fc
@ -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, convert # noqa
|
from planetmint.backend import schema, query # noqa
|
||||||
from planetmint.backend.connection import Connection
|
from planetmint.backend.connection import Connection
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
# 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
|
|
||||||
@ -4,6 +4,7 @@
|
|||||||
# Code is Apache-2.0 and docs are CC-BY-4.0
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
# Asset should represent a single asset (e.g.: tarantool tuple (data, tx_id, asset_id))
|
# Asset should represent a single asset (e.g.: tarantool tuple (data, tx_id, asset_id))
|
||||||
# If multiple assets are stored at once this should remain the same.
|
# If multiple assets are stored at once this should remain the same.
|
||||||
@ -11,18 +12,21 @@ from dataclasses import dataclass
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Asset:
|
class Asset:
|
||||||
id: str = None
|
id: str = ""
|
||||||
tx_id: str = None
|
tx_id: str = ""
|
||||||
data: dict = None
|
data: str = ""
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class MetaData:
|
class MetaData:
|
||||||
id: str = None
|
id: str = ""
|
||||||
metadata: str = None
|
metadata: str = ""
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Input:
|
class Input:
|
||||||
id: str = None
|
tx_id: str = ""
|
||||||
|
fulfills: Union[dict, None] = None
|
||||||
|
owners_before: list[str] = None
|
||||||
|
fulfillment: str = ""
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Output:
|
class Output:
|
||||||
|
|||||||
@ -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, convert # noqa
|
from planetmint.backend.localmongodb import schema, query # noqa
|
||||||
|
|
||||||
# MongoDBConnection should always be accessed via
|
# MongoDBConnection should always be accessed via
|
||||||
# ``planetmint.backend.connect()``.
|
# ``planetmint.backend.connect()``.
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
# 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 not in filter_operation:
|
|
||||||
asset["id"] = transaction_id
|
|
||||||
return asset
|
|
||||||
|
|
||||||
|
|
||||||
@register_query(LocalMongoDBConnection)
|
|
||||||
def prepare_metadata(connection, transaction_id, metadata):
|
|
||||||
return {"id": transaction_id, "metadata": metadata}
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
from functools import singledispatch
|
from functools import singledispatch
|
||||||
from planetmint.backend.exceptions import OperationError
|
from planetmint.backend.exceptions import OperationError
|
||||||
from planetmint.backend.interfaces import Asset, MetaData
|
from planetmint.backend.interfaces import Asset, Block, MetaData, Input
|
||||||
|
|
||||||
@singledispatch
|
@singledispatch
|
||||||
def store_asset(connection, asset: dict) -> Asset:
|
def store_asset(connection, asset: dict) -> Asset:
|
||||||
@ -148,7 +148,7 @@ def get_owned_ids(connection, owner):
|
|||||||
|
|
||||||
|
|
||||||
@singledispatch
|
@singledispatch
|
||||||
def get_block(connection, block_id):
|
def get_block(connection, block_id) -> Block:
|
||||||
"""Get a block from the planet table.
|
"""Get a block from the planet table.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -176,7 +176,7 @@ def get_block_with_transaction(connection, txid):
|
|||||||
|
|
||||||
|
|
||||||
@singledispatch
|
@singledispatch
|
||||||
def get_metadata(connection, transaction_ids):
|
def get_metadata(connection, transaction_ids) -> list[MetaData]:
|
||||||
"""Get a list of metadata from the metadata table.
|
"""Get a list of metadata from the metadata table.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -435,6 +435,15 @@ def get_latest_abci_chain(conn):
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def get_inputs_by_tx_id(connection, tx_id) -> list[Input]:
|
||||||
|
"""Retrieve inputs for a transaction by its id"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def store_transaction_inputs(connection, inputs: list[Input]):
|
||||||
|
"""Store inputs for a transaction"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
@singledispatch
|
@singledispatch
|
||||||
def _group_transaction_by_ids(txids: list, connection):
|
def _group_transaction_by_ids(txids: list, connection):
|
||||||
|
|||||||
@ -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, convert # noqa
|
from planetmint.backend.tarantool import query, connection, schema # noqa
|
||||||
|
|
||||||
# MongoDBConnection should always be accessed via
|
# MongoDBConnection should always be accessed via
|
||||||
# ``planetmint.backend.connect()``.
|
# ``planetmint.backend.connect()``.
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
# 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, assets):
|
|
||||||
asset_id = transaction_id
|
|
||||||
if transaction_type not in filter_operation:
|
|
||||||
asset_id = assets[0]["id"]
|
|
||||||
return tuple([assets, transaction_id, asset_id])
|
|
||||||
|
|
||||||
|
|
||||||
@register_query(TarantoolDBConnection)
|
|
||||||
def prepare_metadata(connection, transaction_id, metadata):
|
|
||||||
return {"id": transaction_id, "metadata": metadata}
|
|
||||||
@ -12,7 +12,7 @@ from operator import itemgetter
|
|||||||
from tarantool.error import DatabaseError
|
from tarantool.error import DatabaseError
|
||||||
from planetmint.backend import query
|
from planetmint.backend import query
|
||||||
from planetmint.backend.utils import module_dispatch_registrar
|
from planetmint.backend.utils import module_dispatch_registrar
|
||||||
from planetmint.backend.interfaces import Asset, MetaData
|
from planetmint.backend.interfaces import Asset, MetaData, Input
|
||||||
from planetmint.backend.tarantool.connection import TarantoolDBConnection
|
from planetmint.backend.tarantool.connection import TarantoolDBConnection
|
||||||
from planetmint.backend.tarantool.transaction.tools import TransactionCompose, TransactionDecompose
|
from planetmint.backend.tarantool.transaction.tools import TransactionCompose, TransactionDecompose
|
||||||
|
|
||||||
@ -50,6 +50,40 @@ def _group_transaction_by_ids(connection, txids: list):
|
|||||||
_transactions.append(_transaction)
|
_transactions.append(_transaction)
|
||||||
return _transactions
|
return _transactions
|
||||||
|
|
||||||
|
@register_query(TarantoolDBConnection)
|
||||||
|
def get_inputs_by_tx_id(connection, tx_id: str) -> list[Input]:
|
||||||
|
_inputs = connection.run(connection.space("inputs").select(tx_id, index="id_search"))
|
||||||
|
_sorted_inputs = sorted(_inputs, key=itemgetter(6))
|
||||||
|
|
||||||
|
inputs = []
|
||||||
|
|
||||||
|
for input in _sorted_inputs:
|
||||||
|
tx_id = input[0]
|
||||||
|
fulfillment = input[1]
|
||||||
|
owners_before = input[2]
|
||||||
|
fulfills = None
|
||||||
|
fulfills_tx_id = input[3]
|
||||||
|
|
||||||
|
if fulfills_tx_id:
|
||||||
|
fulfills = {
|
||||||
|
"transaction_id": fulfills_tx_id,
|
||||||
|
"output_index": int(input[4])
|
||||||
|
}
|
||||||
|
|
||||||
|
inputs.append(Input(tx_id, fulfills, owners_before, fulfillment))
|
||||||
|
|
||||||
|
return inputs
|
||||||
|
|
||||||
|
@register_query(TarantoolDBConnection)
|
||||||
|
def store_transaction_inputs(connection, inputs: list[Input]):
|
||||||
|
for index, input in enumerate(inputs):
|
||||||
|
connection.run(connection.space("inputs").insert((
|
||||||
|
input.tx_id,
|
||||||
|
input.fulfillment,
|
||||||
|
input.fulfills["transaction_id"] if input.fulfills else "",
|
||||||
|
input.fulfills["output_index"] if input.fulfills else "",
|
||||||
|
index
|
||||||
|
)))
|
||||||
|
|
||||||
@register_query(TarantoolDBConnection)
|
@register_query(TarantoolDBConnection)
|
||||||
def store_transactions(connection, signed_transactions: list):
|
def store_transactions(connection, signed_transactions: list):
|
||||||
@ -101,7 +135,7 @@ def store_metadatas(connection, metadata: list[MetaData]):
|
|||||||
|
|
||||||
|
|
||||||
@register_query(TarantoolDBConnection)
|
@register_query(TarantoolDBConnection)
|
||||||
def get_metadata(connection, transaction_ids: list):
|
def get_metadata(connection, transaction_ids: list) -> list[MetaData]:
|
||||||
_returned_data = []
|
_returned_data = []
|
||||||
for _id in transaction_ids:
|
for _id in transaction_ids:
|
||||||
metadata = connection.run(connection.space("meta_data").select(_id, index="id_search"))
|
metadata = connection.run(connection.space("meta_data").select(_id, index="id_search"))
|
||||||
@ -109,16 +143,16 @@ def get_metadata(connection, transaction_ids: list):
|
|||||||
if len(metadata) > 0:
|
if len(metadata) > 0:
|
||||||
metadata[0] = list(metadata[0])
|
metadata[0] = list(metadata[0])
|
||||||
metadata[0][1] = json.loads(metadata[0][1])
|
metadata[0][1] = json.loads(metadata[0][1])
|
||||||
metadata[0] = tuple(metadata[0])
|
metadata = MetaData(metadata[0][0], metadata[0][1])
|
||||||
_returned_data.append(metadata)
|
_returned_data.append(metadata)
|
||||||
return _returned_data
|
return _returned_data
|
||||||
|
|
||||||
|
|
||||||
@register_query(TarantoolDBConnection)
|
@register_query(TarantoolDBConnection)
|
||||||
def store_asset(connection, asset: Asset):
|
def store_asset(connection, asset: Asset):
|
||||||
asset = (json.dumps(asset.data), asset.tx_id, asset.id)
|
tuple_asset = (json.dumps(asset.data), asset.tx_id, asset.id)
|
||||||
try:
|
try:
|
||||||
return connection.run(connection.space("assets").insert(asset), only_data=False)
|
return connection.run(connection.space("assets").insert(tuple_asset), only_data=False)
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -238,11 +272,6 @@ def text_search(conn, search, table="assets", limit=0):
|
|||||||
return to_return if limit == 0 else to_return[:limit]
|
return to_return if limit == 0 else to_return[:limit]
|
||||||
|
|
||||||
|
|
||||||
def _remove_text_score(asset):
|
|
||||||
asset.pop("score", None)
|
|
||||||
return asset
|
|
||||||
|
|
||||||
|
|
||||||
@register_query(TarantoolDBConnection)
|
@register_query(TarantoolDBConnection)
|
||||||
def get_owned_ids(connection, owner: str):
|
def get_owned_ids(connection, owner: str):
|
||||||
_keys = connection.run(connection.space("keys").select(owner, index="keys_search"))
|
_keys = connection.run(connection.space("keys").select(owner, index="keys_search"))
|
||||||
|
|||||||
@ -483,7 +483,7 @@ class Planetmint(object):
|
|||||||
"""
|
"""
|
||||||
return backend.query.get_assets(self.connection, asset_ids)
|
return backend.query.get_assets(self.connection, asset_ids)
|
||||||
|
|
||||||
def get_metadata(self, txn_ids):
|
def get_metadata(self, txn_ids) -> list[MetaData]:
|
||||||
"""Return a list of metadata that match the transaction ids (txn_ids)
|
"""Return a list of metadata that match the transaction ids (txn_ids)
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -595,16 +595,13 @@ class Planetmint(object):
|
|||||||
# TODO: this will break if more than one asset is used
|
# TODO: this will break if more than one asset is used
|
||||||
assets = self.get_assets(tx_ids)
|
assets = self.get_assets(tx_ids)
|
||||||
for asset in assets:
|
for asset in assets:
|
||||||
if asset is not None:
|
|
||||||
tx = tx_map[asset.id]
|
tx = tx_map[asset.id]
|
||||||
tx["assets"] = [asset.data]
|
tx["assets"] = [asset.data]
|
||||||
|
|
||||||
tx_ids = list(tx_map.keys())
|
metadata_list = self.get_metadata(tx_ids)
|
||||||
metadata_list = list(self.get_metadata(tx_ids))
|
|
||||||
for metadata in metadata_list:
|
for metadata in metadata_list:
|
||||||
if "id" in metadata:
|
tx = tx_map[metadata.id]
|
||||||
tx = tx_map[metadata["id"]]
|
tx["metadata"] = metadata.metadata
|
||||||
tx.update({"metadata": metadata.get("metadata")})
|
|
||||||
|
|
||||||
if return_list:
|
if return_list:
|
||||||
tx_list = []
|
tx_list = []
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user