in flex/codegen/src/pegasus/pegasus_get_v_builder.h [110:317]
std::string Build() const {
std::stringstream ss;
bool filter_label = false;
std::pair<int, std::vector<int32_t>> input_type;
int32_t input_index = 0;
if (in_tag_id_ == -1) {
input_type = ctx_.GetHeadType();
CHECK(input_type.first == 0);
if (!vertex_labels_.empty()) {
for (size_t i = 0; i < input_type.second.size(); ++i) {
if (std::find(vertex_labels_.begin(), vertex_labels_.end(),
input_type.second[i]) == vertex_labels_.end()) {
VLOG(10) << "Can not find label " << input_type.second.size();
filter_label = true;
break;
}
}
}
} else {
input_type = ctx_.GetAliasType(in_tag_id_);
input_index = ctx_.GetAliasIndex(in_tag_id_);
if (input_type.first != 0) {
VLOG(10) << "Unexpected input type " << input_type.first;
}
CHECK(input_type.first == 0);
if (!vertex_labels_.empty()) {
for (size_t i = 0; i < input_type.second.size(); ++i) {
if (std::find(vertex_labels_.begin(), vertex_labels_.end(),
input_type.second[i]) == vertex_labels_.end()) {
VLOG(10) << "Can not find label " << input_type.second.size();
filter_label = true;
break;
}
}
}
}
VLOG(10) << "Labels size " << input_type.second.size();
VLOG(10) << "Labels type " << input_type.first;
auto latest_outputs = ctx_.GetOutput();
std::string getv_head_code = write_head();
std::string getv_body_code;
auto in_data_type = latest_outputs[input_index];
switch (v_opt_) {
case GetVType::kItself: {
if (filter_label) {
} else {
if (has_predicate_) {
if (input_type.second.size() == 1) {
int32_t label_id = input_type.second[0];
getv_body_code = filter_by_predicate(input_index, label_id);
} else {
boost::format multi_labels_fmter(
"let vertex_label = "
"LDBCVertexParser::<usize>::get_label_id(i%1% as usize);\n"
"%2%");
std::string getv_code;
for (auto i : input_type.second) {
boost::format getv_fmter(
"if vertex_label == %1% {\n"
"%2"
"}\n");
getv_fmter % i % filter_by_predicate(input_index, i);
getv_code += getv_fmter.str();
}
multi_labels_fmter % input_index % getv_code;
getv_body_code = multi_labels_fmter.str();
}
} else {
// return stream and do nothing
boost::format empty_fmter("let stream_%1% = stream%2%");
empty_fmter % operator_index_ % (operator_index_ - 1);
return empty_fmter.str();
}
}
break;
}
case GetVType::kEnd: {
boost::format get_id_fmter("i%1%%2%");
if (in_data_type.size() == 1) {
if (in_data_type[0] == codegen::DataType::kInt64Array) {
get_id_fmter % input_index % ".last()";
} else {
get_id_fmter % input_index % "";
}
} else {
LOG(FATAL) << "Unsupported type";
}
if (filter_label) {
boost::format filter_fmter(
"vertex_id = %1%;\n"
"let vertex_label = "
"LDBCVertexParser::<usize>::get_label_id(vertex_id as usize);\n"
"let label_list = vec![%2%];\n"
"if label_list.contains(vertex_label) {\n"
"result.push(vertex_id);\n"
"}\n");
std::string label_string = generate_label_string();
filter_fmter % get_id_fmter.str() % label_string;
getv_body_code = filter_fmter.str();
} else {
boost::format no_filter_fmter(
"vertex_id = %1%;\n"
"result.push(vertex_id);\n");
no_filter_fmter % get_id_fmter.str();
getv_body_code = no_filter_fmter.str();
}
break;
}
case GetVType::kStart: {
boost::format get_id_fmter("i%1%%2%");
if (in_data_type.size() == 1) {
if (in_data_type[0] == codegen::DataType::kInt64Array) {
get_id_fmter % input_index % ".start()";
} else {
get_id_fmter % input_index % "";
}
} else {
LOG(FATAL) << "Unsupported type";
}
if (filter_label) {
boost::format filter_fmter(
"vertex_id = %1%;\n"
"let vertex_label = "
"LDBCVertexParser::<usize>::get_label_id(vertex_id as usize);\n"
"let label_list = vec![%2%];\n"
"if label_list.contains(vertex_label) {\n"
"result.push(vertex_id);\n"
"}\n");
std::string label_string = generate_label_string();
filter_fmter % get_id_fmter.str() % label_string;
getv_body_code = filter_fmter.str();
} else {
boost::format no_filter_fmter(
"vertex_id = %1%;\n"
"result.push(vertex_id);\n");
no_filter_fmter % get_id_fmter.str();
getv_body_code = no_filter_fmter.str();
}
break;
}
case GetVType::kOther: {
boost::format get_id_fmter("i%1%%2%");
if (in_data_type.size() == 1) {
if (in_data_type[0] == codegen::DataType::kInt64Array) {
LOG(FATAL) << "Unsupported data type in kOther";
} else {
get_id_fmter % input_index % "";
}
} else {
LOG(FATAL) << "Unsupported type";
}
if (filter_label) {
boost::format filter_fmter(
"vertex_id = %1%;\n"
"let vertex_label = "
"LDBCVertexParser::<usize>::get_label_id(vertex_id as usize);\n"
"let label_list = vec![%2%];\n"
"if label_list.contains(vertex_label) {\n"
"result.push(vertex_id);\n"
"}\n");
std::string label_string = generate_label_string();
filter_fmter % get_id_fmter.str() % label_string;
getv_body_code = filter_fmter.str();
} else {
boost::format no_filter_fmter(
"vertex_id = %1%;\n"
"result.push(vertex_id);\n");
no_filter_fmter % get_id_fmter.str();
getv_body_code = no_filter_fmter.str();
}
break;
}
case GetVType::kBoth:
LOG(FATAL) << "Unsupported getv type";
}
std::vector<codegen::DataType> output;
output.push_back(codegen::DataType::kInt64);
latest_outputs[0] = output;
ctx_.SetHeadType(input_type.first, input_type.second);
int32_t input_size = ctx_.InputSize();
boost::format edge_expand_output_fmter(
"Ok(result.into_iter().map(move |res| %1%))\n"
"})?;");
ss << "Ok(result.into_iter().map(|res| (res";
int32_t output_index = -1;
if (out_tag_id_ != -1) {
ctx_.SetAlias(out_tag_id_);
ctx_.SetAliasType(out_tag_id_, input_type.first, input_type.second);
output_index = ctx_.GetAliasIndex(out_tag_id_);
ctx_.SetOutput(output_index, output);
}
std::string output_params = generate_output_list(
"i", input_size, "res", output_index, ctx_.ContainHead());
edge_expand_output_fmter % output_params;
ctx_.SetHead(true);
return getv_head_code + getv_body_code + edge_expand_output_fmter.str();
}