diff options
-rw-r--r-- | boto/sdb/db/manager/sdbmanager.py | 7 | ||||
-rw-r--r-- | boto/sdb/db/model.py | 10 | ||||
-rw-r--r-- | boto/sdb/db/query.py | 11 |
3 files changed, 25 insertions, 3 deletions
diff --git a/boto/sdb/db/manager/sdbmanager.py b/boto/sdb/db/manager/sdbmanager.py index 8aca5ad7..903fbebf 100644 --- a/boto/sdb/db/manager/sdbmanager.py +++ b/boto/sdb/db/manager/sdbmanager.py @@ -438,7 +438,10 @@ class SDBManager(object): return self.get_object(None, id) def query(self, query): - query_str = "select * from `%s` %s" % (self.domain.name, self._build_filter_part(query.model_class, query.filters, query.sort_by)) + filters = query.select + if not filters: + filters = query.filters + query_str = "select * from `%s` %s" % (self.domain.name, self._build_filter_part(query.model_class, filters, query.sort_by)) if query.limit: query_str += " limit %s" % query.limit rs = self.domain.select(query_str, max_items=query.limit, next_token = query.next_token) @@ -480,6 +483,8 @@ class SDBManager(object): """ Build the filter part """ + if isinstance(filters, str) or isinstance(filters, unicode): + return "WHERE `__type__` = '%s' AND %s" % (cls.__name__, filters) import types query_parts = [] order_by_filtered = False diff --git a/boto/sdb/db/model.py b/boto/sdb/db/model.py index 7294caaa..d67cbb00 100644 --- a/boto/sdb/db/model.py +++ b/boto/sdb/db/model.py @@ -215,6 +215,16 @@ class Model(object): doc = xmlmanager.marshal_object(self, doc) return doc + @classmethod + def find_subclass(cls, name): + """Find a subclass with a given name""" + if name == cls.__name__: + return cls + for sc in cls.__sub_classes__: + r = sc.find_subclass(name) + if r != None: + return r + class Expando(Model): def __setattr__(self, name, value): diff --git a/boto/sdb/db/query.py b/boto/sdb/db/query.py index dfbe593d..ed334335 100644 --- a/boto/sdb/db/query.py +++ b/boto/sdb/db/query.py @@ -30,6 +30,7 @@ class Query(object): else: self.manager = self.model_class._manager self.filters = [] + self.select = None self.sort_by = None self.rs = None self.next_token = next_token @@ -54,10 +55,16 @@ class Query(object): return self def count(self, quick=True): - return self.manager.count(self.model_class, self.filters, quick) + if self.select: + return self.manager.count(self.model_class, self.select, quick) + else: + return self.manager.count(self.model_class, self.filters, quick) def get_query(self): - return self.manager._build_filter_part(self.model_class, self.filters, self.sort_by) + if self.select: + return self.manager._build_filter_part(self.model_class, self.select, self.sort_by) + else: + return self.manager._build_filter_part(self.model_class, self.filters, self.sort_by) def order(self, key): self.sort_by = key |