6
6
#ifndef COMMON_EXPRESSION_CONTAINEREXPRESSION_H_
7
7
#define COMMON_EXPRESSION_CONTAINEREXPRESSION_H_
8
8
9
+ #include " common/base/ObjectPool.h"
10
+ #include " common/expression/ConstantExpression.h"
11
+ #include " common/expression/ContainerExpression.h"
9
12
#include " common/expression/Expression.h"
10
13
11
14
namespace nebula {
@@ -63,7 +66,16 @@ class MapItemList final {
63
66
std::vector<Pair> items_;
64
67
};
65
68
66
- class ListExpression final : public Expression {
69
+ class ContainerExpression : public Expression {
70
+ public:
71
+ virtual const std::vector<Expression *> getKeys () const = 0;
72
+ virtual size_t size () const = 0;
73
+
74
+ protected:
75
+ ContainerExpression (ObjectPool *pool, Expression::Kind kind) : Expression(pool, kind) {}
76
+ };
77
+
78
+ class ListExpression final : public ContainerExpression {
67
79
public:
68
80
ListExpression &operator =(const ListExpression &rhs) = delete ;
69
81
ListExpression &operator =(ListExpression &&) = delete ;
@@ -84,15 +96,15 @@ class ListExpression final : public Expression {
84
96
items_[index ] = item;
85
97
}
86
98
87
- std::vector<Expression *> get () {
99
+ const std::vector<Expression *> getKeys () const override {
88
100
return items_;
89
101
}
90
102
91
103
void setItems (std::vector<Expression *> items) {
92
104
items_ = items;
93
105
}
94
106
95
- size_t size () const {
107
+ size_t size () const override {
96
108
return items_.size ();
97
109
}
98
110
@@ -116,9 +128,9 @@ class ListExpression final : public Expression {
116
128
117
129
private:
118
130
friend ObjectPool;
119
- explicit ListExpression (ObjectPool *pool) : Expression (pool, Kind::kList ) {}
131
+ explicit ListExpression (ObjectPool *pool) : ContainerExpression (pool, Kind::kList ) {}
120
132
121
- ListExpression (ObjectPool *pool, ExpressionList *items) : Expression (pool, Kind::kList ) {
133
+ ListExpression (ObjectPool *pool, ExpressionList *items) : ContainerExpression (pool, Kind::kList ) {
122
134
items_ = items->get ();
123
135
}
124
136
@@ -131,7 +143,7 @@ class ListExpression final : public Expression {
131
143
Value result_;
132
144
};
133
145
134
- class SetExpression final : public Expression {
146
+ class SetExpression final : public ContainerExpression {
135
147
public:
136
148
SetExpression &operator =(const SetExpression &rhs) = delete ;
137
149
SetExpression &operator =(SetExpression &&) = delete ;
@@ -152,15 +164,15 @@ class SetExpression final : public Expression {
152
164
items_[index ] = item;
153
165
}
154
166
155
- std::vector<Expression *> get () {
167
+ const std::vector<Expression *> getKeys () const override {
156
168
return items_;
157
169
}
158
170
159
171
void setItems (std::vector<Expression *> items) {
160
172
items_ = items;
161
173
}
162
174
163
- size_t size () const {
175
+ size_t size () const override {
164
176
return items_.size ();
165
177
}
166
178
@@ -184,9 +196,9 @@ class SetExpression final : public Expression {
184
196
185
197
private:
186
198
friend ObjectPool;
187
- explicit SetExpression (ObjectPool *pool) : Expression (pool, Kind::kSet ) {}
199
+ explicit SetExpression (ObjectPool *pool) : ContainerExpression (pool, Kind::kSet ) {}
188
200
189
- SetExpression (ObjectPool *pool, ExpressionList *items) : Expression (pool, Kind::kSet ) {
201
+ SetExpression (ObjectPool *pool, ExpressionList *items) : ContainerExpression (pool, Kind::kSet ) {
190
202
items_ = items->get ();
191
203
}
192
204
@@ -199,7 +211,7 @@ class SetExpression final : public Expression {
199
211
Value result_;
200
212
};
201
213
202
- class MapExpression final : public Expression {
214
+ class MapExpression final : public ContainerExpression {
203
215
public:
204
216
MapExpression &operator =(const MapExpression &rhs) = delete ;
205
217
MapExpression &operator =(MapExpression &&) = delete ;
@@ -230,7 +242,15 @@ class MapExpression final : public Expression {
230
242
return items_;
231
243
}
232
244
233
- size_t size () const {
245
+ const std::vector<Expression *> getKeys () const override {
246
+ std::vector<Expression *> keys;
247
+ for (const auto &item : items_) {
248
+ keys.emplace_back (ConstantExpression::make (pool_, item.first ));
249
+ }
250
+ return keys;
251
+ }
252
+
253
+ size_t size () const override {
234
254
return items_.size ();
235
255
}
236
256
@@ -254,9 +274,9 @@ class MapExpression final : public Expression {
254
274
255
275
private:
256
276
friend ObjectPool;
257
- explicit MapExpression (ObjectPool *pool) : Expression (pool, Kind::kMap ) {}
277
+ explicit MapExpression (ObjectPool *pool) : ContainerExpression (pool, Kind::kMap ) {}
258
278
259
- MapExpression (ObjectPool *pool, MapItemList *items) : Expression (pool, Kind::kMap ) {
279
+ MapExpression (ObjectPool *pool, MapItemList *items) : ContainerExpression (pool, Kind::kMap ) {
260
280
items_ = items->get ();
261
281
}
262
282
0 commit comments