memgraph/include/communication/bolt/v1/serialization/bolt_serializer.hpp

134 lines
3.5 KiB
C++
Raw Normal View History

2016-08-08 04:19:04 +08:00
#pragma once
#include "communication/bolt/v1/packing/codes.hpp"
#include "communication/bolt/v1/transport/bolt_encoder.hpp"
2016-08-08 04:19:04 +08:00
#include "storage/edge_accessor.hpp"
#include "storage/vertex_accessor.hpp"
2016-08-08 04:19:04 +08:00
#include "storage/edge_type/edge_type.hpp"
#include "storage/label/label.hpp"
2016-08-08 04:19:04 +08:00
#include "storage/model/properties/all.hpp"
#include "storage/model/properties/properties.hpp"
#include "storage/vertex_record.hpp"
2016-08-08 04:19:04 +08:00
namespace bolt
{
template <class Stream>
class BoltSerializer
{
friend class Property;
// TODO: here shoud be friend but it doesn't work
// template <class Handler>
// friend void accept(const Property &property, Handler &h);
2016-08-08 04:19:04 +08:00
public:
BoltSerializer(Stream &stream) : encoder(stream) {}
2016-08-08 04:19:04 +08:00
/* Serializes the vertex accessor into the packstream format
*
* struct[size = 3] Vertex [signature = 0x4E] {
* Integer node_id;
* List<String> labels;
* Map<String, Value> properties;
* }
*
*/
void write(const VertexAccessor &vertex)
2016-08-08 04:19:04 +08:00
{
// write signatures for the node struct and node data type
encoder.write_struct_header(3);
encoder.write(underlying_cast(pack::Node));
// write the identifier for the node
encoder.write_integer(vertex.id());
// write the list of labels
auto labels = vertex.labels();
encoder.write_list_header(labels.size());
for (auto &label : labels)
2016-08-08 04:19:04 +08:00
encoder.write_string(label.get());
// write the property map
auto props = vertex.properties();
encoder.write_map_header(props.size());
for (auto &prop : props) {
write(prop.key.family_name());
prop.accept(*this);
}
2016-08-08 04:19:04 +08:00
}
/* Serializes the vertex accessor into the packstream format
*
* struct[size = 5] Edge [signature = 0x52] {
* Integer edge_id;
* Integer start_node_id;
* Integer end_node_id;
* String type;
* Map<String, Value> properties;
* }
*
*/
2016-08-29 04:10:13 +08:00
void write(const EdgeAccessor &edge);
2016-08-08 04:19:04 +08:00
void write_null() { encoder.write_null(); }
2016-08-08 04:19:04 +08:00
void write(const Null &v) { encoder.write_null(); }
void write(const Bool &prop) { encoder.write_bool(prop.value()); }
2016-08-08 04:19:04 +08:00
void write(const Float &prop) { encoder.write_double(prop.value()); }
void write(const Double &prop) { encoder.write_double(prop.value()); }
void write(const Int32 &prop) { encoder.write_integer(prop.value()); }
void write(const Int64 &prop) { encoder.write_integer(prop.value()); }
void write(const String &value) { encoder.write_string(value.value()); }
// Not yet implemented
void write(const ArrayBool &) { assert(false); }
2016-08-08 04:19:04 +08:00
// Not yet implemented
void write(const ArrayInt32 &) { assert(false); }
2016-08-08 04:19:04 +08:00
// Not yet implemented
void write(const ArrayInt64 &) { assert(false); }
2016-08-08 04:19:04 +08:00
// Not yet implemented
void write(const ArrayFloat &) { assert(false); }
2016-08-08 04:19:04 +08:00
// Not yet implemented
void write(const ArrayDouble &) { assert(false); }
// Not yet implemented
void write(const ArrayString &) { assert(false); }
2016-08-08 04:19:04 +08:00
void write_failure(const std::map<std::string, std::string> &data)
2016-08-30 13:49:47 +08:00
{
encoder.message_failure();
encoder.write_map_header(data.size());
for (auto const &kv : data) {
write(kv.first);
write(kv.second);
}
}
2016-08-08 04:19:04 +08:00
template <class T>
void handle(const T &prop)
2016-08-08 04:19:04 +08:00
{
write(prop);
}
protected:
Stream &encoder;
2016-08-08 04:19:04 +08:00
};
}