thirdparty/google_appengine/google/appengine/ext/gql/__init__.py
changeset 2309 be1b94099f2d
parent 2273 e4cb9c53db3e
child 2413 d0b7dac5325c
--- a/thirdparty/google_appengine/google/appengine/ext/gql/__init__.py	Tue May 12 13:02:10 2009 +0200
+++ b/thirdparty/google_appengine/google/appengine/ext/gql/__init__.py	Tue May 12 15:39:52 2009 +0200
@@ -77,7 +77,7 @@
 
   The syntax for SELECT is fairly straightforward:
 
-  SELECT * FROM <entity>
+  SELECT [* | __key__ ] FROM <entity>
     [WHERE <condition> [AND <condition> ...]]
     [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]]
     [LIMIT [<offset>,]<count>]
@@ -144,9 +144,8 @@
       simple types (strings, integers, floats).
 
 
-  SELECT * will return an iterable set of entries, but other operations (schema
-  queries, updates, inserts or field selections) will return alternative
-  result types.
+  SELECT * will return an iterable set of entities; SELECT __key__ will return
+  an iterable set of Keys.
   """
 
   TOKENIZE_REGEX = re.compile(r"""
@@ -229,7 +228,8 @@
       query_count = 1
 
     for i in xrange(query_count):
-      queries.append(datastore.Query(self._entity, _app=self.__app))
+      queries.append(datastore.Query(self._entity, _app=self.__app,
+                                     keys_only=self._keys_only))
 
     logging.log(LOG_LEVEL,
                 'Binding with %i positional args %s and %i keywords %s'
@@ -552,6 +552,9 @@
     Raises:
       BadArgumentError if the filter is invalid (namely non-list with IN)
     """
+    if condition.lower() in ('!=', 'in') and self._keys_only:
+      raise datastore_errors.BadQueryError(
+        'Keys only queries do not support IN or != filters.')
 
     def CloneQueries(queries, n):
       """Do a full copy of the queries and append to the end of the queries.
@@ -675,6 +678,7 @@
 
   __iter__ = Run
 
+  __result_type_regex = re.compile(r'(\*|__key__)')
   __quoted_string_regex = re.compile(r'((?:\'[^\'\n\r]*\')+)')
   __ordinal_regex = re.compile(r':(\d+)$')
   __named_regex = re.compile(r':(\w+)$')
@@ -783,7 +787,8 @@
       True if parsing completed okay.
     """
     self.__Expect('SELECT')
-    self.__Expect('*')
+    result_type = self.__AcceptRegex(self.__result_type_regex)
+    self._keys_only = (result_type == '__key__')
     return self.__From()
 
   def __From(self):