Skip to content

Commit

Permalink
Support return query result as a Json string (#2824)
Browse files Browse the repository at this point in the history
* add toJson() to all datatypes

* add UT for vertex, edge, path

add UT for containers

* add UT for response serialization

* add more UTs

* Fix json format

* Fix UT

* Fix datetime string format in UTC

* Address comments change toJsonObj() to toJson()
  • Loading branch information
Aiee authored Sep 22, 2021
1 parent 07b5470 commit 32ff73f
Show file tree
Hide file tree
Showing 22 changed files with 918 additions and 4 deletions.
40 changes: 40 additions & 0 deletions src/common/datatypes/DataSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#ifndef COMMON_DATATYPES_DATASET_H_
#define COMMON_DATATYPES_DATASET_H_

#include <folly/dynamic.h>

#include <iostream>
#include <iterator>
#include <sstream>
Expand Down Expand Up @@ -153,6 +155,44 @@ struct DataSet {
return os.str();
}

// format:
// [
// {
// "row": [ row-data ],
// "meta": [ metadata ]
// },
// ]
folly::dynamic toJson() const {
// parse rows to json
auto dataBody = folly::dynamic::array();
for (auto& row : rows) {
dataBody.push_back(rowToJson(row));
}

return dataBody;
}

// parse Nebula::Row to json
// format:
// {
// "row": [ row-data ],
// "meta": [ metadata ]
// }
folly::dynamic rowToJson(const Row& row) const {
folly::dynamic rowJsonObj = folly::dynamic::object();
auto rowDataList = folly::dynamic::array();
auto metaDataList = folly::dynamic::array();

for (const auto& ele : row.values) {
rowDataList.push_back(ele.toJson());
metaDataList.push_back(ele.getMetaData());
}

rowJsonObj.insert("row", rowDataList);
rowJsonObj.insert("meta", metaDataList);
return rowJsonObj;
}

bool operator==(const DataSet& rhs) const { return colNames == rhs.colNames && rows == rhs.rows; }
};

Expand Down
7 changes: 7 additions & 0 deletions src/common/datatypes/Date.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#ifndef COMMON_DATATYPES_DATE_H_
#define COMMON_DATATYPES_DATE_H_

#include <folly/dynamic.h>

#include <string>

namespace nebula {
Expand Down Expand Up @@ -62,6 +64,7 @@ struct Date {
Date operator-(int64_t days) const;

std::string toString() const;
folly::dynamic toJson() const { return toString(); }

// Return the number of days since -32768/1/1
int64_t toInt() const;
Expand Down Expand Up @@ -113,6 +116,8 @@ struct Time {
}

std::string toString() const;
// 'Z' representing UTC timezone
folly::dynamic toJson() const { return toString() + "Z"; }
};

inline std::ostream& operator<<(std::ostream& os, const Time& d) {
Expand Down Expand Up @@ -203,6 +208,8 @@ struct DateTime {
}

std::string toString() const;
// 'Z' representing UTC timezone
folly::dynamic toJson() const { return toString() + "Z"; }
};

inline std::ostream& operator<<(std::ostream& os, const DateTime& d) {
Expand Down
39 changes: 39 additions & 0 deletions src/common/datatypes/Edge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,45 @@ std::string Edge::toString() const {
return os.str();
}

// format:
// {
// "prop1": val1,
// "prop2": val2,
// }
folly::dynamic Edge::toJson() const {
folly::dynamic propObj = folly::dynamic::object();

for (const auto& iter : props) {
propObj.insert(iter.first, iter.second.toJson());
}

return propObj;
}

// Used in Json form query result
// format:
// {
// "id": {
// "name": _name,
// "src": srcVID,
// "dst": dstVID,
// "type": _type,
// "ranking": _rankding
// }
// "type": "edge"
// }
folly::dynamic Edge::getMetaData() const {
folly::dynamic edgeMetadataObj = folly::dynamic::object();

folly::dynamic edgeIdObj = folly::dynamic::object("name", name)("src", src.toJson())(
"dst", dst.toJson())("type", type)("ranking", ranking);

edgeMetadataObj.insert("id", edgeIdObj);
edgeMetadataObj.insert("type", "edge");

return edgeMetadataObj;
}

bool Edge::contains(const Value& key) const {
if (!key.isStr()) {
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/common/datatypes/Edge.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ struct Edge {
void __clear() { clear(); }

std::string toString() const;
folly::dynamic toJson() const;
// Used in Json form query result
folly::dynamic getMetaData() const;

bool operator==(const Edge& rhs) const;

Expand Down
20 changes: 20 additions & 0 deletions src/common/datatypes/List.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,24 @@ std::string List::toString() const {
return os.str();
}

folly::dynamic List::toJson() const {
auto listJsonObj = folly::dynamic::array();

for (const auto& val : values) {
listJsonObj.push_back(val.toJson());
}

return listJsonObj;
}

folly::dynamic List::getMetaData() const {
auto listMetadataObj = folly::dynamic::array();

for (const auto& val : values) {
listMetadataObj.push_back(val.getMetaData());
}

return listMetadataObj;
}

} // namespace nebula
3 changes: 3 additions & 0 deletions src/common/datatypes/List.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ struct List {
size_t size() const { return values.size(); }

std::string toString() const;
folly::dynamic toJson() const;
// Extract the metadata of each element
folly::dynamic getMetaData() const;
};

inline std::ostream& operator<<(std::ostream& os, const List& l) { return os << l.toString(); }
Expand Down
22 changes: 21 additions & 1 deletion src/common/datatypes/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace nebula {

std::string Map::toString() const {
std::vector<std::string> value(kvs.size());
std::transform(kvs.begin(), kvs.end(), value.begin(), [](const auto &iter) -> std::string {
std::transform(kvs.begin(), kvs.end(), value.begin(), [](const auto& iter) -> std::string {
std::stringstream out;
out << iter.first << ":" << iter.second;
return out.str();
Expand All @@ -25,4 +25,24 @@ std::string Map::toString() const {
return os.str();
}

folly::dynamic Map::toJson() const {
folly::dynamic mapJsonObj = folly::dynamic::object();

for (const auto& iter : kvs) {
mapJsonObj.insert(iter.first, iter.second.toJson());
}

return mapJsonObj;
}

folly::dynamic Map::getMetaData() const {
auto mapMetadataObj = folly::dynamic::array();

for (const auto& kv : kvs) {
mapMetadataObj.push_back(kv.second.getMetaData());
}

return mapMetadataObj;
}

} // namespace nebula
3 changes: 3 additions & 0 deletions src/common/datatypes/Map.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ struct Map {
// the configs of rocksdb will use the interface, so the value need modify to
// string
std::string toString() const;
folly::dynamic toJson() const;
// Extract the metadata of the value of each kv pair
folly::dynamic getMetaData() const;

bool operator==(const Map& rhs) const { return kvs == rhs.kvs; }

Expand Down
49 changes: 49 additions & 0 deletions src/common/datatypes/Path.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,55 @@ struct Path {
return os.str();
}

folly::dynamic toJson() const {
folly::dynamic pathJsonObj = folly::dynamic::array();
auto srcVertex = src;
pathJsonObj.push_back(srcVertex.toJson());

for (const auto& s : steps) {
folly::dynamic edgeJsonObj = folly::dynamic::object();
// parse edge props map as json
for (const auto& iter : s.props) {
edgeJsonObj.insert(iter.first, iter.second.toJson());
}
// add edge json obj to path
pathJsonObj.push_back(edgeJsonObj);

// reset src vertex and add vertex json obj to path
srcVertex = s.dst;
pathJsonObj.push_back(srcVertex.toJson());
}

return pathJsonObj;
}

// Used in Json form query result
// format:
// [vertex1_metadata, edge1_metadata, vertex2_metadata, edge2_metadata,....]
folly::dynamic getMetaData() const {
auto dynamicObj = folly::dynamic::array();
auto srcVertex = src;
dynamicObj.push_back(srcVertex.getMetaData());

// Construct edge metadata
for (const auto& s : steps) {
folly::dynamic edgeIdObj = folly::dynamic::object();
edgeIdObj.insert("src", srcVertex.vid.toJson());
edgeIdObj.insert("dst", s.dst.vid.toJson());
edgeIdObj.insert("type", s.type);
edgeIdObj.insert("name", s.name);
edgeIdObj.insert("ranking", s.ranking);

folly::dynamic edgeMetadataObj = folly::dynamic::object("id", edgeIdObj)("type", "edge");
dynamicObj.push_back(edgeMetadataObj);
dynamicObj.push_back(s.dst.getMetaData());
// reset src vertex
srcVertex = s.dst;
}

return dynamicObj;
}

Path& operator=(Path&& rhs) noexcept {
if (&rhs != this) {
src = std::move(rhs.src);
Expand Down
20 changes: 20 additions & 0 deletions src/common/datatypes/Set.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,24 @@ std::string Set::toString() const {
return os.str();
}

folly::dynamic Set::toJson() const {
auto setJsonObj = folly::dynamic::array();

for (const auto& val : values) {
setJsonObj.push_back(val.toJson());
}

return setJsonObj;
}

folly::dynamic Set::getMetaData() const {
auto setMetadataObj = folly::dynamic::array();

for (const auto& val : values) {
setMetadataObj.push_back(val.getMetaData());
}

return setMetadataObj;
}

} // namespace nebula
3 changes: 3 additions & 0 deletions src/common/datatypes/Set.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ struct Set {
void __clear() { clear(); }

std::string toString() const;
folly::dynamic toJson() const;
// Extract the metadata of each element
folly::dynamic getMetaData() const;

Set& operator=(const Set& rhs) {
if (this == &rhs) {
Expand Down
Loading

0 comments on commit 32ff73f

Please sign in to comment.