std::string Build()

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();
  }