| 2408 | // |
| 2409 | |
| 2410 | bool Optimizer::joinDependentStreams(StreamList& joinStreams, RiverList& rivers, SortNode** sort) |
| 2411 | { |
| 2412 | bool hasDependentStreams = false; |
| 2413 | |
| 2414 | while (true) |
| 2415 | { |
| 2416 | // AB: Determine which streams have an index relationship |
| 2417 | // with the currently active rivers. This is needed so that |
| 2418 | // no merge is made between a new cross river and the |
| 2419 | // currently active rivers. Where in the new cross river |
| 2420 | // a stream depends (index) on the active rivers. |
| 2421 | StreamList dependentStreams, freeStreams; |
| 2422 | findDependentStreams(rivers, joinStreams, dependentStreams, freeStreams); |
| 2423 | |
| 2424 | // If we have dependent and free streams then we can't rely on |
| 2425 | // the sort node to be used for index navigation |
| 2426 | if (dependentStreams.hasData() && freeStreams.hasData()) |
| 2427 | sort = nullptr; |
| 2428 | |
| 2429 | if (dependentStreams.hasData()) |
| 2430 | { |
| 2431 | hasDependentStreams = true; |
| 2432 | |
| 2433 | // Copy free streams |
| 2434 | joinStreams.assign(freeStreams); |
| 2435 | |
| 2436 | // Make rivers from the dependent streams |
| 2437 | generateInnerJoin(dependentStreams, rivers, sort, rse->rse_plan); |
| 2438 | |
| 2439 | for (const auto depStream : dependentStreams) |
| 2440 | csb->csb_rpt[depStream].activate(); |
| 2441 | } |
| 2442 | else |
| 2443 | { |
| 2444 | if (freeStreams.hasData()) |
| 2445 | { |
| 2446 | // Deactivate streams from rivers on stack, because |
| 2447 | // the remaining streams don't have any indexed relationship with them |
| 2448 | for (const auto river : rivers) |
| 2449 | river->deactivate(csb); |
| 2450 | } |
| 2451 | |
| 2452 | break; |
| 2453 | } |
| 2454 | } |
| 2455 | |
| 2456 | return hasDependentStreams; |
| 2457 | }; |
| 2458 | |
| 2459 | |
| 2460 | // |
nothing calls this directly
no test coverage detected