void MergingSortedBlockInputStream::fetchNextBlock(const TSortCursor & current, std::priority_queue<TSortCursor> & queue) { size_t order = current.impl->order; size_t size = cursors.size(); if (order >= size || &cursors[order] != current.impl) throw Exception("Logical error in MergingSortedBlockInputStream", ErrorCodes::LOGICAL_ERROR); source_blocks[order] = new detail::SharedBlock(children[order]->read()); if (*source_blocks[order]) { cursors[order].reset(*source_blocks[order]); queue.push(TSortCursor(&cursors[order])); source_blocks[order]->all_columns = cursors[order].all_columns; source_blocks[order]->sort_columns = cursors[order].sort_columns; } }
void MergingSortedBlockInputStream::fetchNextBlock(const TSortCursor & current, std::priority_queue<TSortCursor> & queue) { size_t i = 0; size_t size = cursors.size(); for (; i < size; ++i) { if (&cursors[i] == current.impl) { source_blocks[i] = new detail::SharedBlock(children[i]->read()); if (*source_blocks[i]) { cursors[i].reset(*source_blocks[i]); queue.push(TSortCursor(&cursors[i])); } break; } } if (i == size) throw Exception("Logical error in MergingSortedBlockInputStream", ErrorCodes::LOGICAL_ERROR); }
void MergingSortedBlockInputStream::initQueue(std::priority_queue<TSortCursor> & queue) { for (size_t i = 0; i < cursors.size(); ++i) if (!cursors[i].empty()) queue.push(TSortCursor(&cursors[i])); }