Skip to content

Commit 519a613

Browse files
committed
wip: 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. WIP: add tests for COUNT_NULL etc. with field segments WIP: InMemoryAdapter (do this last when we're sure about the query tree API)
1 parent b528924 commit 519a613

File tree

61 files changed

+2099
-1107
lines changed

Some content is hidden

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

61 files changed

+2099
-1107
lines changed

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: 17 additions & 17 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
@@ -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-with-pagination/aql/ordered.aql

Lines changed: 3 additions & 3 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-
SORT (v_deliveryItem1.`itemNumber`) DESC
13+
SORT (v_item1.`itemNumber`) DESC
1414
LIMIT @var3, @var4
1515
RETURN {
16-
"itemNumber": v_deliveryItem1.`itemNumber`
16+
"itemNumber": v_item1.`itemNumber`
1717
}
1818
)
1919
})

spec/regression/collect/tests/field-traversal-with-pagination/aql/unordered.aql

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@ 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-
LIMIT @var3, @var4
14-
RETURN {
15-
"itemNumber": v_deliveryItem1.`itemNumber`
16-
}
17-
)
10+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** LIMIT @var3, @var4 RETURN {
11+
"itemNumber": CURRENT.`itemNumber`
12+
}]
1813
})
1914
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ 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-
SORT (v_deliveryItem1.`itemNumber`) DESC
13+
SORT (v_item1.`itemNumber`) DESC
1414
RETURN {
15-
"itemNumber": v_deliveryItem1.`itemNumber`
15+
"itemNumber": v_item1.`itemNumber`
1616
}
1717
)
1818
})

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@ 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
}

spec/regression/collect/tests/input-type-compat/aql/create.aql

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@ RETURN (IS_NULL(v_delivery1) ? null : {
1414
COLLECT WITH COUNT INTO v_count1
1515
RETURN v_count1
1616
),
17-
"allItems": (
18-
FOR v_deliveryItem1
19-
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
20-
RETURN {
21-
"itemNumber": v_deliveryItem1.`itemNumber`
22-
}
23-
)
17+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** RETURN {
18+
"itemNumber": CURRENT.`itemNumber`
19+
}]
2420
})
2521

2622
// --------------------------------

spec/regression/collect/tests/input-type-compat/aql/update.aql

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,9 @@ RETURN (IS_NULL(v_delivery1) ? null : {
2525
COLLECT WITH COUNT INTO v_count1
2626
RETURN v_count1
2727
),
28-
"allItems": (
29-
FOR v_deliveryItem1
30-
IN v_delivery1.`deliveryContents`[*].`items`[*][**]
31-
RETURN {
32-
"itemNumber": v_deliveryItem1.`itemNumber`
33-
}
34-
)
28+
"allItems": v_delivery1.`deliveryContents`[*].`items`[*][** RETURN {
29+
"itemNumber": CURRENT.`itemNumber`
30+
}]
3531
})
3632

3733
// --------------------------------

spec/regression/collect/tests/recursive-relation-traversal-access-group/aql/direct0to1.aql

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@ LET v_delivery1 = FIRST((
1414
RETURN {
1515
"Delivery": (IS_NULL(v_delivery1) ? null : {
1616
"allHandlingUnits0to1": (
17-
FOR v_handlingUnit1
18-
IN (
19-
FOR v_node1, v_edge1, v_path1 IN @var4..@var5 OUTBOUND v_delivery1 @@deliveries_handlingUnits
20-
FILTER (v_node1.`accessGroup` IN @var6)
21-
FOR v_node2, v_edge2, v_path2 IN @var7..@var8 OUTBOUND v_node1 @@handlingUnits_childHandlingUnits
22-
FILTER (v_node2.`accessGroup` IN @var9)
23-
FILTER v_node2._key != null
24-
RETURN v_node2
25-
)
26-
SORT (v_handlingUnit1.`handlingUnitNumber`)
17+
FOR v_node1, v_edge1, v_path1 IN @var4..@var5 OUTBOUND v_delivery1 @@deliveries_handlingUnits
18+
FILTER (v_node1.`accessGroup` IN @var6)
19+
FOR v_node2, v_edge2, v_path2 IN @var7..@var8 OUTBOUND v_node1 @@handlingUnits_childHandlingUnits
20+
FILTER (v_node2.`accessGroup` IN @var9)
21+
FILTER v_node2._key != null
22+
SORT (v_node2.`handlingUnitNumber`)
2723
RETURN {
28-
"handlingUnitNumber": v_handlingUnit1.`handlingUnitNumber`
24+
"handlingUnitNumber": v_node2.`handlingUnitNumber`
2925
}
3026
)
3127
})

spec/regression/collect/tests/recursive-relation-traversal-access-group/aql/direct0to2.aql

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,15 @@ LET v_delivery1 = FIRST((
1414
RETURN {
1515
"Delivery": (IS_NULL(v_delivery1) ? null : {
1616
"allHandlingUnits0to2": (
17-
FOR v_handlingUnit1
18-
IN (
19-
FOR v_node1, v_edge1, v_path1 IN @var4..@var5 OUTBOUND v_delivery1 @@deliveries_handlingUnits
20-
FILTER (v_node1.`accessGroup` IN @var6)
21-
FOR v_node2, v_edge2, v_path2 IN @var7..@var8 OUTBOUND v_node1 @@handlingUnits_childHandlingUnits
22-
PRUNE !((v_node2.`accessGroup` IN @var9))
23-
FILTER v_path2.vertices[*].`accessGroup` ALL IN @var10
24-
FILTER v_node2._key != null
25-
RETURN v_node2
26-
)
27-
SORT (v_handlingUnit1.`handlingUnitNumber`)
17+
FOR v_node1, v_edge1, v_path1 IN @var4..@var5 OUTBOUND v_delivery1 @@deliveries_handlingUnits
18+
FILTER (v_node1.`accessGroup` IN @var6)
19+
FOR v_node2, v_edge2, v_path2 IN @var7..@var8 OUTBOUND v_node1 @@handlingUnits_childHandlingUnits
20+
PRUNE !((v_node2.`accessGroup` IN @var9))
21+
FILTER v_path2.vertices[*].`accessGroup` ALL IN @var10
22+
FILTER v_node2._key != null
23+
SORT (v_node2.`handlingUnitNumber`)
2824
RETURN {
29-
"handlingUnitNumber": v_handlingUnit1.`handlingUnitNumber`
25+
"handlingUnitNumber": v_node2.`handlingUnitNumber`
3026
}
3127
)
3228
})

0 commit comments

Comments
 (0)