X-Git-Url: http://dolda2000.com/gitweb/?p=didex.git;a=blobdiff_plain;f=didex%2Fvalues.py;h=ecb78dd26d1cd70ce5f1380279e7ab2d7613743e;hp=8479d4214086f63539315f05206d0ebd820d0400;hb=a19ad473ae0a534f454dadacb01d8252ab51c21f;hpb=fed04312788aef5e52e5549fe5325988d2bb56eb diff --git a/didex/values.py b/didex/values.py index 8479d42..ecb78dd 100644 --- a/didex/values.py +++ b/didex/values.py @@ -40,6 +40,27 @@ class base(storedesc): def get(self, **kwargs): return cursor(self.index().get(**kwargs), self.store) + def get1(self, *, check=False, default=KeyError, **kwargs): + with self.get(**kwargs) as cursor: + try: + k, v = next(cursor) + except StopIteration: + if default is not KeyError: + return default + raise KeyError("no matches in " + self.name, kwargs) + if check: + try: + next(cursor) + except StopIteration: + pass + else: + raise ValueError("unexpected multiple matchies in " + self.name, kwargs) + return v + + def list(self, **kwargs): + with self.get(**kwargs) as cursor: + return [v for k, v in cursor] + class descbase(base): def __init__(self, store, indextype, name, datatype, default): super().__init__(store, indextype, name, datatype) @@ -113,6 +134,17 @@ class compound(base): self.parts = parts self.iattr = "__idx_%s_cur" % name + def minim(self, *parts): + return self.typ.minim(*parts) + def maxim(self, *parts): + return self.typ.maxim(*parts) + + def get(self, *, partial=None, **spec): + if partial is not None: + return super().get(ge=self.minim(*partial), le = self.maxim(*partial), **spec) + else: + return super().get(**spec) + def register(self, id, obj, tx): val = tuple(part.__get__(obj, None) for part in self.parts) self.index().put(val, id, tx=tx)