示例#1
0
  def testQueryAttributes(self):
    q = query.Query(kind='Foo')
    self.assertEqual(q.kind, 'Foo')
    self.assertEqual(q.ancestor, None)
    self.assertEqual(q.filters, None)
    self.assertEqual(q.orders, None)

    key = model.Key('Barba', 'papa')
    q = query.Query(kind='Foo', ancestor=key)
    self.assertEqual(q.kind, 'Foo')
    self.assertEqual(q.ancestor, key)
    self.assertEqual(q.filters, None)
    self.assertEqual(q.orders, None)

    q = q.filter(Foo.rate == 1)
    self.assertEqual(q.kind, 'Foo')
    self.assertEqual(q.ancestor, key)
    self.assertEqual(q.filters, query.FilterNode('rate', '=', 1))
    self.assertEqual(q.orders, None)

    q = q.order(-Foo.name)
    self.assertEqual(q.kind, 'Foo')
    self.assertEqual(q.ancestor, key)
    self.assertEqual(q.filters, query.FilterNode('rate', '=', 1))
    expected_order = [('name', query.DESC)]
    self.assertEqual(query.orders_to_orderings(q.orders), expected_order)
示例#2
0
 def testGqlFilter(self):
   qry, options, bindings = query.parse_gql(
     "SELECT * FROM Kind WHERE prop1 = 1 AND prop2 = 'a'")
   self.assertEqual(qry.kind, 'Kind')
   self.assertEqual(qry.ancestor, None)
   self.assertEqual(qry.filters,
                    query.ConjunctionNode(
                      [query.FilterNode('prop1', '=', 1),
                       query.FilterNode('prop2', '=', 'a')]))
   self.assertEqual(qry.orders, None)
   self.assertEqual(bindings, {})
示例#3
0
 def testOrQuery(self):
   class Employee(model.Model):
     name = model.StringProperty()
     age = model.IntegerProperty('Age')
     rank = model.IntegerProperty()
   q = Employee.query().filter(query.OR(Employee.age >= 42))
   self.assertEqual(q.filters, query.FilterNode('Age', '>=', 42))
   q = Employee.query(query.OR(Employee.age < 42, Employee.rank > 5))
   self.assertEqual(q.filters,
                    query.DisjunctionNode(
                      query.FilterNode('Age', '<', 42),
                      query.FilterNode('rank', '>', 5)))
示例#4
0
 def testInFilter(self):
   class Employee(model.Model):
     name = model.StringProperty()
   q = Employee.query(Employee.name.IN(['a', 'b']))
   self.assertEqual(q.filters,
                    query.DisjunctionNode(
                      query.FilterNode('name', '=', 'a'),
                      query.FilterNode('name', '=', 'b')))
   a = Employee(name='a')
   a.put()
   b = Employee(name='b')
   b.put()
   self.assertEqual(list(q), [a, b])
示例#5
0
 def testGqlBindings(self):
   qry, options, bindings = query.parse_gql(
     'SELECT * FROM Kind WHERE prop1 = :1 AND prop2 = :foo')
   self.assertEqual(qry.kind, 'Kind')
   self.assertEqual(qry.ancestor, None)
   self.assertEqual(qry.filters,
                    query.ConjunctionNode(
                      [query.FilterNode('prop1', '=',
                                        query.Binding(None, 1)),
                       query.FilterNode('prop2', '=',
                                        query.Binding(None, 'foo'))]))
   self.assertEqual(qry.orders, None)
   self.assertEqual(bindings, {1: query.Binding(None, 1),
                               'foo': query.Binding(None, 'foo')})
示例#6
0
    def testAndQuery(self):
        class Employee(model.Model):
            name = model.StringProperty()
            age = model.IntegerProperty('Age')
            rank = model.IntegerProperty()

        q = Employee.query().filter(query.AND(Employee.age >= 42))
        self.assertEqual(q.filters, query.FilterNode('Age', '>=', 42))
        q = Employee.query(query.AND(Employee.age >= 42, Employee.rank <= 5))
        self.assertEqual(
            q.filters,
            query.ConjunctionNode([
                query.FilterNode('Age', '>=', 42),
                query.FilterNode('rank', '<=', 5)
            ]))
示例#7
0
 def testModernQuerySyntax(self):
   class Employee(model.Model):
     name = model.StringProperty()
     age = model.IntegerProperty('Age')
     rank = model.IntegerProperty()
     @classmethod
     def seniors(cls, min_age, min_rank):
       q = cls.query().filter(cls.age >= min_age, cls.rank <= min_rank)
       q = q.order(cls.name, -cls.age)
       return q
   q = Employee.seniors(42, 5)
   self.assertEqual(q.filters,
                    query.ConjunctionNode(
                      [query.FilterNode('Age', '>=', 42),
                       query.FilterNode('rank', '<=', 5)]))
   self.assertEqual(query.orders_to_orderings(q.orders),
                    [('name', query.ASC), ('Age', query.DESC)])
示例#8
0
 def testSingletonInFilter(self):
   class Employee(model.Model):
     name = model.StringProperty()
   q = Employee.query(Employee.name.IN(['xyzzy']))
   self.assertEqual(q.filters, query.FilterNode('name', '=', 'xyzzy'))
   self.assertNotEqual(q.filters, 42)
   e = Employee(name='xyzzy')
   e.put()
   self.assertEqual(q.get(), e)
示例#9
0
 def testNodeComparisons(self):
     a = query.FilterNode('foo', '=', 1)
     b = query.FilterNode('foo', '=', 1)
     c = query.FilterNode('foo', '=', 2)
     d = query.FilterNode('foo', '<', 1)
     # Don't use assertEqual/assertNotEqual; we want to be sure that
     # __eq__ or __ne__ is really called here!
     self.assertTrue(a == b)
     self.assertTrue(a != c)
     self.assertTrue(b != d)
     self.assertRaises(TypeError, lambda: a < b)
     self.assertRaises(TypeError, lambda: a <= b)
     self.assertRaises(TypeError, lambda: a > b)
     self.assertRaises(TypeError, lambda: a >= b)
     x = query.AND(a, b, c)
     y = query.AND(a, b, c)
     z = query.AND(a, d)
     self.assertTrue(x == y)
     self.assertTrue(x != z)
示例#10
0
    def send_rfps_to_subscribers(self):
        """
            As the function name implies, all subscribed users will receive an RFP update to their
            email accounts. By comparing an RFP's parse date to a subscription's last update date,
            we ensure dups aren't being sent out.

            Returns a list of results based on what happened for each subscription.

        """

        results = []
        subs = Subscription.all()
        for sub in subs:

            try:

                # Grab what user info, add first, last name later
                user = User.query(
                    query.FilterNode('username', '=', sub.username)).get()

                # Ensure the the sub's username is associated with an actual account
                # by checking if the email exists.
                if user.email:
                    self._send_rfps_to_subscribers(sub, user.first_name,
                                                   user.email, results)
                else:
                    msg = 'No email found for username: %s  and keyword: %s' % (
                        sub.username, sub.keyword)

                    logging.info(msg)
                    results.append('Error: ' + msg)
            except:
                msg = 'Problem with sending RFPs for some subscription, maybe bad user object'
                logging.info(msg)
                results.append('Error: ' + msg)

        return results