diff --git a/cpp/src/numbuf/dict.cc b/cpp/src/numbuf/dict.cc index ff5f7239f..14bf7f2f3 100644 --- a/cpp/src/numbuf/dict.cc +++ b/cpp/src/numbuf/dict.cc @@ -5,12 +5,13 @@ using namespace arrow; namespace numbuf { std::shared_ptr DictBuilder::Finish( + std::shared_ptr key_tuple_data, std::shared_ptr list_data, std::shared_ptr tuple_data, std::shared_ptr dict_data) { // lists and dicts can't be keys of dicts in Python, that is why for // the keys we do not need to collect sublists - auto keys = keys_.Finish(nullptr, nullptr, nullptr); + auto keys = keys_.Finish(nullptr, key_tuple_data, nullptr); auto vals = vals_.Finish(list_data, tuple_data, dict_data); auto keys_field = std::make_shared("keys", keys->type()); auto vals_field = std::make_shared("vals", vals->type()); diff --git a/cpp/src/numbuf/dict.h b/cpp/src/numbuf/dict.h index 5c2abeacd..02eb6035d 100644 --- a/cpp/src/numbuf/dict.h +++ b/cpp/src/numbuf/dict.h @@ -34,6 +34,7 @@ public: value list of the dictionary */ std::shared_ptr Finish( + std::shared_ptr key_tuple_data, std::shared_ptr list_data, std::shared_ptr tuple_data, std::shared_ptr dict_data); diff --git a/python/src/pynumbuf/adapters/python.cc b/python/src/pynumbuf/adapters/python.cc index 790fd5497..871e0e097 100644 --- a/python/src/pynumbuf/adapters/python.cc +++ b/python/src/pynumbuf/adapters/python.cc @@ -171,16 +171,20 @@ Status DeserializeTuple(std::shared_ptr array, int32_t start_idx, int32_t Status SerializeDict(std::vector dicts, std::shared_ptr* out) { DictBuilder result; - std::vector sublists, subtuples, subdicts, dummy; + std::vector sublists, subtuples, subdicts, keytuples, dummy; for (const auto& dict : dicts) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(dict, &pos, &key, &value)) { - RETURN_NOT_OK(append(key, result.keys(), dummy, dummy, dummy)); + RETURN_NOT_OK(append(key, result.keys(), dummy, keytuples, dummy)); DCHECK(dummy.size() == 0); RETURN_NOT_OK(append(value, result.vals(), sublists, subtuples, subdicts)); } } + std::shared_ptr key_val_tuples; + if (keytuples.size() > 0) { + RETURN_NOT_OK(SerializeSequences(keytuples, &key_val_tuples)); + } std::shared_ptr val_list; if (sublists.size() > 0) { RETURN_NOT_OK(SerializeSequences(sublists, &val_list)); @@ -193,7 +197,7 @@ Status SerializeDict(std::vector dicts, std::shared_ptr* out) if (subdicts.size() > 0) { RETURN_NOT_OK(SerializeDict(subdicts, &val_dict)); } - *out = result.Finish(val_list, val_tuples, val_dict); + *out = result.Finish(key_val_tuples, val_list, val_tuples, val_dict); return Status::OK(); } diff --git a/python/test/runtest.py b/python/test/runtest.py index 1bb4addba..f8966b5ef 100644 --- a/python/test/runtest.py +++ b/python/test/runtest.py @@ -3,8 +3,9 @@ import libnumbuf import numpy as np from numpy.testing import assert_equal -TEST_OBJECTS = [[1, "hello", 3.0], 42, 43L, "hello world", u"x", u"\u262F", - 42.0, 1L << 62, (1.0, "hi"), +TEST_OBJECTS = [{(1,2) : 1}, {() : 2}, [1, "hello", 3.0], 42, 43L, "hello world", + u"x", u"\u262F", 42.0, + 1L << 62, (1.0, "hi"), None, (None, None), ("hello", None), True, False, (True, False), "hello", {True: "hello", False: "world"},