Skip to content

Commit 1a3820d

Browse files
committed
edge
1 parent b67c292 commit 1a3820d

File tree

5 files changed

+107
-23
lines changed

5 files changed

+107
-23
lines changed

flex/engines/graph_db/runtime/common/operators/retrieve/edge_expand.cc

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,47 @@ static Context expand_edge_without_predicate_optional_impl(
143143
}
144144
});
145145

146+
ctx.set_with_reshuffle(params.alias, builder.finish(), shuffle_offset);
147+
return ctx;
148+
} else if (params.dir == Direction::kIn) {
149+
auto& input_vertex_list =
150+
*std::dynamic_pointer_cast<IVertexColumn>(ctx.get(params.v_tag));
151+
CHECK(!input_vertex_list.is_optional())
152+
<< "not support optional vertex column as input currently";
153+
auto& triplet = params.labels[0];
154+
auto props = graph.schema().get_edge_properties(
155+
triplet.src_label, triplet.dst_label, triplet.edge_label);
156+
PropertyType pt = PropertyType::kEmpty;
157+
if (!props.empty()) {
158+
pt = props[0];
159+
}
160+
if (props.size() > 1) {
161+
pt = PropertyType::kRecordView;
162+
}
163+
OptionalSDSLEdgeColumnBuilder builder(Direction::kIn, triplet, pt);
164+
foreach_vertex(input_vertex_list,
165+
[&](size_t index, label_t label, vid_t v) {
166+
if (label == triplet.dst_label) {
167+
auto ie_iter = graph.GetInEdgeIterator(
168+
label, v, triplet.src_label, triplet.edge_label);
169+
bool has_edge = false;
170+
while (ie_iter.IsValid()) {
171+
auto nbr = ie_iter.GetNeighbor();
172+
builder.push_back_opt(nbr, v, ie_iter.GetData());
173+
shuffle_offset.push_back(index);
174+
ie_iter.Next();
175+
has_edge = true;
176+
}
177+
if (!has_edge) {
178+
builder.push_back_null();
179+
shuffle_offset.push_back(index);
180+
}
181+
} else {
182+
builder.push_back_null();
183+
shuffle_offset.push_back(index);
184+
}
185+
});
186+
146187
ctx.set_with_reshuffle(params.alias, builder.finish(), shuffle_offset);
147188
return ctx;
148189
}

flex/engines/graph_db/runtime/common/operators/retrieve/edge_expand.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ class EdgeExpand {
260260
const EdgeExpandParams& params,
261261
const PRED_T& pred) {
262262
if (params.is_optional) {
263-
LOG(FATAL) << "not support optional edge expand";
263+
LOG(FATAL) << "not support optional edge expand with predicate";
264264
}
265265
std::shared_ptr<IVertexColumn> input_vertex_list =
266266
std::dynamic_pointer_cast<IVertexColumn>(ctx.get(params.v_tag));

flex/engines/graph_db/runtime/common/operators/retrieve/edge_expand_impl.cc

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,12 @@ expand_vertex_without_predicate_optional_impl(
213213
}
214214
}
215215
LOG(INFO) << "ed_types.size() " << se << " " << sp;
216-
LOG(FATAL) << "not implemented" << label_dirs.size();
217-
return std::make_pair(nullptr, std::vector<size_t>());
216+
int label_num = graph.schema().vertex_label_num();
217+
std::vector<std::vector<std::tuple<label_t, label_t, Direction>>> _label_dirs(
218+
label_num);
219+
_label_dirs[input_label] = label_dirs;
220+
return expand_vertex_optional_impl<DummyPredicate<Any>>(
221+
graph, input, _label_dirs, DummyPredicate<Any>());
218222
}
219223

220224
std::pair<std::shared_ptr<IContextColumn>, std::vector<size_t>>
@@ -369,12 +373,8 @@ expand_vertex_without_predicate_optional_impl(
369373
}
370374
}
371375
}
372-
bool se = true;
373376
for (auto& vec : label_dirs) {
374377
grape::DistinctSort(vec);
375-
if (vec.size() > 1) {
376-
se = false;
377-
}
378378
}
379379
bool sp = true;
380380
if (ed_types.size() == 0) {
@@ -394,16 +394,24 @@ expand_vertex_without_predicate_optional_impl(
394394
if (sp && (!check_exist_special_edge(graph, labels, dir))) {
395395
const PropertyType& ed_type = ed_types[0];
396396
if (ed_type == PropertyType::Empty()) {
397-
if (se) {
398-
LOG(FATAL) << "not implemented";
399-
} else {
400-
return expand_vertex_np_me_sp_optional<
401-
grape::EmptyType, DummyPredicate<grape::EmptyType>>(
402-
graph, input, label_dirs, DummyPredicate<grape::EmptyType>());
403-
}
397+
return expand_vertex_np_me_sp_optional<grape::EmptyType,
398+
DummyPredicate<grape::EmptyType>>(
399+
graph, input, label_dirs, DummyPredicate<grape::EmptyType>());
400+
} else if (ed_type == PropertyType::Date()) {
401+
return expand_vertex_np_me_sp_optional<Date, DummyPredicate<Date>>(
402+
graph, input, label_dirs, DummyPredicate<Date>());
403+
} else if (ed_type == PropertyType::Int32()) {
404+
return expand_vertex_np_me_sp_optional<int, DummyPredicate<int>>(
405+
graph, input, label_dirs, DummyPredicate<int>());
406+
} else if (ed_type == PropertyType::Int64()) {
407+
return expand_vertex_np_me_sp_optional<int64_t, DummyPredicate<int64_t>>(
408+
graph, input, label_dirs, DummyPredicate<int64_t>());
409+
} else {
410+
LOG(INFO) << "type - " << ed_type << " - not implemented, fallback";
404411
}
405412
}
406-
return {nullptr, {}};
413+
return expand_vertex_optional_impl<DummyPredicate<Any>>(
414+
graph, input, label_dirs, DummyPredicate<Any>());
407415
}
408416

409417
std::pair<std::shared_ptr<IContextColumn>, std::vector<size_t>>

flex/engines/graph_db/runtime/common/operators/retrieve/edge_expand_impl.h

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ expand_vertex_np_me_sp_optional(
288288
}
289289
if (single_nbr_label) {
290290
OptionalSLVertexColumnBuilder builder(nbr_labels[0]);
291-
#if 1
292291
foreach_vertex(input, [&](size_t idx, label_t l, vid_t v) {
293292
if (!input.has_value(idx)) {
294293
builder.push_back_null();
@@ -318,8 +317,7 @@ expand_vertex_np_me_sp_optional(
318317
}
319318
++idx;
320319
});
321-
#else
322-
#endif
320+
323321
col = builder.finish();
324322
} else {
325323
OptionalMLVertexColumnBuilder builder;
@@ -919,6 +917,48 @@ expand_vertex_np_me_mp(
919917
return std::make_pair(builder.finish(), std::move(offsets));
920918
}
921919

920+
template <typename PRED_T>
921+
inline std::pair<std::shared_ptr<IContextColumn>, std::vector<size_t>>
922+
expand_vertex_optional_impl(
923+
const GraphReadInterface& graph, const IVertexColumn& input,
924+
const std::vector<std::vector<std::tuple<label_t, label_t, Direction>>>&
925+
label_dirs,
926+
const PRED_T& pred) {
927+
OptionalMLVertexColumnBuilder builder;
928+
std::vector<size_t> offsets;
929+
foreach_vertex(input, [&](size_t idx, label_t label, vid_t v) {
930+
if (!input.has_value(idx)) {
931+
builder.push_back_null();
932+
offsets.push_back(idx);
933+
return;
934+
}
935+
bool has_nbr = false;
936+
for (auto& t : label_dirs[label]) {
937+
label_t nbr_label = std::get<0>(t);
938+
label_t edge_label = std::get<1>(t);
939+
Direction dir = std::get<2>(t);
940+
auto it =
941+
(dir == Direction::kOut)
942+
? (graph.GetOutEdgeIterator(label, v, nbr_label, edge_label))
943+
: (graph.GetInEdgeIterator(label, v, nbr_label, edge_label));
944+
while (it.IsValid()) {
945+
auto nbr = it.GetNeighbor();
946+
if (pred(label, v, nbr_label, nbr, edge_label, dir, it.GetData())) {
947+
builder.push_back_vertex({nbr_label, nbr});
948+
offsets.push_back(idx);
949+
has_nbr = true;
950+
}
951+
it.Next();
952+
}
953+
}
954+
if (!has_nbr) {
955+
builder.push_back_null();
956+
offsets.push_back(idx);
957+
}
958+
});
959+
return std::make_pair(builder.finish(), std::move(offsets));
960+
}
961+
922962
template <typename GPRED_T, typename EDATA_T>
923963
struct GPredWrapper {
924964
GPredWrapper(const GPRED_T& gpred) : gpred_(gpred) {}

flex/engines/graph_db/runtime/execute/ops/retrieve/project.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,11 +1457,6 @@ ProjectOrderByOprBuilder::Build(const gs::Schema& schema,
14571457
std::move(exprs), index_set, order_by_pairs,
14581458
lower, upper, first_tuple),
14591459
ret_meta);
1460-
/*return std::make_pair(
1461-
std::make_unique<ProjectOrderByOpr>(
1462-
plan.plan(op_idx).opr().project(),
1463-
plan.plan(op_idx + 1).opr().order_by(), data_types),
1464-
ret_meta);*/
14651460
} else {
14661461
return std::make_pair(nullptr, ContextMeta());
14671462
}

0 commit comments

Comments
 (0)