def test_compound_pk_token_function(self): class TestModel(Model): p1 = columns.Text(partition_key=True) p2 = columns.Text(partition_key=True) func = functions.Token('a', 'b') q = TestModel.objects.filter(pk__token__gt=func) where = q._where[0] where.set_context_id(1) self.assertEqual( str(where), 'token("p1", "p2") > token(%({0})s, %({1})s)'.format(1, 2)) # Verify that a SELECT query can be successfully generated str(q._select_query()) # Token(tuple()) is also possible for convenience # it (allows for Token(obj.pk) syntax) func = functions.Token(('a', 'b')) q = TestModel.objects.filter(pk__token__gt=func) where = q._where[0] where.set_context_id(1) self.assertEqual( str(where), 'token("p1", "p2") > token(%({0})s, %({1})s)'.format(1, 2)) str(q._select_query()) # The 'pk__token' virtual column may only be compared to a Token self.assertRaises(query.QueryException, TestModel.objects.filter, pk__token__gt=10) # A Token may only be compared to the `pk__token' virtual column func = functions.Token('a', 'b') self.assertRaises(query.QueryException, TestModel.objects.filter, p1__gt=func) # The # of arguments to Token must match the # of partition keys func = functions.Token('a') self.assertRaises(query.QueryException, TestModel.objects.filter, pk__token__gt=func)
def test_token_function(self): """ Tests that token functions work properly """ assert TokenTestModel.objects().count() == 0 for i in range(10): TokenTestModel.create(key=i, val=i) assert TokenTestModel.objects().count() == 10 seen_keys = set() last_token = None for instance in TokenTestModel.objects().limit(5): last_token = instance.key seen_keys.add(last_token) assert len(seen_keys) == 5 for instance in TokenTestModel.objects( pk__token__gt=functions.Token(last_token)): seen_keys.add(instance.key) assert len(seen_keys) == 10 assert all([i in seen_keys for i in range(10)]) # pk__token equality r = TokenTestModel.objects(pk__token=functions.Token(last_token)) self.assertEqual(len(r), 1)
def test_named_table_pk_token_function(self): """ Test to ensure that token function work with named tables. @since 3.2 @jira_ticket PYTHON-272 @expected_result partition key token functions should all for pagination. Prior to Python-272 this would fail with an AttributeError @test_category object_mapper """ for i in range(5): TokenTestModel.create(key=i, val=i) named = NamedTable(DEFAULT_KEYSPACE, TokenTestModel.__table_name__) query = named.objects.all().limit(1) first_page = list(query) last = first_page[-1] self.assertTrue(len(first_page) is 1) next_page = list(query.filter(pk__token__gt=functions.Token(last.key))) self.assertTrue(len(next_page) is 1)
def paginate(self, limit: int, offset: str = None, search: str = ''): total = self._model.objects.count() last_page = math.ceil(total / limit) if total > 0 else 1 next_page = None data = [] if total > 0: query = self._model.objects.all().limit(limit) if offset is not None: query = query.filter(pk__token__gt=functions.Token(offset)) data = list(query) if len(data) > 0: last = data[-1] next_page = f'?limit={limit}&offset={last.pk}&search={search}' return PaginationResponse(total=total, limit=limit, offset=offset, last_page=last_page, next_page_link=next_page, data=data)