diff --git a/bigchaindb/backend/localmongodb/query.py b/bigchaindb/backend/localmongodb/query.py index 5ad6a0a0..effbdacb 100644 --- a/bigchaindb/backend/localmongodb/query.py +++ b/bigchaindb/backend/localmongodb/query.py @@ -91,11 +91,10 @@ def get_assets(conn, asset_ids): @register_query(LocalMongoDBConnection) def get_spent(conn, transaction_id, output): - query_array = [{'transaction_id': transaction_id, - 'output_index': output}, - {'output_index': output, - 'transaction_id': transaction_id}] - query = {'inputs.fulfills': {'$in': query_array}} + query = {'inputs': + {'$elemMatch': + {'$and': [{'fulfills.transaction_id': transaction_id}, + {'fulfills.output_index': output}]}}} return conn.run( conn.collection('transactions') @@ -184,15 +183,18 @@ def get_owned_ids(conn, owner): @register_query(LocalMongoDBConnection) def get_spending_transactions(conn, inputs): + transaction_ids = [i['transaction_id'] for i in inputs] + output_indexes = [i['output_index'] for i in inputs] + query = {'inputs': + {'$elemMatch': + {'$and': + [ + {'fulfills.transaction_id': {'$in': transaction_ids}}, + {'fulfills.output_index': {'$in': output_indexes}} + ]}}} + cursor = conn.run( - conn.collection('transactions').aggregate([ - {'$match': { - 'inputs.fulfills': { - '$in': inputs, - }, - }}, - {'$project': {'_id': False}} - ])) + conn.collection('transactions').find(query, {'_id': False})) return cursor diff --git a/bigchaindb/common/transaction.py b/bigchaindb/common/transaction.py index f4456396..a1dfc626 100644 --- a/bigchaindb/common/transaction.py +++ b/bigchaindb/common/transaction.py @@ -274,12 +274,6 @@ class TransactionLink(object): 'output_index': self.output, } - def to_query(self): - return [{'transaction_id': self.txid, - 'output_index': self.output}, - {'output_index': self.output, - 'transaction_id': self.txid}] - def to_uri(self, path=''): if self.txid is None and self.output is None: return None diff --git a/bigchaindb/fastquery.py b/bigchaindb/fastquery.py index d17fb12d..0cf873cf 100644 --- a/bigchaindb/fastquery.py +++ b/bigchaindb/fastquery.py @@ -5,7 +5,6 @@ from bigchaindb.utils import condition_details_has_owner from bigchaindb.backend import query from bigchaindb.common.transaction import TransactionLink -from itertools import chain class FastQuery(): @@ -29,7 +28,7 @@ class FastQuery(): Args: outputs: list of TransactionLink """ - links = list(chain.from_iterable([o.to_query() for o in outputs])) + links = [o.to_dict() for o in outputs] txs = list(query.get_spending_transactions(self.connection, links)) spends = {TransactionLink.from_dict(input_['fulfills']) for tx in txs @@ -42,7 +41,7 @@ class FastQuery(): Args: outputs: list of TransactionLink """ - links = list(chain.from_iterable([o.to_query() for o in outputs])) + links = [o.to_dict() for o in outputs] txs = list(query.get_spending_transactions(self.connection, links)) spends = {TransactionLink.from_dict(input_['fulfills']) for tx in txs diff --git a/tests/test_core.py b/tests/test_core.py index 85fc7ec3..d7bc4bb5 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -71,7 +71,7 @@ def test_get_spent_issue_1271(b, alice, bob, carol): [carol.public_key], [([carol.public_key], 8)], ).sign([carol.private_key]) - assert b.validate_transaction(tx_1) + assert tx_1.validate(b) b.store_bulk_transactions([tx_1]) tx_2 = Transaction.transfer( @@ -81,7 +81,7 @@ def test_get_spent_issue_1271(b, alice, bob, carol): ([carol.public_key], 4)], asset_id=tx_1.id, ).sign([carol.private_key]) - assert b.validate_transaction(tx_2) + assert tx_2.validate(b) b.store_bulk_transactions([tx_2]) tx_3 = Transaction.transfer( @@ -90,7 +90,7 @@ def test_get_spent_issue_1271(b, alice, bob, carol): ([carol.public_key], 3)], asset_id=tx_1.id, ).sign([carol.private_key]) - assert b.validate_transaction(tx_3) + assert tx_3.validate(b) b.store_bulk_transactions([tx_3]) tx_4 = Transaction.transfer( @@ -98,7 +98,7 @@ def test_get_spent_issue_1271(b, alice, bob, carol): [([bob.public_key], 3)], asset_id=tx_1.id, ).sign([alice.private_key]) - assert b.validate_transaction(tx_4) + assert tx_4.validate(b) b.store_bulk_transactions([tx_4]) tx_5 = Transaction.transfer( @@ -106,7 +106,8 @@ def test_get_spent_issue_1271(b, alice, bob, carol): [([alice.public_key], 2)], asset_id=tx_1.id, ).sign([bob.private_key]) - assert b.validate_transaction(tx_5) + assert tx_5.validate(b) + b.store_bulk_transactions([tx_5]) assert b.get_spent(tx_2.id, 0) == tx_5