diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 784a17c..8c28643 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -7,10 +7,10 @@ from secrets import token_hex from hashlib import sha256 from operator import itemgetter - -import tarantool.error import json +from tarantool.error import DatabaseError + from planetmint.backend import query from planetmint.backend.utils import module_dispatch_registrar from planetmint.backend.tarantool.connection import TarantoolDBConnection @@ -138,12 +138,15 @@ def store_asset(connection, asset): obj[0] = json.dumps(obj[0]) return tuple(obj) else: - (json.dumps(obj), obj["id"], obj["id"]) + return (json.dumps(obj), obj["id"], obj["id"]) + try: + return connection.run( + connection.space("assets").insert(convert(asset)), + only_data=False + ) + except DatabaseError: + pass - return connection.run( - connection.space("assets").insert(convert(asset)), - only_data=False - ) @register_query(TarantoolDBConnection) @@ -260,10 +263,29 @@ def get_txids_filtered(connection, asset_id: str, operation: str = None, @register_query(TarantoolDBConnection) def text_search(conn, search, table='assets', limit=0): pattern = ".{}.".format(search) + field_no = 1 if table == 'assets' else 2 # 2 for meta_data res = conn.run( - conn.space(table).call('indexed_pattern_search', (table, 1, pattern)) + conn.space(table).call('indexed_pattern_search', (table, field_no, pattern)) ) - return res[0] if limit == 0 else res[0][:limit] + + to_return = [] + + if len(res[0]): # NEEDS BEAUTIFICATION + if table == 'assets': + for result in res[0]: + to_return.append({ + 'data': json.loads(result[0])['data'], + 'id': result[1] + }) + else: + for result in res[0]: + to_return.append({ + 'metadata': json.loads(result[1]), + 'id': result[0] + }) + + return to_return if limit == 0 else to_return[:limit] + def _remove_text_score(asset): asset.pop('score', None) diff --git a/planetmint/backend/tarantool/schema.py b/planetmint/backend/tarantool/schema.py index bf7017b..8f74084 100644 --- a/planetmint/backend/tarantool/schema.py +++ b/planetmint/backend/tarantool/schema.py @@ -62,7 +62,7 @@ INDEX_COMMANDS = { "meta_data": { "id_search": "meta_datas:create_index('id_search', { type='hash' , parts={'transaction_id'}})", - "text_search": "meta_datas:create_index('secondary', {unique=false,parts={2,'string'}}" + "text_search": "meta_datas:create_index('secondary', {unique=false,parts={2,'string'}})" }, "pre_commits": { diff --git a/planetmint/web/views/metadata.py b/planetmint/web/views/metadata.py index d8faf19..171c258 100644 --- a/planetmint/web/views/metadata.py +++ b/planetmint/web/views/metadata.py @@ -46,7 +46,6 @@ class MetadataApi(Resource): metadata = planet.text_search(**args) try: - # This only works with MongoDB as the backend return list(metadata) except OperationError as e: return make_error( diff --git a/tests/backend/tarantool/test_queries.py b/tests/backend/tarantool/test_queries.py index 27a0684..8788d47 100644 --- a/tests/backend/tarantool/test_queries.py +++ b/tests/backend/tarantool/test_queries.py @@ -6,16 +6,10 @@ from copy import deepcopy import pytest -import tarantool +import json from planetmint.transactions.types.assets.create import Create from planetmint.transactions.types.assets.transfer import Transfer -# import pymongo - -# # from planetmint.backend.connection import Connection, query -# from planetmint.backend.connection import Connection -# conn = Connection(backend="tarantool_db").get_connection() - pytestmark = pytest.mark.bdb @@ -167,9 +161,7 @@ def test_text_search(table): def test_write_metadata(db_conn): - # from planetmint.backend.connection import Connection from planetmint.backend.tarantool import query - # conn = Connection().get_connection() metadata = [ {'id': "1", 'data': '1'}, @@ -183,7 +175,7 @@ def test_write_metadata(db_conn): metadatas = [] for meta in metadata: _data = db_conn.run(db_conn.space("meta_data").select(meta["id"]))[0] - metadatas.append({"id": _data[0], "data": _data[1]}) + metadatas.append({"id": _data[0], "data": json.loads(_data[1])}) metadatas = sorted(metadatas, key=lambda k: k["id"])