Merge pull request #154 from LaurentDeMontBlanc/planetmint-tarantool

Planetmint tarantool
This commit is contained in:
Lorenz Herzberger 2022-06-22 08:54:44 +02:00 committed by GitHub
commit 31cb0395e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 21 deletions

View File

@ -7,10 +7,10 @@
from secrets import token_hex from secrets import token_hex
from hashlib import sha256 from hashlib import sha256
from operator import itemgetter from operator import itemgetter
import tarantool.error
import json import json
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.tarantool.connection import TarantoolDBConnection from planetmint.backend.tarantool.connection import TarantoolDBConnection
@ -138,12 +138,15 @@ def store_asset(connection, asset):
obj[0] = json.dumps(obj[0]) obj[0] = json.dumps(obj[0])
return tuple(obj) return tuple(obj)
else: 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) @register_query(TarantoolDBConnection)
@ -260,10 +263,29 @@ def get_txids_filtered(connection, asset_id: str, operation: str = None,
@register_query(TarantoolDBConnection) @register_query(TarantoolDBConnection)
def text_search(conn, search, table='assets', limit=0): def text_search(conn, search, table='assets', limit=0):
pattern = ".{}.".format(search) pattern = ".{}.".format(search)
field_no = 1 if table == 'assets' else 2 # 2 for meta_data
res = conn.run( 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): def _remove_text_score(asset):
asset.pop('score', None) asset.pop('score', None)

View File

@ -62,7 +62,7 @@ INDEX_COMMANDS = {
"meta_data": "meta_data":
{ {
"id_search": "meta_datas:create_index('id_search', { type='hash' , parts={'transaction_id'}})", "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": "pre_commits":
{ {

View File

@ -46,7 +46,6 @@ class MetadataApi(Resource):
metadata = planet.text_search(**args) metadata = planet.text_search(**args)
try: try:
# This only works with MongoDB as the backend
return list(metadata) return list(metadata)
except OperationError as e: except OperationError as e:
return make_error( return make_error(

View File

@ -6,16 +6,10 @@
from copy import deepcopy from copy import deepcopy
import pytest import pytest
import tarantool import json
from planetmint.transactions.types.assets.create import Create from planetmint.transactions.types.assets.create import Create
from planetmint.transactions.types.assets.transfer import Transfer 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 pytestmark = pytest.mark.bdb
@ -167,9 +161,7 @@ def test_text_search(table):
def test_write_metadata(db_conn): def test_write_metadata(db_conn):
# from planetmint.backend.connection import Connection
from planetmint.backend.tarantool import query from planetmint.backend.tarantool import query
# conn = Connection().get_connection()
metadata = [ metadata = [
{'id': "1", 'data': '1'}, {'id': "1", 'data': '1'},
@ -183,7 +175,7 @@ def test_write_metadata(db_conn):
metadatas = [] metadatas = []
for meta in metadata: for meta in metadata:
_data = db_conn.run(db_conn.space("meta_data").select(meta["id"]))[0] _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"]) metadatas = sorted(metadatas, key=lambda k: k["id"])