optinal projections, thanks Christian and Anthony
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-06-12 21:45:03) dev
|
Version 2.00.0 (2012-06-13 11:52:33) dev
|
||||||
|
|||||||
+34
-9
@@ -4080,22 +4080,35 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
if use_common_filters(query):
|
if use_common_filters(query):
|
||||||
query = self.common_filter(query,[tablename])
|
query = self.common_filter(query,[tablename])
|
||||||
|
|
||||||
if len(self.db[tablename].fields) == len(fields):
|
|
||||||
#getting all fields, not a projection query
|
|
||||||
projection = None
|
|
||||||
else:
|
|
||||||
projection = [f.name for f in fields]
|
|
||||||
|
|
||||||
#tableobj is a GAE Model class (or subclass)
|
#tableobj is a GAE Model class (or subclass)
|
||||||
tableobj = self.db[tablename]._tableobj
|
tableobj = self.db[tablename]._tableobj
|
||||||
filters = self.expand(query)
|
filters = self.expand(query)
|
||||||
|
|
||||||
|
projection = None
|
||||||
|
if len(self.db[tablename].fields) == len(fields):
|
||||||
|
#getting all fields, not a projection query
|
||||||
|
projection = None
|
||||||
|
elif attributes.get('withprojection') == True:
|
||||||
|
projection = []
|
||||||
|
for f in fields:
|
||||||
|
if f.type in ['text', 'blob']:
|
||||||
|
raise SyntaxError, \
|
||||||
|
"text and blob field types not allowed in projection queries"
|
||||||
|
else:
|
||||||
|
projection.append(f.name)
|
||||||
|
|
||||||
#projection's can't include 'id'. it will be added to the result later
|
#projection's can't include 'id'. it will be added to the result later
|
||||||
query_projection = [p for p in projection if p != 'id'] if projection \
|
query_projection = [p for p in projection if \
|
||||||
else None
|
p != self.db[tablename]._id.name] if projection \
|
||||||
|
else None
|
||||||
items = gae.Query(tableobj, projection=query_projection)
|
items = gae.Query(tableobj, projection=query_projection)
|
||||||
|
|
||||||
for filter in filters:
|
for filter in filters:
|
||||||
|
if attributes.get('withprojection') == True and \
|
||||||
|
filter.name in query_projection and \
|
||||||
|
filter.op in ['=', '<=', '>=']:
|
||||||
|
raise SyntaxError, \
|
||||||
|
"projection fields cannot have equality filters"
|
||||||
if filter.name=='__key__' and filter.op=='>' and filter.value==0:
|
if filter.name=='__key__' and filter.op=='>' and filter.value==0:
|
||||||
continue
|
continue
|
||||||
elif filter.name=='__key__' and filter.op=='=':
|
elif filter.name=='__key__' and filter.op=='=':
|
||||||
@@ -4142,9 +4155,21 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
return (items, tablename, projection or self.db[tablename].fields)
|
return (items, tablename, projection or self.db[tablename].fields)
|
||||||
|
|
||||||
def select(self,query,fields,attributes):
|
def select(self,query,fields,attributes):
|
||||||
|
"""
|
||||||
|
This is the GAE version of select. some notes to consider:
|
||||||
|
- db['_lastsql'] is not set because there is not SQL statement string
|
||||||
|
for a GAE query
|
||||||
|
- 'nativeRef' is a magical fieldname used for self references on GAE
|
||||||
|
- optional attribute 'withprojection' when set to True will trigger
|
||||||
|
use of the GAE projection queries. note that there are rules for
|
||||||
|
what is accepted imposed by GAE: each field must be indexed,
|
||||||
|
projection queries cannot contain blob or text fields, and you
|
||||||
|
cannot use == and also select that same field. see https://developers.google.com/appengine/docs/python/datastore/queries#Query_Projection
|
||||||
|
"""
|
||||||
|
|
||||||
(items, tablename, fields) = self.select_raw(query,fields,attributes)
|
(items, tablename, fields) = self.select_raw(query,fields,attributes)
|
||||||
# self.db['_lastsql'] = self._select(query,fields,attributes)
|
# self.db['_lastsql'] = self._select(query,fields,attributes)
|
||||||
rows = [[(t=='id' and item.key().id_or_name()) or \
|
rows = [[(t==self.db[tablename]._id.name and item.key().id_or_name()) or \
|
||||||
(t=='nativeRef' and item) or getattr(item, t) \
|
(t=='nativeRef' and item) or getattr(item, t) \
|
||||||
for t in fields] for item in items]
|
for t in fields] for item in items]
|
||||||
colnames = ['%s.%s' % (tablename, t) for t in fields]
|
colnames = ['%s.%s' % (tablename, t) for t in fields]
|
||||||
|
|||||||
Reference in New Issue
Block a user