Skip to content

Commit c3e799f

Browse files
committed
perf: improve query memory usage of collect fields
Instead of collecting { root, obj } pairs in a list, we now generate the whole collect result including field selection in one subquery. Also, we try to avoid unnecessary subqueries because they pass down items in registers and sometimes copy the values for that. This increased complexity of the AQL generation of a TraversalQueryNode, but it generates much more natural AQL queries as a result that have better runtime performance in ArangoDB.
1 parent 12c70c0 commit c3e799f

File tree

89 files changed

+2773
-1468
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+2773
-1468
lines changed

spec/regression/collect/tests/collect-edge-count-access-group/aql/count.aql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ RETURN {
3535
FILTER v_node1._key != null
3636
RETURN v_node1
3737
)
38-
COLLECT WITH COUNT INTO v_count2
38+
COLLECT AGGREGATE v_count2 = COUNT(v_item4)
3939
RETURN v_count2
4040
)
4141
})

spec/regression/collect/tests/collect-edge-count/aql/countAfter.aql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ RETURN {
2828
FILTER v_node2._key != null
2929
RETURN v_node2
3030
)
31-
COLLECT WITH COUNT INTO v_count2
31+
COLLECT AGGREGATE v_count2 = COUNT(v_item2)
3232
RETURN v_count2
3333
)
3434
})

spec/regression/collect/tests/collect-edge-count/aql/countBefore.aql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ RETURN {
2828
FILTER v_node2._key != null
2929
RETURN v_node2
3030
)
31-
COLLECT WITH COUNT INTO v_count2
31+
COLLECT AGGREGATE v_count2 = COUNT(v_item2)
3232
RETURN v_count2
3333
)
3434
})

spec/regression/collect/tests/distinct-aggregation/aql/distinct.aql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ RETURN {
1313
IN (
1414
FOR v_item1
1515
IN (
16-
FOR v_node1, v_edge1, v_path1 IN @var3..@var4 OUTBOUND v_delivery1 @@deliveries_handlingUnits
17-
FILTER v_node1._key != null
18-
RETURN v_node1.`warehouseSlot`
16+
FOR v_root1, v_edge1, v_path1 IN @var3..@var4 OUTBOUND v_delivery1 @@deliveries_handlingUnits
17+
FILTER v_root1._key != null
18+
RETURN v_root1.`warehouseSlot`
1919
)
2020
FILTER v_item1 != null
2121
COLLECT v_distinct1 = v_item1

spec/regression/collect/tests/field-aggregation/aql/fields.aql

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,35 @@ RETURN {
77
"deliveryNumber": v_delivery1.`deliveryNumber`,
88
"totalWeightInKg": FIRST(
99
FOR v_item1
10-
IN v_delivery1.`deliveryContents`[*].`items`[*].`weightInKg`[**]
10+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`weightInKg`
1111
FILTER v_item1 != null
1212
COLLECT AGGREGATE v_sum1 = SUM(v_item1)
1313
RETURN v_sum1 != null ? v_sum1 : 0
1414
),
1515
"averageWeightInKg": FIRST(
1616
FOR v_item2
17-
IN v_delivery1.`deliveryContents`[*].`items`[*].`weightInKg`[**]
17+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`weightInKg`
1818
FILTER v_item2 != null
1919
COLLECT AGGREGATE v_average1 = AVERAGE(v_item2)
2020
RETURN v_average1
2121
),
2222
"minWeightInKg": FIRST(
2323
FOR v_item3
24-
IN v_delivery1.`deliveryContents`[*].`items`[*].`weightInKg`[**]
24+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`weightInKg`
2525
FILTER v_item3 != null
2626
COLLECT AGGREGATE v_min1 = MIN(v_item3)
2727
RETURN v_min1
2828
),
2929
"maxWeightInKg": FIRST(
3030
FOR v_item4
31-
IN v_delivery1.`deliveryContents`[*].`items`[*].`weightInKg`[**]
31+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`weightInKg`
3232
FILTER v_item4 != null
3333
COLLECT AGGREGATE v_max1 = MAX(v_item4)
3434
RETURN v_max1
3535
),
3636
"allItemNumbers": (
3737
FOR v_item5
38-
IN v_delivery1.`deliveryContents`[*].`items`[*].`itemNumber`[**]
38+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`itemNumber`
3939
FILTER v_item5 != null
4040
SORT v_item5
4141
COLLECT v_distinct1 = v_item5
@@ -44,7 +44,7 @@ RETURN {
4444
"itemCount": FIRST(
4545
FOR v_item6
4646
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
47-
COLLECT WITH COUNT INTO v_count1
47+
COLLECT AGGREGATE v_count1 = COUNT(v_item6)
4848
RETURN v_count1
4949
),
5050
"hasItems": FIRST(
@@ -61,76 +61,76 @@ RETURN {
6161
),
6262
"hasDangerousGoods": FIRST(
6363
FOR v_item9
64-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
64+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
6565
COLLECT AGGREGATE v_some_true1 = MAX(v_item9)
6666
RETURN v_some_true1 >= true
6767
),
6868
"hasNonDangerousGoods": FIRST(
6969
FOR v_item10
70-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
70+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
7171
COLLECT AGGREGATE v_some_not_true1 = MAX(!v_item10)
7272
RETURN v_some_not_true1 >= true
7373
),
7474
"hasOnlyDangerousGoods": FIRST(
7575
FOR v_item11
76-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
76+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
7777
COLLECT AGGREGATE v_every_true1 = MAX(!v_item11)
7878
RETURN v_every_true1 < true
7979
),
8080
"hasNoDangerousGoods": FIRST(
8181
FOR v_item12
82-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
82+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
8383
COLLECT AGGREGATE v_none_true1 = MAX(v_item12)
8484
RETURN v_none_true1 < true
8585
),
8686
"dangerousItemCount": FIRST(
8787
FOR v_item13
88-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
88+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
8989
FILTER v_item13 >= true
9090
COLLECT AGGREGATE v_count_true1 = COUNT(v_item13)
9191
RETURN v_count_true1
9292
),
9393
"nonDangerousItemCount": FIRST(
9494
FOR v_item14
95-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
95+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
9696
FILTER v_item14 < true
9797
COLLECT AGGREGATE v_count_not_true1 = COUNT(v_item14)
9898
RETURN v_count_not_true1
9999
),
100100
"hasMissingDangerousGoodsFlag": FIRST(
101101
FOR v_item15
102-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
102+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
103103
COLLECT AGGREGATE v_some_null1 = MAX(v_item15 == null)
104104
RETURN v_some_null1 >= true
105105
),
106106
"hasSomeDangerousGoodsFlag": FIRST(
107107
FOR v_item16
108-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
108+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
109109
COLLECT AGGREGATE v_some_not_null1 = MAX(v_item16 != null)
110110
RETURN v_some_not_null1 >= true
111111
),
112112
"hasAllDangerousGoodsFlags": FIRST(
113113
FOR v_item17
114-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
114+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
115115
COLLECT AGGREGATE v_none_null1 = MAX(v_item17 == null)
116116
RETURN v_none_null1 < true
117117
),
118118
"hasNoDangerousGoodsFlag": FIRST(
119119
FOR v_item18
120-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
120+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
121121
COLLECT AGGREGATE v_every_null1 = MAX(v_item18 != null)
122122
RETURN v_every_null1 < true
123123
),
124124
"missingDangerousGoodsFlagCount": FIRST(
125125
FOR v_item19
126-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
126+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
127127
FILTER v_item19 == null
128128
COLLECT AGGREGATE v_count_null1 = COUNT(v_item19)
129129
RETURN v_count_null1
130130
),
131131
"setDangerousGoodsFlagCount": FIRST(
132132
FOR v_item20
133-
IN v_delivery1.`deliveryContents`[*].`items`[*].`isDangerousGoods`[**]
133+
IN v_delivery1.`deliveryContents`[*].`items`[*][**].`isDangerousGoods`
134134
FILTER v_item20 != null
135135
COLLECT AGGREGATE v_count_not_null1 = COUNT(v_item20)
136136
RETURN v_count_not_null1

spec/regression/collect/tests/field-traversal/aql/fieldsToN.aql

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ LET v_delivery1 = FIRST((
77
))
88
RETURN {
99
"Delivery": (IS_NULL(v_delivery1) ? null : {
10-
"allItems": (
11-
FOR v_deliveryItem1
12-
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
13-
RETURN {
14-
"itemNumber": v_deliveryItem1.`itemNumber`
15-
}
16-
)
10+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** RETURN {
11+
"itemNumber": CURRENT.`itemNumber`
12+
}]
1713
})
1814
}
1915

20-
// Peak memory usage: 163840 bytes
16+
// Peak memory usage: 131072 bytes

spec/regression/collect/tests/field-traversal/aql/fieldsToN_filter.aql

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,9 @@ LET v_delivery1 = FIRST((
77
))
88
RETURN {
99
"Delivery": (IS_NULL(v_delivery1) ? null : {
10-
"allItems": (
11-
FOR v_deliveryItem1
12-
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
13-
FILTER (RIGHT(v_deliveryItem1.`itemNumber`, LENGTH(@var3)) == @var4)
14-
RETURN {
15-
"itemNumber": v_deliveryItem1.`itemNumber`
16-
}
17-
)
10+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** FILTER (RIGHT(CURRENT.`itemNumber`, LENGTH(@var3)) == @var4) RETURN {
11+
"itemNumber": CURRENT.`itemNumber`
12+
}]
1813
})
1914
}
2015

spec/regression/collect/tests/field-traversal/aql/fieldsToN_filter_order.aql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ LET v_delivery1 = FIRST((
88
RETURN {
99
"Delivery": (IS_NULL(v_delivery1) ? null : {
1010
"allItems": (
11-
FOR v_deliveryItem1
11+
FOR v_item1
1212
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
13-
FILTER (RIGHT(v_deliveryItem1.`itemNumber`, LENGTH(@var3)) == @var4)
14-
SORT (v_deliveryItem1.`itemNumber`) DESC
13+
FILTER (RIGHT(v_item1.`itemNumber`, LENGTH(@var3)) == @var4)
14+
SORT (v_item1.`itemNumber`) DESC
1515
RETURN {
16-
"itemNumber": v_deliveryItem1.`itemNumber`
16+
"itemNumber": v_item1.`itemNumber`
1717
}
1818
)
1919
})

spec/regression/collect/tests/field-traversal/aql/fieldsToN_filter_order_pagination.aql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ LET v_delivery1 = FIRST((
88
RETURN {
99
"Delivery": (IS_NULL(v_delivery1) ? null : {
1010
"allItems": (
11-
FOR v_deliveryItem1
11+
FOR v_item1
1212
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
13-
FILTER (RIGHT(v_deliveryItem1.`itemNumber`, LENGTH(@var3)) == @var4)
14-
SORT (v_deliveryItem1.`itemNumber`) DESC
13+
FILTER (RIGHT(v_item1.`itemNumber`, LENGTH(@var3)) == @var4)
14+
SORT (v_item1.`itemNumber`) DESC
1515
LIMIT @var5, @var6
1616
RETURN {
17-
"itemNumber": v_deliveryItem1.`itemNumber`
17+
"itemNumber": v_item1.`itemNumber`
1818
}
1919
)
2020
})

spec/regression/collect/tests/field-traversal/aql/fieldsToN_filter_pagination.aql

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,9 @@ LET v_delivery1 = FIRST((
77
))
88
RETURN {
99
"Delivery": (IS_NULL(v_delivery1) ? null : {
10-
"allItems": (
11-
FOR v_deliveryItem1
12-
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
13-
FILTER (RIGHT(v_deliveryItem1.`itemNumber`, LENGTH(@var3)) == @var4)
14-
LIMIT @var5, @var6
15-
RETURN {
16-
"itemNumber": v_deliveryItem1.`itemNumber`
17-
}
18-
)
10+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** FILTER (RIGHT(CURRENT.`itemNumber`, LENGTH(@var3)) == @var4) LIMIT @var5, @var6 RETURN {
11+
"itemNumber": CURRENT.`itemNumber`
12+
}]
1913
})
2014
}
2115

0 commit comments

Comments
 (0)