heynemann / motorengine

Motorengine is a port of MongoEngine for Tornado.
http://motorengine.readthedocs.org
204 stars 67 forks source link

filter_not rewrites previous filters #111

Open ilex opened 8 years ago

ilex commented 8 years ago

It seems that in code as follow:

User.objects.filter(name="test").filter_not(email='test@gmail.com').find_all()

the first filter is ignored. I think it's because method filter_not just sets self._fitlers and does not do something like self._filters = self._fitlers & QNot(not_filter)

Also the test data to test such case is not good. Actually in file tests/test_document.py test method test_can_find_with_multiple_filters:

def test_can_find_with_multiple_filters(self):
        User.objects.create(email="heynemann@gmail.com", first_name="Bernardo", last_name="Heynemann", callback=self.stop)
        user = self.wait()

        User.objects.create(email="someone@gmail.com", first_name="Someone", last_name="Else", callback=self.stop)
        self.wait()

        User.objects.create(email="someone@gmail.com", first_name="Bernardo", last_name="Heynemann", callback=self.stop)
        self.wait()

        User.objects.create(email="other@gmail.com", first_name="Bernardo", last_name="Silva", callback=self.stop)
        last_user = self.wait()

        User.objects.filter(first_name="Bernardo").filter_not(email="someone@gmail.com").find_all(callback=self.stop)
        users = self.wait()

        expect(users).to_be_instance_of(list)
        expect(users).to_length(2)

        first_user = users[0]
        expect(first_user.first_name).to_equal(user.first_name)
        expect(first_user.last_name).to_equal(user.last_name)
        expect(first_user.email).to_equal(user.email)

        User.objects.filter(last_name="Silva").filter(first_name="Bernardo").find_all(callback=self.stop)
        users = self.wait()

        expect(users).to_be_instance_of(list)
        expect(users).to_length(1)
        expect(users[0]._id).to_equal(last_user._id)

if we change this:

User.objects.filter(first_name="Bernardo").filter_not(email="someone@gmail.com").find_all(callback=self.stop)

to this:

User.objects.filter_not(email="someone@gmail.com").find_all(callback=self.stop)

test will pass anyway.