deserialize search results

This commit is contained in:
evilchili 2025-09-28 11:11:34 -07:00
parent a76afaa126
commit b6097b60cc
3 changed files with 30 additions and 5 deletions

View File

@ -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])

View File

@ -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

View File

@ -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