| 47 | |
| 48 | |
| 49 | void ZVecPyDoc::bind_doc(py::module_ &m) { |
| 50 | // binding doc |
| 51 | py::class_<Doc, Doc::Ptr> doc(m, "_Doc"); |
| 52 | |
| 53 | doc.def(py::init([]() { return std::make_shared<Doc>(); })) |
| 54 | .def("set_pk", &Doc::set_pk) |
| 55 | .def("pk", &Doc::pk) |
| 56 | .def("set_score", &Doc::set_score) |
| 57 | .def("score", &Doc::score) |
| 58 | .def("has_field", &Doc::has) |
| 59 | .def("field_names", &Doc::field_names) |
| 60 | .def(py::pickle( |
| 61 | [](const Doc &d) { |
| 62 | std::vector<uint8_t> data = d.serialize(); |
| 63 | return py::bytes(reinterpret_cast<const char *>(data.data()), |
| 64 | data.size()); |
| 65 | }, |
| 66 | [](py::bytes b) { |
| 67 | py::buffer_info info(py::buffer(b).request()); |
| 68 | const uint8_t *buf = reinterpret_cast<const uint8_t *>(info.ptr); |
| 69 | size_t size = static_cast<size_t>(info.size); |
| 70 | Doc::Ptr d = Doc::deserialize(buf, size); |
| 71 | if (!d) throw std::runtime_error("Failed to unpickle Doc"); |
| 72 | return d; |
| 73 | })); |
| 74 | |
| 75 | |
| 76 | // binding doc set field |
| 77 | doc.def( |
| 78 | "set_any", |
| 79 | [](Doc &self, const std::string &field, const FieldSchema &field_schema, |
| 80 | const py::object &obj) -> bool { |
| 81 | if (obj.is_none()) { |
| 82 | if (field_schema.nullable()) { |
| 83 | self.set_null(field); |
| 84 | return true; |
| 85 | } |
| 86 | throw py::value_error("Field '" + field + |
| 87 | "': expected non-nullable type"); |
| 88 | } |
| 89 | switch (field_schema.data_type()) { |
| 90 | // base datatypes |
| 91 | case DataType::STRING: |
| 92 | return self.set(field, |
| 93 | checked_cast<std::string>(obj, field, "STRING")); |
| 94 | case DataType::BOOL: |
| 95 | return self.set(field, checked_cast<bool>(obj, field, "BOOL")); |
| 96 | case DataType::INT32: |
| 97 | return self.set(field, checked_cast<int32_t>(obj, field, "INT32")); |
| 98 | case DataType::INT64: |
| 99 | return self.set(field, checked_cast<int64_t>(obj, field, "INT64")); |
| 100 | case DataType::UINT32: |
| 101 | return self.set(field, |
| 102 | checked_cast<uint32_t>(obj, field, "UINT32")); |
| 103 | case DataType::UINT64: |
| 104 | return self.set(field, |
| 105 | checked_cast<uint64_t>(obj, field, "UINT64")); |
| 106 | case DataType::FLOAT: |
nothing calls this directly
no test coverage detected