(rowNumber RowNumber)
| 1502 | } |
| 1503 | |
| 1504 | func (j *LeftJoinIterator) collectRequired(rowNumber RowNumber) (err error) { |
| 1505 | // First iterator is broken out because it is treated a little differently, |
| 1506 | // and being on the hot path this is requiredfor best performance. |
| 1507 | iter0: |
| 1508 | for j.peeksRequired[0] != nil { |
| 1509 | j.collector.Collect(j.peeksRequired[0], j.paramsRequired[0]) |
| 1510 | |
| 1511 | j.peeksRequired[0], err = j.required[0].Next() |
| 1512 | if err != nil { |
| 1513 | return |
| 1514 | } |
| 1515 | if j.peeksRequired[0] == nil { |
| 1516 | break iter0 |
| 1517 | } |
| 1518 | |
| 1519 | // For the driver we check after because we already know |
| 1520 | // entering this loop that it was pointed at the row. |
| 1521 | for k := j.defLevelsRequired[0]; k >= 0; k-- { |
| 1522 | if j.peeksRequired[0].RowNumber[k] != rowNumber[k] { |
| 1523 | break iter0 |
| 1524 | } |
| 1525 | } |
| 1526 | } |
| 1527 | |
| 1528 | iters: |
| 1529 | for i := 1; i < len(j.required); i++ { |
| 1530 | if i > 0 { |
| 1531 | if EqualRowNumber(j.defLevelsRequired[i], j.collectedThroughRequired[i], rowNumber) { |
| 1532 | // Already collected |
| 1533 | continue |
| 1534 | } |
| 1535 | } |
| 1536 | |
| 1537 | // First iterator (driver) is pointing at the next row to collect. |
| 1538 | // Collect from it while at the same level as the desired definition level |
| 1539 | // or until exhausted. |
| 1540 | for j.peeksRequired[i] != nil { |
| 1541 | |
| 1542 | // Before collecting ensure we are at the same row. |
| 1543 | // For the driver we already know entering this loop that it s pointed at the row. |
| 1544 | // So this early check is only for later iterators. |
| 1545 | if i > 0 { |
| 1546 | // Interned version of EqualRowNumber |
| 1547 | // Compare in reverse order because most row number activity |
| 1548 | // occurs at the deeper definition levels. |
| 1549 | for k := j.defLevelsRequired[i]; k >= 0; k-- { |
| 1550 | if j.peeksRequired[i].RowNumber[k] != rowNumber[k] { |
| 1551 | continue iters |
| 1552 | } |
| 1553 | } |
| 1554 | } |
| 1555 | |
| 1556 | j.collector.Collect(j.peeksRequired[i], j.paramsRequired[i]) |
| 1557 | |
| 1558 | // Optimization: we don't need to save the row number |
| 1559 | // for the primary iterator (driver). |
| 1560 | if i > 0 { |
| 1561 | j.collectedThroughRequired[i] = j.peeksRequired[i].RowNumber |
no test coverage detected