NebulaGraph CPP Client  release-3.4
Path.h
1 /* Copyright (c) 2020 vesoft inc. All rights reserved.
2  *
3  * This source code is licensed under Apache 2.0 License.
4  */
5 
6 #pragma once
7 
8 #include "common/datatypes/Value.h"
9 #include "common/datatypes/Vertex.h"
10 #include "common/thrift/ThriftTypes.h"
11 
12 namespace nebula {
13 
14 struct Step {
15  Vertex dst;
16  EdgeType type;
17  std::string name;
18  EdgeRanking ranking;
19  std::unordered_map<std::string, Value> props;
20 
21  Step() = default;
22  Step(const Step& s)
23  : dst(s.dst), type(s.type), name(s.name), ranking(s.ranking), props(s.props) {}
24  Step(Step&& s) noexcept
25  : dst(std::move(s.dst)),
26  type(std::move(s.type)),
27  name(std::move(s.name)),
28  ranking(std::move(s.ranking)),
29  props(std::move(s.props)) {}
30  Step(Vertex d,
31  EdgeType t,
32  std::string n,
33  EdgeRanking r,
34  std::unordered_map<std::string, Value> p) noexcept
35  : dst(std::move(d)), type(t), name(std::move(n)), ranking(r), props(std::move(p)) {}
36 
37  void clear() {
38  dst.clear();
39  type = 0;
40  name.clear();
41  ranking = 0;
42  props.clear();
43  }
44 
45  void __clear() {
46  clear();
47  }
48 
49  std::string toString() const {
50  std::stringstream os;
51  os << "-[" << name << "(" << type << ")]->"
52  << "(" << dst << ")"
53  << "@" << ranking << " ";
54  for (const auto& prop : props) {
55  os << prop.first << ":" << prop.second << ",";
56  }
57  auto path = os.str();
58  path.pop_back();
59  return path;
60  }
61 
62  Step& operator=(Step&& rhs) noexcept {
63  if (&rhs != this) {
64  dst = std::move(rhs.dst);
65  type = std::move(rhs.type);
66  name = std::move(rhs.name);
67  ranking = std::move(rhs.ranking);
68  props = std::move(rhs.props);
69  }
70  return *this;
71  }
72 
73  Step& operator=(const Step& rhs) noexcept {
74  if (&rhs != this) {
75  dst = rhs.dst;
76  type = rhs.type;
77  name = rhs.name;
78  ranking = rhs.ranking;
79  props = rhs.props;
80  }
81  return *this;
82  }
83 
84  bool operator==(const Step& rhs) const {
85  return dst == rhs.dst && type == rhs.type && name == rhs.name && ranking == rhs.ranking &&
86  props == rhs.props;
87  }
88 
89  bool operator<(const Step& rhs) const {
90  if (dst != rhs.dst) {
91  return dst < rhs.dst;
92  }
93  if (type != rhs.dst) {
94  return type < rhs.type;
95  }
96  if (ranking != rhs.ranking) {
97  return ranking < rhs.ranking;
98  }
99  if (props.size() != rhs.props.size()) {
100  return props.size() < rhs.props.size();
101  }
102  return false;
103  }
104 };
105 
106 struct Path {
107  Vertex src;
108  std::vector<Step> steps;
109 
110  Path() = default;
111  Path(const Path& p) = default;
112  Path(Path&& p) noexcept : src(std::move(p.src)), steps(std::move(p.steps)) {}
113  Path(Vertex v, std::vector<Step> s) : src(std::move(v)), steps(std::move(s)) {}
114 
115  void clear() {
116  src.clear();
117  steps.clear();
118  }
119 
120  void __clear() {
121  clear();
122  }
123 
124  std::string toString() const {
125  std::stringstream os;
126  os << "(" << src << ")";
127  os << " ";
128  for (const auto& s : steps) {
129  os << s.toString();
130  os << " ";
131  }
132  return os.str();
133  }
134 
135  Path& operator=(Path&& rhs) noexcept {
136  if (&rhs != this) {
137  src = std::move(rhs.src);
138  steps = std::move(rhs.steps);
139  }
140  return *this;
141  }
142 
143  Path& operator=(const Path& rhs) noexcept {
144  if (&rhs != this) {
145  src = rhs.src;
146  steps = rhs.steps;
147  }
148  return *this;
149  }
150 
151  bool operator==(const Path& rhs) const {
152  return src == rhs.src && steps == rhs.steps;
153  }
154 
155  void addStep(Step step) {
156  steps.emplace_back(std::move(step));
157  }
158 
159  void reverse();
160 
161  // Append a path to another one.
162  // 5->4>3 appended by 3->2->1 => 5->4->3->2->1
163  bool append(Path path);
164 
165  bool operator<(const Path& rhs) const {
166  if (src != rhs.src) {
167  return src < rhs.src;
168  }
169  if (steps != rhs.steps) {
170  return steps < rhs.steps;
171  }
172  return false;
173  }
174 
175  bool hasDuplicateEdges() const;
176  bool hasDuplicateVertices() const;
177 };
178 
179 inline void swap(Step& a, Step& b) {
180  auto tmp = std::move(a);
181  a = std::move(b);
182  b = std::move(tmp);
183 }
184 
185 inline std::ostream& operator<<(std::ostream& os, const Path& p) {
186  return os << p.toString();
187 }
188 
189 } // namespace nebula
190 
191 namespace std {
192 
193 template <>
194 struct hash<nebula::Step> {
195  std::size_t operator()(const nebula::Step& h) const noexcept;
196 };
197 
198 template <>
199 struct hash<nebula::Path> {
200  std::size_t operator()(const nebula::Path& h) const noexcept;
201 };
202 
203 } // namespace std