1+ from packaging import version
2+
13from arango .exceptions import (
24 AQLCacheClearError ,
35 AQLCacheConfigureError ,
@@ -26,37 +28,60 @@ def test_aql_attributes(db, username):
2628 assert repr (db .aql .cache ) == f"<AQLQueryCache in { db .name } >"
2729
2830
29- def test_aql_query_management (db , bad_db , col , docs ):
30- plan_fields = [
31+ def test_aql_query_management (db_version , db , bad_db , col , docs ):
32+ explain_fields = [
3133 "estimatedNrItems" ,
3234 "estimatedCost" ,
3335 "rules" ,
3436 "variables" ,
3537 "collections" ,
38+ "stats" ,
3639 ]
40+ stats_fields = {
41+ "0.0.0" : [
42+ "rulesExecuted" ,
43+ "rulesSkipped" ,
44+ "plansCreated" ,
45+ ],
46+ "3.10.4" : [
47+ "peakMemoryUsage" ,
48+ "executionTime" ,
49+ ],
50+ }
51+
3752 # Test explain invalid query
3853 with assert_raises (AQLQueryExplainError ) as err :
3954 db .aql .explain ("INVALID QUERY" )
4055 assert err .value .error_code == 1501
4156
4257 # Test explain valid query with all_plans set to False
43- plan = db .aql .explain (
58+ explain = db .aql .explain (
4459 f"FOR d IN { col .name } RETURN d" ,
4560 all_plans = False ,
4661 opt_rules = ["-all" , "+use-index-range" ],
4762 )
48- assert all (field in plan for field in plan_fields )
63+ assert all (field in explain for field in explain_fields )
64+ for v , fields in stats_fields .items ():
65+ if db_version >= version .parse (v ):
66+ assert all (field in explain ["stats" ] for field in fields )
67+ else :
68+ assert all (field not in explain ["stats" ] for field in fields )
4969
5070 # Test explain valid query with all_plans set to True
51- plans = db .aql .explain (
71+ explanations = db .aql .explain (
5272 f"FOR d IN { col .name } RETURN d" ,
5373 all_plans = True ,
5474 opt_rules = ["-all" , "+use-index-range" ],
5575 max_plans = 10 ,
5676 )
57- for plan in plans :
58- assert all (field in plan for field in plan_fields )
59- assert len (plans ) < 10
77+ for explain in explanations :
78+ assert all (field in explain for field in explain_fields )
79+ for v , fields in stats_fields .items ():
80+ if db_version >= version .parse (v ):
81+ assert all (field in explain ["stats" ] for field in fields )
82+ else :
83+ assert all (field not in explain ["stats" ] for field in fields )
84+ assert len (explanations ) < 10
6085
6186 # Test validate invalid query
6287 with assert_raises (AQLQueryValidateError ) as err :
@@ -161,7 +186,7 @@ def test_aql_query_management(db, bad_db, col, docs):
161186 assert new_tracking ["track_bind_vars" ] is True
162187 assert new_tracking ["track_slow_queries" ] is True
163188
164- # Kick off some long lasting queries in the background
189+ # Kick off some long- lasting queries in the background
165190 db .begin_async_execution ().aql .execute ("RETURN SLEEP(100)" )
166191 db .begin_async_execution ().aql .execute ("RETURN SLEEP(50)" )
167192
@@ -174,6 +199,8 @@ def test_aql_query_management(db, bad_db, col, docs):
174199 assert "state" in query
175200 assert "bind_vars" in query
176201 assert "runtime" in query
202+ if db_version >= version .parse ("3.11" ):
203+ assert "peak_memory_usage" in query
177204 assert len (queries ) == 2
178205
179206 # Test list queries with bad database
0 commit comments