Added asset decoupling support for rethinkdb

Updated schema.
Created queries for assets table.
Fixed tests.
This commit is contained in:
Rodolphe Marques 2017-05-10 17:55:43 +02:00
parent 92392b51a7
commit 8c0dbeb281
4 changed files with 24 additions and 9 deletions

View File

@ -6,6 +6,7 @@ import rethinkdb as r
from bigchaindb import backend, utils from bigchaindb import backend, utils
from bigchaindb.common import exceptions from bigchaindb.common import exceptions
from bigchaindb.common.transaction import Transaction from bigchaindb.common.transaction import Transaction
from bigchaindb.common.utils import serialize
from bigchaindb.backend.utils import module_dispatch_registrar from bigchaindb.backend.utils import module_dispatch_registrar
from bigchaindb.backend.rethinkdb.connection import RethinkDBConnection from bigchaindb.backend.rethinkdb.connection import RethinkDBConnection
@ -147,10 +148,10 @@ def get_votes_by_block_id_and_voter(connection, block_id, node_pubkey):
@register_query(RethinkDBConnection) @register_query(RethinkDBConnection)
def write_block(connection, block): def write_block(connection, block_dict):
return connection.run( return connection.run(
r.table('bigchain') r.table('bigchain')
.insert(r.json(block.to_str()), durability=WRITE_DURABILITY)) .insert(r.json(serialize(block_dict)), durability=WRITE_DURABILITY))
@register_query(RethinkDBConnection) @register_query(RethinkDBConnection)
@ -158,6 +159,20 @@ def get_block(connection, block_id):
return connection.run(r.table('bigchain').get(block_id)) return connection.run(r.table('bigchain').get(block_id))
@register_query(RethinkDBConnection)
def write_assets(connection, assets):
return connection.run(
r.table('assets')
.insert(assets, durability=WRITE_DURABILITY))
@register_query(RethinkDBConnection)
def get_assets(connection, asset_ids):
return connection.run(
r.table('assets', read_mode=READ_MODE)
.get_all(*asset_ids))
@register_query(RethinkDBConnection) @register_query(RethinkDBConnection)
def count_blocks(connection): def count_blocks(connection):
return connection.run( return connection.run(
@ -203,7 +218,7 @@ def get_last_voted_block_id(connection, node_pubkey):
except r.ReqlNonExistenceError: except r.ReqlNonExistenceError:
# return last vote if last vote exists else return Genesis block # return last vote if last vote exists else return Genesis block
return get_genesis_block(connection) return get_genesis_block(connection)['id']
# Now the fun starts. Since the resolution of timestamp is a second, # Now the fun starts. Since the resolution of timestamp is a second,
# we might have more than one vote per timestamp. If this is the case # we might have more than one vote per timestamp. If this is the case
@ -235,9 +250,7 @@ def get_last_voted_block_id(connection, node_pubkey):
except KeyError: except KeyError:
break break
return connection.run( return last_block_id
r.table('bigchain', read_mode=READ_MODE)
.get(last_block_id))
@register_query(RethinkDBConnection) @register_query(RethinkDBConnection)

View File

@ -23,7 +23,7 @@ def create_database(connection, dbname):
@register_schema(RethinkDBConnection) @register_schema(RethinkDBConnection)
def create_tables(connection, dbname): def create_tables(connection, dbname):
for table_name in ['bigchain', 'backlog', 'votes']: for table_name in ['bigchain', 'backlog', 'votes', 'assets']:
logger.info('Create `%s` table.', table_name) logger.info('Create `%s` table.', table_name)
connection.run(r.db(dbname).table_create(table_name)) connection.run(r.db(dbname).table_create(table_name))

View File

@ -90,7 +90,8 @@ class Transaction(Transaction):
def from_db(cls, bigchain, tx_dict): def from_db(cls, bigchain, tx_dict):
# TODO: write docstring # TODO: write docstring
if tx_dict['operation'] in [Transaction.CREATE, Transaction.CREATE]: if tx_dict['operation'] in [Transaction.CREATE, Transaction.CREATE]:
asset = bigchain.get_assets([tx_dict['id']])[0] # TODO: Maybe replace this call to a call to get_asset_by_id
asset = list(bigchain.get_assets([tx_dict['id']]))[0]
asset.pop('id') asset.pop('id')
tx_dict.update({'asset': asset}) tx_dict.update({'asset': asset})

View File

@ -63,7 +63,8 @@ def test_create_tables():
assert conn.run(r.db(dbname).table_list().contains('bigchain')) is True assert conn.run(r.db(dbname).table_list().contains('bigchain')) is True
assert conn.run(r.db(dbname).table_list().contains('backlog')) is True assert conn.run(r.db(dbname).table_list().contains('backlog')) is True
assert conn.run(r.db(dbname).table_list().contains('votes')) is True assert conn.run(r.db(dbname).table_list().contains('votes')) is True
assert len(conn.run(r.db(dbname).table_list())) == 3 assert conn.run(r.db(dbname).table_list().contains('assets')) is True
assert len(conn.run(r.db(dbname).table_list())) == 4
@pytest.mark.bdb @pytest.mark.bdb