summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boto/sdb/db/manager/sdbmanager.py7
-rw-r--r--boto/sdb/db/model.py10
-rw-r--r--boto/sdb/db/query.py11
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