Block MongoDBBlockInputStream::readImpl() { if (all_read) return {}; MutableColumns columns(description.sample_block.columns()); const size_t size = columns.size(); for (const auto i : ext::range(0, size)) columns[i] = description.sample_block.getByPosition(i).column->cloneEmpty(); size_t num_rows = 0; while (num_rows < max_block_size) { Poco::MongoDB::ResponseMessage & response = cursor->next(*connection); for (const auto & document : response.documents()) { ++num_rows; for (const auto idx : ext::range(0, size)) { const auto & name = description.sample_block.getByPosition(idx).name; const Poco::MongoDB::Element::Ptr value = document->get(name); if (value.isNull() || value->type() == Poco::MongoDB::ElementTraits<Poco::MongoDB::NullValue>::TypeId) insertDefaultValue(*columns[idx], *description.sample_block.getByPosition(idx).column); else { if (description.types[idx].second) { ColumnNullable & column_nullable = static_cast<ColumnNullable &>(*columns[idx]); insertValue(column_nullable.getNestedColumn(), description.types[idx].first, *value, name); column_nullable.getNullMapData().emplace_back(0); } else insertValue(*columns[idx], description.types[idx].first, *value, name); } } } if (response.cursorID() == 0) { all_read = true; break; } } if (num_rows == 0) return {}; return description.sample_block.cloneWithColumns(std::move(columns)); }
Block MongoDBBlockInputStream::readImpl() { if (all_read) return {}; Block block = description.sample_block.cloneEmpty(); /// cache pointers returned by the calls to getByPosition std::vector<IColumn *> columns(block.columns()); const size_t size = columns.size(); for (const auto i : ext::range(0, size)) columns[i] = block.getByPosition(i).column.get(); size_t num_rows = 0; while (num_rows < max_block_size) { Poco::MongoDB::ResponseMessage & response = cursor->next(*connection); for (const auto & document : response.documents()) { ++num_rows; for (const auto idx : ext::range(0, size)) { const auto & name = description.names[idx]; const Poco::MongoDB::Element::Ptr value = document->get(name); if (value.isNull()) insertDefaultValue(columns[idx], *description.sample_columns[idx]); else insertValue(columns[idx], description.types[idx], *value, name); } } if (response.cursorID() == 0) { all_read = true; break; } } if (num_rows == 0) return {}; return block; }