| 1470 | } |
| 1471 | |
| 1472 | func (j *LeftJoinIterator) collectOptional(rowNumber RowNumber) (err error) { |
| 1473 | iters: |
| 1474 | for i, iter := range j.optional { |
| 1475 | // Collect matches from this iter while it points at the given row number. |
| 1476 | d := j.defLevelsOptional[i] |
| 1477 | p := j.paramsOptional[i] |
| 1478 | |
| 1479 | for j.peeksOptional[i] != nil { |
| 1480 | // Optional iterators may or may not be pointing at the right row. |
| 1481 | // So always check first. |
| 1482 | // Interned version of EqualRowNumber |
| 1483 | // Compare in reverse order because most row number activity |
| 1484 | // occurs at the deeper definition levels. |
| 1485 | for k := d; k >= 0; k-- { |
| 1486 | if j.peeksOptional[i].RowNumber[k] != rowNumber[k] { |
| 1487 | continue iters |
| 1488 | } |
| 1489 | } |
| 1490 | |
| 1491 | // Collect and save row number. |
| 1492 | j.collector.Collect(j.peeksOptional[i], p) |
| 1493 | j.collectedThroughOptional[i] = j.peeksOptional[i].RowNumber |
| 1494 | |
| 1495 | j.peeksOptional[i], err = iter.Next() |
| 1496 | if err != nil { |
| 1497 | return |
| 1498 | } |
| 1499 | } |
| 1500 | } |
| 1501 | return |
| 1502 | } |
| 1503 | |
| 1504 | func (j *LeftJoinIterator) collectRequired(rowNumber RowNumber) (err error) { |
| 1505 | // First iterator is broken out because it is treated a little differently, |