blob: 56ae636614e6dbfcab507cfbfb4b22c7726af3e3 [file] [log] [blame]
// Here one comprehension creates a number of distinct values, each of which
// with a disjunction, then another comprehension maps them back to the
// same value, creating a large number of disjunctions.
//
// The disjunctions cannot be identified as equal in the general case. If no
// care is taken, disjunction elimination will be exponential, causing over
// a billion disjuncts to process in the below example. With the proper
// optimizations, there is a small, constant number of disjunction ops per
// disjunct.
//
// Issue #651
-- in.cue --
list: [
0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30,
]
a: [X=string]: text: *"default" | string
a: {
for i in list {
"\(i)": text: string
}
}
b: {
for x in a {
"\(x.text)": { text: x.text }
}
}
-- out/eval --
(struct){
list: (#list){
0: (int){ 0 }
1: (int){ 1 }
2: (int){ 2 }
3: (int){ 3 }
4: (int){ 4 }
5: (int){ 5 }
6: (int){ 6 }
7: (int){ 7 }
8: (int){ 8 }
9: (int){ 9 }
10: (int){ 10 }
11: (int){ 11 }
12: (int){ 12 }
13: (int){ 13 }
14: (int){ 14 }
15: (int){ 15 }
16: (int){ 16 }
17: (int){ 17 }
18: (int){ 18 }
19: (int){ 19 }
20: (int){ 20 }
21: (int){ 21 }
22: (int){ 22 }
23: (int){ 23 }
24: (int){ 24 }
25: (int){ 25 }
26: (int){ 26 }
27: (int){ 27 }
28: (int){ 28 }
29: (int){ 29 }
30: (int){ 30 }
}
a: (struct){
"0": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"1": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"2": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"3": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"4": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"5": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"6": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"7": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"8": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"9": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"10": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"11": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"12": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"13": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"14": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"15": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"16": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"17": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"18": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"19": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"20": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"21": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"22": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"23": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"24": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"25": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"26": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"27": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"28": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"29": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
"30": (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
}
b: (struct){
default: (struct){
text: (string){ |(*(string){ "default" }, (string){ string }) }
}
}
}
-- out/compile --
--- in.cue
{
list: [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
]
a: {
[string]: {
text: (*"default"|string)
}
}
a: {
for _, i in 1;list {
"\(〈1;i〉)": {
text: string
}
}
}
b: {
for _, x in 1;a {
"\(〈1;x〉.text)": {
text: 2;x〉.text
}
}
}
}