def _GetQueryCursor(self, query, filters, orders, index_list): app_id = query.app() namespace = query.name_space() pseudo_kind = None if query.has_kind() and query.kind() in self._pseudo_kinds: pseudo_kind = self._pseudo_kinds[query.kind()] self.__entities_lock.acquire() try: app_ns = datastore_types.EncodeAppIdNamespace(app_id, namespace) if pseudo_kind: (results, filters, orders) = pseudo_kind.Query(query, filters, orders) elif query.has_kind(): results = [entity.protobuf for entity in self.__entities_by_kind[app_ns, query.kind()].values()] else: results = [] for (cur_app_ns, _), entities in self.__entities_by_kind.iteritems(): if cur_app_ns == app_ns: results.extend(entity.protobuf for entity in entities.itervalues()) except KeyError: results = [] finally: self.__entities_lock.release() return datastore_stub_util._ExecuteQuery(results, query, filters, orders, index_list)
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ namespace_range = datastore_stub_util.ParseNamespaceQuery(query, filters, orders) app_str = query.app() namespace_entities = [] namespaces = self.sqlitestub._DatastoreSqliteStub__namespaces for app_id, namespace in sorted(namespaces): if app_id == app_str and namespace_range.Contains(namespace): if namespace: ns_id = namespace else: ns_id = datastore_types._EMPTY_NAMESPACE_ID namespace_entities.append(MakeEntityForQuery(query, self.name, ns_id)) return datastore_stub_util._ExecuteQuery(namespace_entities, query, [], [], [])
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ namespace_range = datastore_stub_util.ParseNamespaceQuery( query, filters, orders) app_str = query.app() namespace_entities = [] namespaces = self._stub._DatastoreSqliteStub__namespaces for app_id, namespace in sorted(namespaces): if app_id == app_str and namespace_range.Contains(namespace): if namespace: ns_id = namespace else: ns_id = datastore_types._EMPTY_NAMESPACE_ID namespace_entities.append( MakeEntityForQuery(query, self.name, ns_id)) return datastore_stub_util._ExecuteQuery(namespace_entities, query, [], [], [])
def _GetQueryCursor(self, query, filters, orders, index_list): app_id = query.app() namespace = query.name_space() pseudo_kind = None if query.has_kind() and query.kind() in self._pseudo_kinds: pseudo_kind = self._pseudo_kinds[query.kind()] self.__entities_lock.acquire() try: app_ns = datastore_types.EncodeAppIdNamespace(app_id, namespace) if pseudo_kind: (results, filters, orders) = pseudo_kind.Query(query, filters, orders) elif query.has_kind(): results = [ entity.protobuf for entity in self.__entities_by_kind[ app_ns, query.kind()].values() ] else: results = [] for (cur_app_ns, _), entities in self.__entities_by_kind.iteritems(): if cur_app_ns == app_ns: results.extend(entity.protobuf for entity in entities.itervalues()) except KeyError: results = [] finally: self.__entities_lock.release() return datastore_stub_util._ExecuteQuery(results, query, filters, orders, index_list)
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ kind_range = datastore_stub_util.ParseKindQuery(query, filters, orders) conn = self._stub._GetConnection() cursor = None try: prefix = self._stub._GetTablePrefix(query) filters = [] def AddExtremeFilter(extreme, inclusive, is_end): """Add filter for kind start/end.""" if not is_end: if inclusive: op = datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.GREATER_THAN else: if inclusive: op = datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.LESS_THAN filters.append(('kind', op, extreme)) kind_range.MapExtremes(AddExtremeFilter) params = [] sql_filters = self._stub._CreateFilterString(filters, params) sql_stmt = ('SELECT kind FROM "%s!Entities" %s GROUP BY kind' % (prefix, sql_filters)) c = conn.execute(sql_stmt, params) kinds = [] for row in c.fetchall(): kinds.append( MakeEntityForQuery(query, self.name, ToUtf8(row[0]))) cursor = datastore_stub_util._ExecuteQuery(kinds, query, [], [], []) finally: self._stub._ReleaseConnection(conn) return cursor
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ kind_range = datastore_stub_util.ParseKindQuery(query, filters, orders) conn = self._stub._GetConnection() cursor = None try: prefix = self._stub._GetTablePrefix(query) filters = [] def AddExtremeFilter(extreme, inclusive, is_end): """Add filter for kind start/end.""" if not is_end: if inclusive: op = datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.GREATER_THAN else: if inclusive: op = datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.LESS_THAN filters.append(('kind', op, extreme)) kind_range.MapExtremes(AddExtremeFilter) params = [] sql_filters = self._stub._CreateFilterString(filters, params) sql_stmt = ('SELECT kind FROM "%s!Entities" %s GROUP BY kind' % (prefix, sql_filters)) c = conn.execute(sql_stmt, params) kinds = [] for row in c.fetchall(): kinds.append(MakeEntityForQuery(query, self.name, ToUtf8(row[0]))) records = map(datastore_stub_util.EntityRecord, kinds) cursor = datastore_stub_util._ExecuteQuery(records, query, [], [], []) finally: self._stub._ReleaseConnection(conn) return cursor
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ property_range = datastore_stub_util.ParsePropertyQuery( query, filters, orders) keys_only = query.keys_only() conn = self._stub._GetConnection() cursor = None try: prefix = self._stub._GetTablePrefix(query) filters = [] def AddExtremeFilter(extreme, inclusive, is_end): """Add filter for kind start/end.""" if not is_end: op = datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL filters.append(('kind', op, extreme[0])) property_range.MapExtremes(AddExtremeFilter) for name in datastore_stub_util.GetInvisibleSpecialPropertyNames(): filters.append(('name', '!=', name)) params = [] sql_filters = self._stub._CreateFilterString(filters, params) if not keys_only: sql_stmt = ( 'SELECT kind, name, value FROM "%s!EntitiesByProperty" %s ' 'GROUP BY kind, name, substr(value, 1, 1) ' 'ORDER BY kind, name' % (prefix, sql_filters)) else: sql_stmt = ( 'SELECT kind, name FROM "%s!EntitiesByProperty" %s ' 'GROUP BY kind, name ORDER BY kind, name' % (prefix, sql_filters)) c = conn.execute(sql_stmt, params) properties = [] kind = None name = None property_pb = None for row in c.fetchall(): if not (row[0] == kind and row[1] == name): if not property_range.Contains((row[0], row[1])): continue kind, name = row[:2] if property_pb: properties.append(property_pb) property_pb = MakeEntityForQuery(query, KindPseudoKind.name, ToUtf8(kind), self.name, ToUtf8(name)) if not keys_only: value_data = row[2] value_decoder = sortable_pb_encoder.Decoder( array.array('B', str(value_data))) raw_value_pb = entity_pb.PropertyValue() raw_value_pb.Merge(value_decoder) tag = datastore_types.GetPropertyValueTag(raw_value_pb) tag_name = datastore_stub_util._PROPERTY_TYPE_NAMES[tag] representation_pb = property_pb.add_property() representation_pb.set_name('property_representation') representation_pb.set_multiple(True) representation_pb.mutable_value().set_stringvalue(tag_name) if property_pb: properties.append(property_pb) cursor = datastore_stub_util._ExecuteQuery(properties, query, [], [], []) finally: self._stub._ReleaseConnection(conn) return cursor
def Query(self, query, filters, orders): """Perform a query on this pseudo-kind. Args: query: the original datastore_pb.Query filters: the filters from query orders: the orders from query Returns: A query cursor to iterate over the query results, or None if the query is invalid. """ property_range = datastore_stub_util.ParsePropertyQuery(query, filters, orders) keys_only = query.keys_only() conn = self.sqlitestub._GetConnection() cursor = None try: prefix = self.sqlitestub._GetTablePrefix(query) filters = [] def AddExtremeFilter(extreme, inclusive, is_end): """Add filter for kind start/end.""" if not is_end: op = datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL else: op = datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL filters.append(('kind', op, extreme[0])) property_range.MapExtremes(AddExtremeFilter) for name in datastore_stub_util.GetInvisibleSpecialPropertyNames(): filters.append(('name', '!=', name)) params = [] sql_filters = self.sqlitestub._CreateFilterString(filters, params) if not keys_only: sql_stmt = ('SELECT kind, name, value FROM "%s!EntitiesByProperty" %s ' 'GROUP BY kind, name, substr(value, 1, 1) ' 'ORDER BY kind, name' % (prefix, sql_filters)) else: sql_stmt = ('SELECT kind, name FROM "%s!EntitiesByProperty" %s ' 'GROUP BY kind, name ORDER BY kind, name' % (prefix, sql_filters)) c = conn.execute(sql_stmt, params) properties = [] kind = None name = None property_pb = None for row in c.fetchall(): if not (row[0] == kind and row[1] == name): if not property_range.Contains((row[0], row[1])): continue kind, name = row[:2] if property_pb: properties.append(property_pb) property_pb = MakeEntityForQuery(query, KindPseudoKind.name, ToUtf8(kind), self.name, ToUtf8(name)) if not keys_only: value_data = row[2] value_decoder = sortable_pb_encoder.Decoder( array.array('B', str(value_data))) raw_value_pb = entity_pb.PropertyValue() raw_value_pb.Merge(value_decoder) tag = datastore_types.GetPropertyValueTag(raw_value_pb) tag_name = datastore_stub_util._PROPERTY_TYPE_NAMES[tag] representation_pb = property_pb.add_property() representation_pb.set_name(u'property_representation') representation_pb.set_multiple(True) representation_pb.mutable_value().set_stringvalue(tag_name) if property_pb: properties.append(property_pb) cursor = datastore_stub_util._ExecuteQuery(properties, query, [], [], []) finally: self.sqlitestub._ReleaseConnection(conn) return cursor