deserialize search results
This commit is contained in:
parent
a76afaa126
commit
b6097b60cc
|
@ -2,6 +2,7 @@ import inspect
|
||||||
import re
|
import re
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from operator import ior
|
from operator import ior
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from tinydb import Query, TinyDB, table
|
from tinydb import Query, TinyDB, table
|
||||||
from tinydb.table import Document
|
from tinydb.table import Document
|
||||||
|
@ -35,6 +36,10 @@ class RecordTable(table.Table):
|
||||||
if document:
|
if document:
|
||||||
return document.deserialize(self._db)
|
return document.deserialize(self._db)
|
||||||
|
|
||||||
|
def search(self, *args, **kwargs) -> List[Record]:
|
||||||
|
results = super().search(*args, **kwargs)
|
||||||
|
return [r.deserialize(self._db) for r in results]
|
||||||
|
|
||||||
def remove(self, document):
|
def remove(self, document):
|
||||||
if document.doc_id:
|
if document.doc_id:
|
||||||
super().remove(doc_ids=[document.doc_id])
|
super().remove(doc_ids=[document.doc_id])
|
||||||
|
|
|
@ -32,6 +32,7 @@ class Field:
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Integer(Field):
|
class Integer(Field):
|
||||||
|
value_type: type = int
|
||||||
default: int = 0
|
default: int = 0
|
||||||
|
|
||||||
def deserialize(self, rec: str, db: TinyDB) -> value_type:
|
def deserialize(self, rec: str, db: TinyDB) -> value_type:
|
||||||
|
@ -61,8 +62,8 @@ class Record(Dict[(str, Field)]):
|
||||||
Serialie every field on the record
|
Serialie every field on the record
|
||||||
"""
|
"""
|
||||||
rec = {}
|
rec = {}
|
||||||
for name, field in self._metadata.fields.items():
|
for name, _field in self._metadata.fields.items():
|
||||||
rec[name] = field.serialize(self[name], db)
|
rec[name] = _field.serialize(self[name], db)
|
||||||
return self.__class__(rec, doc_id=self.doc_id)
|
return self.__class__(rec, doc_id=self.doc_id)
|
||||||
|
|
||||||
def deserialize(self, db):
|
def deserialize(self, db):
|
||||||
|
@ -70,8 +71,8 @@ class Record(Dict[(str, Field)]):
|
||||||
Deserialize every field on the record
|
Deserialize every field on the record
|
||||||
"""
|
"""
|
||||||
rec = {}
|
rec = {}
|
||||||
for name, field in self._metadata.fields.items():
|
for name, _field in self._metadata.fields.items():
|
||||||
rec[name] = field.deserialize(self[name], db)
|
rec[name] = _field.deserialize(self[name], db)
|
||||||
return self.__class__(rec, doc_id=self.doc_id)
|
return self.__class__(rec, doc_id=self.doc_id)
|
||||||
|
|
||||||
def __setattr__(self, key, value):
|
def __setattr__(self, key, value):
|
||||||
|
@ -116,5 +117,5 @@ class Collection(Field):
|
||||||
vals = []
|
vals = []
|
||||||
for member in rec:
|
for member in rec:
|
||||||
pt, puid = member.split("::")
|
pt, puid = member.split("::")
|
||||||
vals.append(db.table(pt).search(where("uid") == puid)[0].deserialize(db))
|
vals.append(db.table(pt).search(where("uid") == puid)[0])
|
||||||
return vals
|
return vals
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
from tinydb import Query
|
||||||
from tinydb.storages import MemoryStorage
|
from tinydb.storages import MemoryStorage
|
||||||
|
|
||||||
from grung import examples
|
from grung import examples
|
||||||
|
@ -76,3 +77,21 @@ def test_unique(db):
|
||||||
with pytest.raises(UniqueConstraintError):
|
with pytest.raises(UniqueConstraintError):
|
||||||
user2 = db.save(user2)
|
user2 = db.save(user2)
|
||||||
db.save(user1)
|
db.save(user1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_search(db):
|
||||||
|
kirk = db.save(examples.User(name="Captain James T. Kirk", email="riskybiznez@starfleet"))
|
||||||
|
bones = db.save(examples.User(name="Doctor McCoy", email="dammitjim@starfleet"))
|
||||||
|
ricky = db.save(examples.User(name="Ensign Ricky Redshirt", email="invincible@starfleet"))
|
||||||
|
|
||||||
|
crew = db.save(examples.Group(name="Crew", members=[kirk, bones, ricky]))
|
||||||
|
|
||||||
|
User = Query()
|
||||||
|
captains = db.User.search(User.name.matches("Captain"))
|
||||||
|
assert len(captains) == 1
|
||||||
|
|
||||||
|
Group = Query()
|
||||||
|
crew = db.Group.search(Group.name == "Crew")[0]
|
||||||
|
assert kirk in crew.members
|
||||||
|
assert bones in crew.members
|
||||||
|
assert ricky in crew.members
|
||||||
|
|
Loading…
Reference in New Issue
Block a user