std::vector<std::string> Exchange::extractBoundaries( const boost::optional<std::vector<BSONObj>>& obj, Ordering ordering) { std::vector<std::string> ret; if (!obj) { return ret; } for (auto& b : *obj) { // Build the key. BSONObjBuilder kb; for (auto elem : b) { kb << "" << elem; } KeyString key{KeyString::Version::V1, kb.obj(), ordering}; std::string keyStr{key.getBuffer(), key.getSize()}; ret.emplace_back(std::move(keyStr)); } uassert(50960, str::stream() << "Exchange range boundaries are not valid", ret.size() > 1); for (size_t idx = 1; idx < ret.size(); ++idx) { uassert(50893, str::stream() << "Exchange range boundaries are not in ascending order.", ret[idx - 1] < ret[idx]); } BSONObjBuilder kbMin; BSONObjBuilder kbMax; for (int i = 0; i < obj->front().nFields(); ++i) { kbMin << "" << MINKEY; kbMax << "" << MAXKEY; } KeyString minKey{KeyString::Version::V1, kbMin.obj(), ordering}; KeyString maxKey{KeyString::Version::V1, kbMax.obj(), ordering}; StringData minKeyStr{minKey.getBuffer(), minKey.getSize()}; StringData maxKeyStr{maxKey.getBuffer(), maxKey.getSize()}; uassert(50958, str::stream() << "Exchange lower bound must be the minkey.", ret.front() == minKeyStr); uassert(50959, str::stream() << "Exchange upper bound must be the maxkey.", ret.back() == maxKeyStr); return ret; }