std::vector<repoUUID> RepoBSON::getUUIDFieldArray(const std::string &label) const{ std::vector<repoUUID> results; if (hasField(label)) { RepoBSON array = getObjectField(label); if (!array.isEmpty()) { std::set<std::string> fields; array.getFieldNames(fields); std::set<std::string>::iterator it; for (it = fields.begin(); it != fields.end(); ++it) results.push_back(array.getUUIDField(*it)); } else { repoError << "getUUIDFieldArray: field " << label << " is an empty bson or wrong type!"; } } return results; }
TEST(RepoBSONTest, GetUUIDField) { repoUUID uuid = generateUUID(); mongo::BSONObjBuilder builder; builder.appendBinData("uuid", uuid.size(), mongo::bdtUUID, (char*)uuid.data); RepoBSON test = RepoBSON(builder.obj()); EXPECT_EQ(uuid, test.getUUIDField("uuid")); //Shouldn't fail if trying to get a uuid field that doesn't exist EXPECT_NE(uuid, test.getUUIDField("hello")); EXPECT_NE(uuid, testBson.getUUIDField("ice")); EXPECT_NE(uuid, emptyBson.getUUIDField("ice")); }
std::vector<repo_mesh_mapping_t> MeshNode::getMeshMapping() const { std::vector<repo_mesh_mapping_t> mappings; RepoBSON mapArray = getObjectField(REPO_NODE_MESH_LABEL_MERGE_MAP); if (!mapArray.isEmpty()) { std::set<std::string> fields; mapArray.getFieldNames(fields); mappings.resize(fields.size()); for (const auto &name : fields) { repo_mesh_mapping_t mapping; RepoBSON mappingObj = mapArray.getObjectField(name); mapping.mesh_id = mappingObj.getUUIDField(REPO_NODE_MESH_LABEL_MAP_ID); mapping.material_id = mappingObj.getUUIDField(REPO_NODE_MESH_LABEL_MATERIAL_ID); mapping.vertFrom = mappingObj.getField(REPO_NODE_MESH_LABEL_VERTEX_FROM).Int(); mapping.vertTo = mappingObj.getField(REPO_NODE_MESH_LABEL_VERTEX_TO).Int(); mapping.triFrom = mappingObj.getField(REPO_NODE_MESH_LABEL_TRIANGLE_FROM).Int(); mapping.triTo = mappingObj.getField(REPO_NODE_MESH_LABEL_TRIANGLE_TO).Int(); RepoBSON boundingBox = mappingObj.getObjectField(REPO_NODE_MESH_LABEL_BOUNDING_BOX); std::vector<repo_vector_t> bboxVec = getBoundingBox(boundingBox); mapping.min.x = bboxVec[0].x; mapping.min.y = bboxVec[0].y; mapping.min.z = bboxVec[0].z; mapping.max.x = bboxVec[1].x; mapping.max.y = bboxVec[1].y; mapping.max.z = bboxVec[1].z; mappings[std::stoi(name)] = mapping; } } return mappings; }