Skip to content

Commit

Permalink
Transcation API extension: last_tx parameter (#2667)
Browse files Browse the repository at this point in the history
* added last_tx switch to the TX get query to only get the latest TX for a given asset.
* extended test case to contain last_tx field
* Add last_tx option in query module
* Fix natural descending cursor sort argument
  • Loading branch information
eckelj committed Nov 6, 2019
1 parent ecd6e9c commit b54c315
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 36 deletions.
36 changes: 13 additions & 23 deletions bigchaindb/backend/localmongodb/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,29 +120,19 @@ def store_block(conn, block):


@register_query(LocalMongoDBConnection)
def get_txids_filtered(conn, asset_id, operation=None):
match_create = {
'operation': 'CREATE',
'id': asset_id
}
match_transfer = {
'operation': 'TRANSFER',
'asset.id': asset_id
}

if operation == Transaction.CREATE:
match = match_create
elif operation == Transaction.TRANSFER:
match = match_transfer
else:
match = {'$or': [match_create, match_transfer]}

pipeline = [
{'$match': match}
]
cursor = conn.run(
conn.collection('transactions')
.aggregate(pipeline))
def get_txids_filtered(conn, asset_id, operation=None, last_tx=None):

match = {
Transaction.CREATE: {'operation': 'CREATE', 'id': asset_id},
Transaction.TRANSFER: {'operation': 'TRANSFER', 'asset.id': asset_id},
None: {'$or': [{'asset.id': asset_id}, {'id': asset_id}]},
}[operation]

cursor = conn.run(conn.collection('transactions').find(match))

if last_tx:
cursor = cursor.sort([('$natural', DESCENDING)]).limit(1)

return (elem['id'] for elem in cursor)


Expand Down
4 changes: 2 additions & 2 deletions bigchaindb/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,11 +261,11 @@ def get_transaction(self, transaction_id):
def get_transactions(self, txn_ids):
return backend.query.get_transactions(self.connection, txn_ids)

def get_transactions_filtered(self, asset_id, operation=None):
def get_transactions_filtered(self, asset_id, operation=None, last_tx=None):
"""Get a list of transactions filtered on some criteria
"""
txids = backend.query.get_txids_filtered(self.connection, asset_id,
operation)
operation, last_tx)
for txid in txids:
yield self.get_transaction(txid)

Expand Down
4 changes: 2 additions & 2 deletions bigchaindb/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
# Code is Apache-2.0 and docs are CC-BY-4.0

__version__ = '2.0.0'
__short_version__ = '2.0'
__version__ = '2.1.0'
__short_version__ = '2.1'

# Supported Tendermint versions
__tm_supported_versions__ = ["0.31.5"]
3 changes: 2 additions & 1 deletion bigchaindb/web/views/transactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ def get(self):
parser.add_argument('operation', type=parameters.valid_operation)
parser.add_argument('asset_id', type=parameters.valid_txid,
required=True)
parser.add_argument('last_tx', type=parameters.valid_bool,
required=False)
args = parser.parse_args()

with current_app.config['bigchain_pool']() as bigchain:
txs = bigchain.get_transactions_filtered(**args)

Expand Down
22 changes: 14 additions & 8 deletions docs/server/source/http-client-server-api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Transactions
Requests to the ``/api/v1/transactions`` endpoint
without any query parameters will get a response status code ``400 Bad Request``.

.. http:get:: /api/v1/transactions?asset_id={asset_id}&operation={CREATE|TRANSFER}
.. http:get:: /api/v1/transactions?asset_id={asset_id}&operation={CREATE|TRANSFER}&last_tx={true|false}
Get a list of transactions that use an asset with the ID ``asset_id``.

Expand All @@ -106,12 +106,18 @@ Transactions
If ``operation`` is not included, then *every* transaction involving
the asset with ID ``asset_id`` will be returned.

if ``last_tx`` is set to ``true``, only the last transaction is returned
instead of all transactions with the given ``asset_id``.

This endpoint returns transactions only if they are in committed blocks.

:query string operation: (Optional) ``CREATE`` or ``TRANSFER``.

:query string asset_id: asset ID.

:query string last_tx: (Optional) ``true`` or ``false``.


**Example request**:

.. literalinclude:: http-samples/get-tx-by-asset-request.http
Expand Down Expand Up @@ -141,7 +147,7 @@ Transactions
Otherwise, the node will send the transaction to Tendermint (in the same node) using the
`Tendermint broadcast API
<https://tendermint.com/docs/tendermint-core/using-tendermint.html#broadcast-api>`_.

The meaning of the ``mode`` query parameter is inherited from the mode parameter in
`Tendermint's broadcast API
<https://tendermint.com/docs/tendermint-core/using-tendermint.html#broadcast-api>`_.
Expand Down Expand Up @@ -191,7 +197,7 @@ Transactions
:resheader Content-Type: ``application/json``

:statuscode 202: The meaning of this response depends on the value
of the ``mode`` parameter. See above.
of the ``mode`` parameter. See above.

:statuscode 400: The posted transaction was invalid.

Expand Down Expand Up @@ -347,14 +353,14 @@ Assets
.. http:get:: /api/v1/assets/?search={search}
Return all assets that match a given text search.

.. note::

The ``id`` of the asset
is the same ``id`` of the CREATE transaction that created the asset.

.. note::

You can use ``assets/?search`` or ``assets?search``.

If no assets match the text search it returns an empty list.
Expand Down Expand Up @@ -471,14 +477,14 @@ Transaction Metadata
.. http:get:: /api/v1/metadata/?search={search}
Return all metadata objects that match a given text search.

.. note::

The ``id`` of the metadata
is the same ``id`` of the transaction where it was defined.

.. note::

You can use ``metadata/?search`` or ``metadata?search``.

If no metadata objects match the text search it returns an empty list.
Expand Down
8 changes: 8 additions & 0 deletions tests/web/test_transactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,13 +382,21 @@ def get_txs_patched(conn, **args):
url = TX_ENDPOINT + '?asset_id=' + asset_id
assert client.get(url).json == [
['asset_id', asset_id],
['last_tx', None],
['operation', None]
]
url = TX_ENDPOINT + '?asset_id=' + asset_id + '&operation=CREATE'
assert client.get(url).json == [
['asset_id', asset_id],
['last_tx', None],
['operation', 'CREATE']
]
url = TX_ENDPOINT + '?asset_id=' + asset_id + '&last_tx=true'
assert client.get(url).json == [
['asset_id', asset_id],
['last_tx', True],
['operation', None]
]


def test_transactions_get_list_bad(client):
Expand Down

0 comments on commit b54c315

Please sign in to comment.