@@ -39,34 +39,133 @@ func (s *Fragment) IsEmpty() bool {
39
39
func FragmentLogicalPlanNode (queryID uint64 , node logicalplan.Node ) ([]Fragment , error ) {
40
40
newFragment := Fragment {}
41
41
fragments := []Fragment {}
42
- nextChildrenIDs := []uint64 {}
42
+
43
+ childIDs := []uint64 {}
44
+ nextChildIDs := []uint64 {}
45
+ var prevID uint64
43
46
44
47
logicalplan .TraverseBottomUp (nil , & node , func (parent , current * logicalplan.Node ) bool {
45
- if parent == nil { // if we have reached the root
48
+
49
+ curlen := len (childIDs )
50
+
51
+ if parent == nil { // root fragment
52
+ if len (nextChildIDs ) < 2 {
53
+ newFragment = Fragment {
54
+ Node : node ,
55
+ FragmentID : getNewID (),
56
+ ChildIDs : []uint64 {},
57
+ IsRoot : true ,
58
+ }
59
+ } else {
60
+ newFragment = Fragment {
61
+ Node : node ,
62
+ FragmentID : getNewID (),
63
+ ChildIDs : []uint64 {nextChildIDs [len (nextChildIDs )- 2 ], nextChildIDs [len (nextChildIDs )- 1 ]},
64
+ IsRoot : true ,
65
+ }
66
+ }
67
+
68
+ fragments = append (fragments , newFragment )
69
+
70
+ } else if RemoteNode == (* current ).Type () {
71
+ nextChildIDs = append (nextChildIDs , prevID )
72
+
73
+ } else if RemoteNode == (* parent ).Type () {
74
+ if curlen <= 2 {
75
+ newFragment = Fragment {
76
+ Node : * current ,
77
+ FragmentID : getNewID (),
78
+ ChildIDs : []uint64 {},
79
+ IsRoot : false ,
80
+ }
81
+ childIDs = append (childIDs , newFragment .FragmentID )
82
+ } else {
83
+ newFragment = Fragment {
84
+ Node : node ,
85
+ FragmentID : getNewID (),
86
+ ChildIDs : []uint64 {childIDs [curlen - 2 ], childIDs [curlen - 1 ]},
87
+ IsRoot : false ,
88
+ }
89
+ childIDs = []uint64 {}
90
+ }
91
+ prevID = newFragment .FragmentID
92
+ fragments = append (fragments , newFragment )
93
+
94
+ // append remote node information that will be used in the execution stage
95
+ key := MakeFragmentKey (queryID , newFragment .FragmentID )
96
+ (* parent ).(* Remote ).FragmentKey = key
97
+ }
98
+ return false
99
+ })
100
+
101
+ if fragments != nil {
102
+ return fragments , nil
103
+ } else {
104
+ // for non-query API calls
105
+ // --> treat as root fragment and immediately return the result
106
+ return []Fragment {{
107
+ Node : node ,
108
+ FragmentID : uint64 (0 ),
109
+ ChildIDs : []uint64 {},
110
+ IsRoot : true ,
111
+ }}, nil
112
+ }
113
+ }
114
+
115
+ func TraverseDown (parent * Node , current * Node , layer int ,
116
+ transform func (parent * Node , current * Node , layer int ) (bool , bool )) (bool , bool ) {
117
+ var stop bool
118
+ layer = layer + 1
119
+
120
+ for _ , c := range (* current ).Children () {
121
+ newStop , _ := TraverseDown (current , c , layer , transform )
122
+ stop = newStop || stop
123
+ }
124
+ if stop {
125
+ return false , false
126
+ }
127
+ return transform (parent , current , layer )
128
+ }
129
+
130
+ func FragmentLogicalPlanNode2 (queryID uint64 , node logicalplan.Node ) ([]Fragment , error ) {
131
+ newFragment := Fragment {}
132
+ fragments := []Fragment {}
133
+
134
+ nextChildIDs := make (map [int ][]uint64 , 0 )
135
+
136
+ layer := 0
137
+
138
+ TraverseDown (nil , & node , layer , func (parent , current * logicalplan.Node , layer int ) (stop bool , remote bool ) {
139
+
140
+ if parent == nil { // root fragment
46
141
newFragment = Fragment {
47
142
Node : node ,
48
143
FragmentID : getNewID (),
49
- ChildIDs : nextChildrenIDs ,
144
+ ChildIDs : nextChildIDs [ layer ] ,
50
145
IsRoot : true ,
51
146
}
52
147
fragments = append (fragments , newFragment )
53
- return false // break the loop
54
- }
55
- if RemoteNode == (* parent ).Type () {
148
+ return false , true
149
+ } else if RemoteNode == (* parent ).Type () {
56
150
newFragment = Fragment {
57
- Node : * current ,
151
+ Node : node ,
58
152
FragmentID : getNewID (),
59
- ChildIDs : [] uint64 {} ,
153
+ ChildIDs : nextChildIDs [ layer ] ,
60
154
IsRoot : false ,
61
155
}
62
- fragments = append (fragments , newFragment )
63
- nextChildrenIDs = append (nextChildrenIDs , newFragment .FragmentID )
64
-
65
- // append remote node information that will be used in the execution stage
66
- key := MakeFragmentKey (queryID , newFragment .FragmentID )
67
- (* parent ).(* Remote ).FragmentKey = key
156
+ return false , true
68
157
}
69
- return false
158
+
159
+ nextChildIDs [layer - 1 ] = append (nextChildIDs [layer - 1 ], newFragment .FragmentID )
160
+
161
+ fragments = append (fragments , newFragment )
162
+
163
+ // append remote node information that will be used in the execution stage
164
+ key := MakeFragmentKey (queryID , newFragment .FragmentID )
165
+ (* parent ).(* Remote ).FragmentKey = key
166
+
167
+ //isLeaf = false
168
+ return false , false
70
169
})
71
170
72
171
if fragments != nil {
0 commit comments