def test_ancestor_with_property_filter(): key = key_module.Key("Foo", 123) foo = model.StringProperty("foo") query = query_module.QueryOptions(ancestor=key, filters=foo == "bar") query_pb = _datastore_query._query_to_protobuf(query) filter_pb = query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="foo"), op=query_pb2.PropertyFilter.EQUAL, value=entity_pb2.Value(string_value="bar"), ) ancestor_pb = query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="__key__"), op=query_pb2.PropertyFilter.HAS_ANCESTOR, ) ancestor_pb.value.key_value.CopyFrom(key._key.to_protobuf()) expected_pb = query_pb2.Query( filter=query_pb2.Filter( composite_filter=query_pb2.CompositeFilter( op=query_pb2.CompositeFilter.AND, filters=[ query_pb2.Filter(property_filter=filter_pb), query_pb2.Filter(property_filter=ancestor_pb), ], ) ) ) assert query_pb == expected_pb
def _filter_pb(filter_pb): """Convenience function to compose a filter protocol buffer. The Datastore protocol uses a Filter message which has one of either a PropertyFilter or CompositeFilter as a sole attribute. Args: filter_pb (Union[query_pb2.CompositeFilter, query_pb2.PropertyFilter]): The actual filter. Returns: query_pb2.Filter: The filter at the higher level of abstraction required to use it in a query. """ if isinstance(filter_pb, query_pb2.CompositeFilter): return query_pb2.Filter(composite_filter=filter_pb) return query_pb2.Filter(property_filter=filter_pb)
def test_ancestor(): key = key_module.Key("Foo", 123) query = query_module.QueryOptions(ancestor=key) expected_pb = query_pb2.Query(filter=query_pb2.Filter( property_filter=query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="__key__"), op=query_pb2.PropertyFilter.HAS_ANCESTOR, ))) expected_pb.filter.property_filter.value.key_value.CopyFrom( key._key.to_protobuf()) assert _datastore_query._query_to_protobuf(query) == expected_pb
def test_filter_pb(): foo = model.StringProperty("foo") query = query_module.QueryOptions(kind="Foo", filters=(foo == "bar")) query_pb = _datastore_query._query_to_protobuf(query) filter_pb = query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="foo"), op=query_pb2.PropertyFilter.EQUAL, value=entity_pb2.Value(string_value="bar"), ) expected_pb = query_pb2.Query( kind=[query_pb2.KindExpression(name="Foo")], filter=query_pb2.Filter(property_filter=filter_pb), ) assert query_pb == expected_pb
def test_make_composite_and_filter(): filters = [ query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="harry"), op=query_pb2.PropertyFilter.EQUAL, value=entity_pb2.Value(string_value="Harold"), ), query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name="josie"), op=query_pb2.PropertyFilter.EQUAL, value=entity_pb2.Value(string_value="Josephine"), ), ] expected = query_pb2.CompositeFilter( op=query_pb2.CompositeFilter.AND, filters=[ query_pb2.Filter(property_filter=sub_filter) for sub_filter in filters ], ) assert _datastore_query.make_composite_and_filter(filters) == expected