Пример #1
0
 def test_varargs(self):
     # Works for lists too
     self.assertEqual(self._q(query.add([2, 3, 5])), 10)
     # Works for a variable equal to a list
     self.assertEqual(
         self._q(query.let({"x": [2, 3, 5]}, query.add(query.var("x")))),
         10)
Пример #2
0
  def test_lambda_query(self):
    invalid_lambda = lambda: query.add(1, 2)
    self.assertRaises(ValueError,
                      lambda: self._q(query.map_(query.lambda_query(invalid_lambda), [])))

    expr = query.map_(query.lambda_query(lambda a: query.add(a, 1)),
                      [1, 2, 3])
    self.assertEqual(self._q(expr), [2, 3, 4])
 def test_lambda_expr(self):
     self.assertJson(query.lambda_("a", query.var("a")),
                     '{"expr":{"var":"a"},"lambda":"a"}')
     self.assertJson(
         query.lambda_(["a", "b"], query.add(query.var("a"),
                                             query.var("b"))),
         '{"expr":{"add":[{"var":"a"},{"var":"b"}]},"lambda":["a","b"]}')
 def test_lambda_query(self):
     #pylint: disable=unnecessary-lambda
     self.assertJson(query.lambda_query(lambda a: a),
                     '{"expr":{"var":"a"},"lambda":"a"}')
     self.assertJson(
         query.lambda_query(lambda a, b: query.add(a, b)),
         '{"expr":{"add":[{"var":"a"},{"var":"b"}]},"lambda":["a","b"]}')
Пример #5
0
    def test_count_mean_sum(self):
        data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        self._q(query.create_collection({"name": "countmeansum_test"}))
        self._q(
            query.create_index({
                "name": "countmeansum_idx",
                "source": query.collection("countmeansum_test"),
                "active": True,
                "values": [{
                    "field": ["data", "value"]
                }]
            }))
        self._q(
            query.foreach(
                query.lambda_(
                    "x",
                    query.create(
                        query.collection("countmeansum_test"),
                        {"data": {
                            "value": query.add(query.var("x"), 2)
                        }})), data))

        m = query.match(query.index("countmeansum_idx"))
        expected = [9, 5.0, 45, 9, 7.0, 63]

        self.assertEqual(
            self._q([
                query.count(data),
                query.mean(data),
                query.sum(data),
                query.count(m),
                query.mean(m),
                query.sum(m)
            ]), expected)
Пример #6
0
  def test_reduce(self):
    data1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    data2 = ["Fauna", "DB", " ", "rocks"]

    q1 = query.reduce(query.lambda_query(lambda accum, value: query.add(query.var("accum"), query.var("value"))), 0, data1)
    q2 = query.reduce(query.lambda_query(lambda accum, value: query.concat([query.var("accum"), query.var("value")])), "", data2)

    self.assertEqual(self._q(q1), 45)
    self.assertEqual(self._q(q2), "FaunaDB rocks")
Пример #7
0
def processMatchCounter():
    resp = client.query(
        q.let(
            {'currVal': q.select(['data', 'data'], q.get(q.ref(q.collection('match_aggregate_info'), getIntValue('match_count'))))},
            q.update(
                q.ref(
                    q.collection('match_aggregate_info'),
                    getIntValue('match_count')
                ),
                {
                    "data": {
                        "data": q.add(1, q.var('currVal'))
                    }
                }
            )
        )
    )

    return getDataFromRef(resp)
Пример #8
0
def create_transaction(client, num_customers, max_txn_amount):
    #
    # This method is going to create a random transaction that moves a random amount
    # from a source customer to a destination customer. Prior to committing the transaction
    # a check will be performed to insure that the source customer has a sufficient balance
    # to cover the amount and not go into an overdrawn state.
    #
    uuid = uuid4().urn[9:]

    source_id = randint(1, num_customers)
    dest_id = randint(1, num_customers)
    while dest_id == source_id:
        dest_id = randint(1, num_customers)
    amount = randint(1, max_txn_amount)

    transaction = {"uuid": uuid, "sourceCust": source_id, "destCust": dest_id , "amount": amount}

    res = client.query(
        q.let(
            {"source_customer": q.get(q.match(q.index("customer_by_id"), source_id)),
             "dest_customer": q.get(q.match(q.index("customer_by_id"), dest_id))},
            q.let(
                {"source_balance": q.select(["data", "balance"], q.var("source_customer")),
                 "dest_balance": q.select(["data", "balance"], q.var("dest_customer"))},
                q.let(
                    {"new_source_balance": q.subtract(q.var("source_balance"), amount),
                     "new_dest_balance": q.add(q.var("dest_balance"), amount)},
                    q.if_(
                        q.gte(q.var("new_source_balance"), 0),
                        q.do(
                            q.create(q.class_("transactions"), {"data": transaction}),
                            q.update(q.select("ref", q.var("source_customer")),
                                     {"data": {"txnID": uuid, "balance": q.var("new_source_balance")}}),
                            q.update(q.select("ref", q.var("dest_customer")),
                                     {"data": {"txnID": uuid, "balance": q.var("new_dest_balance")}})
                        ),
                        "Error. Insufficient funds."
                    )
                )
            )
        )
    )
 def test_do(self):
     self.assertJson(query.do(query.add(1, 2), query.var("x")),
                     '{"do":[{"add":[1,2]},{"var":"x"}]}')
     self.assertJson(query.do(1), '{"do":[1]}')
     self.assertJson(query.do(1, 2), '{"do":[1,2]}')
     self.assertJson(query.do([1, 2]), '{"do":[[1,2]]}')
 def test_add(self):
     self.assertJson(query.add(1), '{"add":1}')
     self.assertJson(query.add(1, 2, 3), '{"add":[1,2,3]}')
     self.assertJson(query.add([1, 2, 3]), '{"add":[1,2,3]}')
 def test_reduce(self):
     expected = '{"collection":[1,2,3,4,5,6,7,8,9],"initial":0,"reduce":{"expr":{"add":[{"var":"accum"},{"var":"val"}]},"lambda":["accum","val"]}}'
     col = [1, 2, 3, 4, 5, 6, 7, 8, 9]
     lambda_ = query.lambda_query(lambda accum, val: query.add(accum, val))
     initial = 0
     self.assertJson(query.reduce(lambda_, initial, col), expected)
Пример #12
0
 def test_lambda_query_multiple_args(self):
     #pylint: disable=unnecessary-lambda
     expr = query.map_(query.lambda_query(lambda a, b: query.add(a, b)),
                       [[1, 1], [2, 2], [3, 3]])
     self.assertEqual(self._q(expr), [2, 4, 6])
Пример #13
0
 def test_add(self):
     self.assertEqual(self._q(query.add(2, 3, 5)), 10)
     self._assert_bad_query(query.add())
Пример #14
0
 def test_query_error(self):
     self._assert_query_error(add(1, "two"), BadRequest, "invalid argument",
                              ["add", 1])
Пример #15
0
    def subscribe_to_anime(self, anime_link: str):
        try:
            # create a new anime document
            anime_info = anime_alarm.utils.GGAScraper().get_anime_info(
                anime_link)

            print(anime_info['anime_id'])

            result = client.query(
                q.let(
                    {
                        'user_anime_list':
                        q.select(['data', 'animes_watching'],
                                 q.get(q.ref(q.collection(users),
                                             self.chat_id))),
                    },
                    q.if_(
                        # check if this anime exists in the db
                        q.exists(
                            q.match(q.index(anime_by_id),
                                    anime_info['anime_id'])),

                        # if it exists...
                        q.let(
                            {
                                'anime_ref':
                                q.select(
                                    'ref',
                                    q.get(
                                        q.match(q.index(anime_by_id),
                                                anime_info['anime_id'])))
                            },
                            q.if_(
                                # check if user has subscribed to this anime already
                                q.contains_value(q.var('anime_ref'),
                                                 q.var('user_anime_list')),
                                'This anime is already on your watch list!',
                                q.do(
                                    q.update(
                                        q.ref(q.collection(users),
                                              self.chat_id),
                                        {
                                            'data': {
                                                'animes_watching':
                                                q.append(
                                                    q.var('user_anime_list'),
                                                    [q.var('anime_ref')])
                                            }
                                        }),
                                    q.update(
                                        q.var('anime_ref'), {
                                            'data': {
                                                'followers':
                                                q.add(
                                                    q.select([
                                                        'data', 'followers'
                                                    ], q.get(
                                                        q.var('anime_ref'))),
                                                    1)
                                            }
                                        }),
                                ))),
                        q.let(
                            {'new_anime_id': q.new_id()},
                            q.do(
                                # create new anime document
                                q.create(
                                    q.ref(q.collection(animes),
                                          q.var('new_anime_id')),
                                    {
                                        'data': {
                                            'title':
                                            anime_info['title'],
                                            'followers':
                                            1,
                                            'link':
                                            anime_link,
                                            'anime_id':
                                            anime_info['anime_id'],
                                            'anime_alias':
                                            anime_info['anime_alias'],
                                            'episodes':
                                            anime_info['number_of_episodes'],
                                            'last_episode': {
                                                'link':
                                                anime_info[
                                                    'latest_episode_link'],
                                                'title':
                                                anime_info[
                                                    'latest_episode_title'],
                                            },
                                        }
                                    }),
                                # add to user's list of subscribed animes
                                q.update(
                                    q.ref(q.collection(users), self.chat_id), {
                                        'data': {
                                            'animes_watching':
                                            q.append(
                                                q.var('user_anime_list'), [
                                                    q.ref(
                                                        q.collection(animes),
                                                        q.var('new_anime_id'))
                                                ])
                                        }
                                    }),
                            )))))

            if isinstance(result, str):
                updater.bot.send_message(chat_id=self.chat_id, text=result)
            else:
                updater.bot.send_message(
                    chat_id=self.chat_id,
                    text='You are now listening for updates on ' +
                    anime_info['title'])
        except Exception as err:
            log_error(err)