def _todict(self, r, skip = [], fields = None): if fields is None: fields = self._spec["fields"] return {k: self._db.from_db_type(r[k], lookup(fields, k, default = type(r[k]))) for k in r.keys() if k in fields and k not in skip and r[k] is not None}
def one(self, *largs, **kargs): kargs["limit"] = 1 db = lookup(kargs, "db", default = None, destroy = True) if db is None: db = self.getdb() cur = self.query(db =db, *largs, **kargs) r = cur.fetchone() if r is None: raise KeyError(kargs) return self.cl(drop_none(r), db = db)
def _graphattr(store=False, *largs, **kargs): default = len(largs) + len(kargs) == 0 try: if not default: raise NotImplementedError return lookup(self._props, name) except (KeyError, NotImplementedError): a = Graph.__getattribute__(self, name)(*largs, **kargs) if default and store: update(self._props, attr, d) return a
def is_cayley_graph(self, store=False): try: return lookup(self._props, "is_cayley_graph") except (KeyError, NotImplementedError): A = self.automorphism_group() n = self.order() if A.order() == n: c = A.is_transitive() else: c = any(s.order() == n and s.is_transitive() for s in A.conjugacy_classes_subgroups()) if store: update(self._props, "is_cayley_graph", c) return c
def is_regular(self, k=None, store=False, **kargs): default = len(kargs) == 0 try: if not default: raise NotImplementedError r = lookup(self._props, "is_regular") return r and (True if k is None else k == self.average_degree(store=store)) except (KeyError, NotImplementedError): r = Graph.is_regular(self, k, **kargs) if default and store: update(self._props, "is_regular", r) if r and k is not None: update(self._props, "average_degree", k) return r
def count(self, *largs, **kargs): db = lookup(kargs, "db", default = None, destroy = True) join = lookup(kargs, "join", default = None, destroy = True) by = lookup(kargs, "by", default = None, destroy = True) if db is None: db = self.getdb() t = Table(self.cl._spec["name"]) if join is not None: t = t.join(join, by = by) if self.cl._parent is None: groupby = lookup(kargs, "groupby", default = [], destroy = True) if type(groupby) == set: groupby = list(groupby) elif type(groupby) != list: groupby = [groupby] cur = db.query(columns = [Count(All())] + groupby, table = t, cond = And(*largs, **kargs), groupby = groupby) n = cur.fetchall() cur.close() return tomultidict(n, groupby) else: return ZooInfo(self.cl._parent).count(db = db, join = t, by = {self.cl._spec["primary_key"]}, *largs, **kargs)
def query(self, *largs, **kargs): db = lookup(kargs, "db", default = None, destroy = True) join = lookup(kargs, "join", default = None, destroy = True) by = lookup(kargs, "by", default = None, destroy = True) if db is None: db = self.getdb() t = Table(self.cl._spec["name"]) if join is not None: t = t.join(join, by = by) if self.cl._parent is None: cur = lookup(kargs, "cur", default = None, destroy = True) orderby = lookup(kargs, "orderby", default = [], destroy = True) limit = lookup(kargs, "limit", default = None, destroy = True) offset = lookup(kargs, "offset", default = None, destroy = True) return db.query(columns = [All()], table = t, cond = And(*largs, **kargs), orderby = orderby, limit = limit, offset = offset, cur = cur) else: return ZooInfo(self.cl._parent).query(db = db, join = t, by = {self.cl._spec["primary_key"]}, *largs, **kargs)
def all(self, *largs, **kargs): db = lookup(kargs, "db", default = None, destroy = True) if db is None: db = self.getdb() cur = self.query(db = db, *largs, **kargs) return (self.cl(drop_none(r), db = db) for r in cur)
def cursor(self, **kargs): try: lookup(kargs, 'cursor_factory') except KeyError: kargs['cursor_factory'] = psycopg2.extras.DictCursor return self.db.cursor(**kargs)