diff --git a/tests/test_query.py b/tests/test_query.py index cf9f45e0bab2e17683439a5f8546600dfdc38c53..2c262cb9d68b60257f39cd44ae70a45732f09b8b 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -1334,3 +1334,80 @@ def test_find_query_default_role(): db.administration.set_server_property("FIND_QUERY_DEFAULT_ROLE", "asdf") with raises(TransactionError): assert db.execute_query("FIND Test*", unique=True).id == rec.id + + +def test_query_paging(): + test_query = "FIND RECORDTYPE TestRT*" + + # insert 20 entities + for i in range(20): + db.RecordType(f"TestRT{i}").insert() + + assert len(db.execute_query(test_query)) == 20 + + # paging off + assert isinstance(db.execute_query(test_query, page_length=0), db.Container) + assert isinstance(db.execute_query(test_query, page_length=-1), db.Container) + assert isinstance(db.execute_query(test_query, page_length=False), db.Container) + assert isinstance(db.execute_query(test_query, page_length=None), db.Container) + assert isinstance( + db.execute_query( + test_query + + " WITH name=TestRT0", + page_length=10, + unique=True), + db.RecordType) + assert isinstance(db.execute_query("COUNT RECORDTYPE", page_length=10), int) + + # zero pages + assert len([page for page in db.execute_query( + test_query + " WITH unmet_condition", page_length=109)]) == 0 + # two pages + assert len([page for page in db.execute_query(test_query, page_length=10)]) == 2 + assert len([page for page in db.execute_query(test_query, page_length=11)]) == 2 + assert len([page for page in db.execute_query(test_query, page_length=19)]) == 2 + # one page + assert len([page for page in db.execute_query(test_query, page_length=20)]) == 1 + assert len([page for page in db.execute_query(test_query, page_length=100)]) == 1 + + # concat + assert len([entity for page in db.execute_query(test_query, page_length=10) + for entity in page]) == 20 + + # concat zero pages + assert len([entity for page in db.execute_query( + test_query + " WITH unmet_condition", page_length=10) + for entity in page]) == 0 + + # this kind of update is allowed + for entity in [entity for page in db.execute_query( + test_query, page_length=10) for entity in page]: + entity.description = "updated" + entity.update() + + # as well as this + container = db.Container().extend( + [entity for page in db.execute_query(test_query, page_length=10) for entity in page]) + for entity in container: + entity.description = "updated 2" + container.update() + + # but not this + with raises(db.exceptions.PagingConsistencyError): + for page in db.execute_query(test_query, page_length=10): + for entity in page: + entity.description = "update not allowed" + entity.update() + + # not ideal: the first page has been written: + pages = db.execute_query(test_query, page_length=10) + for entity in next(pages): + assert entity.description == "update not allowed" + for entity in next(pages): + assert entity.description == "updated 2" + + # the above pattern is ok if you don't write, tho + for page in db.execute_query(test_query, page_length=10): + for entity in page: + assert entity.description is not None + # don't: entity.update()