Skip to content
This repository was archived by the owner on Dec 25, 2023. It is now read-only.
This repository was archived by the owner on Dec 25, 2023. It is now read-only.

Filtering nested StructuredProperty doesn't work #286

@patelnav

Description

@patelnav

According to the documentation here, I should be able to match multiple properties on a (repeated) StructuredProperty in my query. If, however, I nest the property inside another StructuredProperty (not repeatedly) the query fails.

NB: Ignore the dummy parent, I put it there so we can run this code consistently

from google.appengine.ext import ndb
from pprint import pprint


class DummyParent(ndb.Model):
    pass

class Address(ndb.Model):
    city = ndb.StringProperty()
    state = ndb.StringProperty()


class Place(ndb.Model):
    address = ndb.StructuredProperty(Address, required=True)
    tag = ndb.StringProperty()


class Contact(ndb.Model):
    fullname = ndb.StringProperty()
    places = ndb.StructuredProperty(Place, repeated=True)


dummy_key = ndb.Key(DummyParent, '123')

c1 = Contact(parent=dummy_key,
             fullname='American Man',
             places=[
                Place(address=Address(city='Vancouver', state='Washington'), tag='Hometown'),
                Place(address=Address(city='Mountain View', state='California'), tag='Work')
                ])

c1.put()

c2 = Contact(parent=dummy_key,
             fullname='Canadian Expat',
             places=[
                Place(address=Address(city='Vancouver', state='British Columbia'), tag='Hometown'),
                Place(address=Address(city='Seattle', state='Washington'), tag='Work')
             ])
c2.put()

print "BEWARE! This wont work!"

for c in Contact.query(Contact.places.address.city == "Vancouver",
                       Contact.places.address.state == "Washington",
                       ancestor=dummy_key):
    pprint(c.to_dict())

print "Query using Address, Still returns Canadian Expat:"

for c in Contact.query(Contact.places.address == Address(city="Vancouver",
                                                         state="Washington"),
                       ancestor=dummy_key):
    pprint(c.to_dict())

print "Query using Place, Still returns Canadian Expat!:"

for c in Contact.query(Contact.places == Place(address=Address(
                                               city="Vancouver",
                                               state="Washington")),
                       ancestor=dummy_key):
    pprint(c.to_dict())

Here's the output:

BEWARE!
{'fullname': u'Canadian Expat',
 'places': [{'address': {'city': u'Vancouver', 'state': u'British Columbia'},
             'tag': u'Hometown'},
            {'address': {'city': u'Seattle', 'state': u'Washington'},
             'tag': u'Work'}]}
{'fullname': u'American Man',
 'places': [{'address': {'city': u'Vancouver', 'state': u'Washington'},
             'tag': u'Hometown'},
            {'address': {'city': u'Mountain View', 'state': u'California'},
             'tag': u'Work'}]}
COMBINED! STILL NOT WORKING!
{'fullname': u'Canadian Expat',
 'places': [{'address': {'city': u'Vancouver', 'state': u'British Columbia'},
             'tag': u'Hometown'},
            {'address': {'city': u'Seattle', 'state': u'Washington'},
             'tag': u'Work'}]}
{'fullname': u'American Man',
 'places': [{'address': {'city': u'Vancouver', 'state': u'Washington'},
             'tag': u'Hometown'},
            {'address': {'city': u'Mountain View', 'state': u'California'},
             'tag': u'Work'}]}
COMBINED SOME MORE! STILL NOT WORKING!
{'fullname': u'Canadian Expat',
 'places': [{'address': {'city': u'Vancouver', 'state': u'British Columbia'},
             'tag': u'Hometown'},
            {'address': {'city': u'Seattle', 'state': u'Washington'},
             'tag': u'Work'}]}
{'fullname': u'American Man',
 'places': [{'address': {'city': u'Vancouver', 'state': u'Washington'},
             'tag': u'Hometown'},
            {'address': {'city': u'Mountain View', 'state': u'California'},
             'tag': u'Work'}]}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions