| 1320 | } |
| 1321 | |
| 1322 | func (m *mergeQuery) Select(t iterator) NodeNavigator { |
| 1323 | for { |
| 1324 | if m.iterator == nil { |
| 1325 | root := m.Input.Select(t) |
| 1326 | if root == nil { |
| 1327 | return nil |
| 1328 | } |
| 1329 | m.Child.Evaluate(t) |
| 1330 | root = root.Copy() |
| 1331 | t.Current().MoveTo(root) |
| 1332 | var list []NodeNavigator |
| 1333 | for node := m.Child.Select(t); node != nil; node = m.Child.Select(t) { |
| 1334 | list = append(list, node.Copy()) |
| 1335 | } |
| 1336 | i := 0 |
| 1337 | m.iterator = func() NodeNavigator { |
| 1338 | if i >= len(list) { |
| 1339 | return nil |
| 1340 | } |
| 1341 | result := list[i] |
| 1342 | i++ |
| 1343 | return result |
| 1344 | } |
| 1345 | } |
| 1346 | |
| 1347 | if node := m.iterator(); node != nil { |
| 1348 | return node |
| 1349 | } |
| 1350 | m.iterator = nil |
| 1351 | } |
| 1352 | } |
| 1353 | |
| 1354 | func (m *mergeQuery) Evaluate(t iterator) interface{} { |
| 1355 | m.Input.Evaluate(t) |