@@ -129,6 +129,61 @@ void PrunePropertiesVisitor::visitCurrent(Aggregate *node) {
129
129
}
130
130
}
131
131
132
+ void PrunePropertiesVisitor::visit (ScanEdges *node) {
133
+ rootNode_ = false ;
134
+ pruneCurrent (node);
135
+ status_ = depsPruneProperties (node->dependencies ());
136
+ }
137
+
138
+ void PrunePropertiesVisitor::pruneCurrent (ScanEdges *node) {
139
+ auto &colNames = node->colNames ();
140
+ DCHECK (!colNames.empty ());
141
+ auto &edgeAlias = colNames.back ();
142
+ auto it = propsUsed_.colsSet .find (edgeAlias);
143
+ if (it != propsUsed_.colsSet .end ()) {
144
+ // all properties are used
145
+ return ;
146
+ }
147
+ auto *edgeProps = node->props ();
148
+ auto &edgePropsMap = propsUsed_.edgePropsMap ;
149
+
150
+ auto prunedEdgeProps = std::make_unique<std::vector<EdgeProp>>();
151
+ prunedEdgeProps->reserve (edgeProps->size ());
152
+ auto edgeAliasIter = edgePropsMap.find (edgeAlias);
153
+
154
+ for (auto &edgeProp : *edgeProps) {
155
+ auto edgeType = edgeProp.type_ref ().value ();
156
+ auto &props = edgeProp.props_ref ().value ();
157
+ EdgeProp newEdgeProp;
158
+ newEdgeProp.type_ref () = edgeType;
159
+ if (edgeAliasIter == edgePropsMap.end ()) {
160
+ // only type, dst are used
161
+ newEdgeProp.props_ref () = {nebula::kSrc , nebula::kDst , nebula::kType , nebula::kRank };
162
+ } else {
163
+ std::unordered_set<std::string> uniqueProps{
164
+ nebula::kSrc , nebula::kDst , nebula::kType , nebula::kRank };
165
+ std::vector<std::string> newProps;
166
+ auto &usedEdgeProps = edgeAliasIter->second ;
167
+ auto edgeTypeIter = usedEdgeProps.find (std::abs (edgeType));
168
+ if (edgeTypeIter != usedEdgeProps.end ()) {
169
+ uniqueProps.insert (edgeTypeIter->second .begin (), edgeTypeIter->second .end ());
170
+ }
171
+ auto unKnowEdgeIter = usedEdgeProps.find (unKnowType_);
172
+ if (unKnowEdgeIter != usedEdgeProps.end ()) {
173
+ uniqueProps.insert (unKnowEdgeIter->second .begin (), unKnowEdgeIter->second .end ());
174
+ }
175
+ for (auto &prop : props) {
176
+ if (uniqueProps.find (prop) != uniqueProps.end ()) {
177
+ newProps.emplace_back (prop);
178
+ }
179
+ }
180
+ newEdgeProp.props_ref () = std::move (newProps);
181
+ }
182
+ prunedEdgeProps->emplace_back (std::move (newEdgeProp));
183
+ }
184
+ node->setEdgeProps (std::move (prunedEdgeProps));
185
+ }
186
+
132
187
void PrunePropertiesVisitor::visit (Traverse *node) {
133
188
rootNode_ = false ;
134
189
visitCurrent (node);
@@ -176,24 +231,34 @@ void PrunePropertiesVisitor::pruneCurrent(Traverse *node) {
176
231
if (usedVertexProps.empty ()) {
177
232
node->setVertexProps (nullptr );
178
233
} else {
234
+ auto unknowIter = usedVertexProps.find (unKnowType_);
179
235
auto prunedVertexProps = std::make_unique<std::vector<VertexProp>>();
180
236
prunedVertexProps->reserve (usedVertexProps.size ());
181
237
for (auto &vertexProp : *vertexProps) {
182
238
auto tagId = vertexProp.tag_ref ().value ();
183
239
auto &props = vertexProp.props_ref ().value ();
240
+ std::unordered_set<std::string> usedProps;
241
+ if (unknowIter != usedVertexProps.end ()) {
242
+ usedProps.insert (unknowIter->second .begin (), unknowIter->second .end ());
243
+ }
184
244
auto tagIter = usedVertexProps.find (tagId);
185
- if (tagIter == usedVertexProps.end ()) {
245
+ if (tagIter != usedVertexProps.end ()) {
246
+ usedProps.insert (tagIter->second .begin (), tagIter->second .end ());
247
+ }
248
+ if (usedProps.empty ()) {
186
249
continue ;
187
250
}
188
- auto &usedProps = tagIter->second ;
189
- VertexProp newVProp;
190
- newVProp.tag_ref () = tagId;
191
251
std::vector<std::string> newProps;
192
252
for (auto &prop : props) {
193
253
if (usedProps.find (prop) != usedProps.end ()) {
194
254
newProps.emplace_back (prop);
195
255
}
196
256
}
257
+ if (newProps.empty ()) {
258
+ continue ;
259
+ }
260
+ VertexProp newVProp;
261
+ newVProp.tag_ref () = tagId;
197
262
newVProp.props_ref () = std::move (newProps);
198
263
prunedVertexProps->emplace_back (std::move (newVProp));
199
264
}
@@ -227,8 +292,7 @@ void PrunePropertiesVisitor::pruneCurrent(Traverse *node) {
227
292
if (edgeTypeIter != usedEdgeProps.end ()) {
228
293
uniqueProps.insert (edgeTypeIter->second .begin (), edgeTypeIter->second .end ());
229
294
}
230
- int kUnknowEdgeType = 0 ;
231
- auto unKnowEdgeIter = usedEdgeProps.find (kUnknowEdgeType );
295
+ auto unKnowEdgeIter = usedEdgeProps.find (unKnowType_);
232
296
if (unKnowEdgeIter != usedEdgeProps.end ()) {
233
297
uniqueProps.insert (unKnowEdgeIter->second .begin (), unKnowEdgeIter->second .end ());
234
298
}
@@ -318,24 +382,33 @@ void PrunePropertiesVisitor::pruneCurrent(AppendVertices *node) {
318
382
}
319
383
return ;
320
384
}
321
-
385
+ auto unknowIter = usedVertexProps. find (unKnowType_);
322
386
prunedVertexProps->reserve (usedVertexProps.size ());
323
387
for (auto &vertexProp : *vertexProps) {
324
388
auto tagId = vertexProp.tag_ref ().value ();
325
389
auto &props = vertexProp.props_ref ().value ();
326
390
auto tagIter = usedVertexProps.find (tagId);
327
- if (tagIter == usedVertexProps.end ()) {
391
+ std::unordered_set<std::string> usedProps;
392
+ if (unknowIter != usedVertexProps.end ()) {
393
+ usedProps.insert (unknowIter->second .begin (), unknowIter->second .end ());
394
+ }
395
+ if (tagIter != usedVertexProps.end ()) {
396
+ usedProps.insert (tagIter->second .begin (), tagIter->second .end ());
397
+ }
398
+ if (usedProps.empty ()) {
328
399
continue ;
329
400
}
330
- auto &usedProps = tagIter->second ;
331
- VertexProp newVProp;
332
- newVProp.tag_ref () = tagId;
333
401
std::vector<std::string> newProps;
334
402
for (auto &prop : props) {
335
403
if (usedProps.find (prop) != usedProps.end ()) {
336
404
newProps.emplace_back (prop);
337
405
}
338
406
}
407
+ if (newProps.empty ()) {
408
+ continue ;
409
+ }
410
+ VertexProp newVProp;
411
+ newVProp.tag_ref () = tagId;
339
412
newVProp.props_ref () = std::move (newProps);
340
413
prunedVertexProps->emplace_back (std::move (newVProp));
341
414
}
0 commit comments