| 64 | } |
| 65 | |
| 66 | Node::Ptr SelectInfo::copy_node(const Node::Ptr &node) { |
| 67 | Node::Ptr new_node = nullptr; |
| 68 | |
| 69 | if (node == nullptr) { |
| 70 | return nullptr; |
| 71 | } |
| 72 | |
| 73 | if (node->op() == NodeOp::T_INT_VALUE || |
| 74 | node->op() == NodeOp::T_FLOAT_VALUE || |
| 75 | node->op() == NodeOp::T_STRING_VALUE || |
| 76 | node->op() == NodeOp::T_NULL_VALUE || |
| 77 | node->op() == NodeOp::T_BOOL_VALUE) { |
| 78 | ConstantNode::Ptr constant_node = |
| 79 | std::dynamic_pointer_cast<ConstantNode>(node); |
| 80 | new_node = std::make_shared<ConstantNode>(constant_node->value()); |
| 81 | } else if (node->op() == NodeOp::T_ID) { |
| 82 | IDNode::Ptr id_node = std::dynamic_pointer_cast<IDNode>(node); |
| 83 | new_node = std::make_shared<IDNode>(id_node->value()); |
| 84 | } else if (node->op() == NodeOp::T_VECTOR_MATRIX_VALUE) { |
| 85 | VectorMatrixNode::Ptr vector_node = |
| 86 | std::dynamic_pointer_cast<VectorMatrixNode>(node); |
| 87 | new_node = std::make_shared<VectorMatrixNode>( |
| 88 | vector_node->matrix(), vector_node->sparse_indices(), |
| 89 | vector_node->sparse_values(), vector_node->query_params()); |
| 90 | } else if (node->op() == NodeOp::T_FUNCTION_CALL) { |
| 91 | FuncNode::Ptr func_node = std::dynamic_pointer_cast<FuncNode>(node); |
| 92 | FuncNode::Ptr new_func_node = std::make_shared<FuncNode>(); |
| 93 | new_func_node->set_func_name_node( |
| 94 | copy_node(func_node->get_func_name_node())); |
| 95 | for (auto argument : func_node->arguments()) { |
| 96 | new_func_node->add_argument(copy_node(argument)); |
| 97 | } |
| 98 | new_node = std::move(new_func_node); |
| 99 | } else { /* others are normal Node */ |
| 100 | new_node = std::make_shared<Node>(); |
| 101 | } |
| 102 | |
| 103 | |
| 104 | // copy nodeOp |
| 105 | new_node->set_op(node->op()); |
| 106 | |
| 107 | // copy left & right |
| 108 | if (node->left() != nullptr) { |
| 109 | new_node->set_left(copy_node(node->left())); |
| 110 | } |
| 111 | if (node->right() != nullptr) { |
| 112 | new_node->set_right(copy_node(node->right())); |
| 113 | } |
| 114 | |
| 115 | return new_node; |
| 116 | } |
| 117 | |
| 118 | void SelectInfo::add_selected_elem(SelectedElemInfo::Ptr selected_elem_info) { |
| 119 | selected_elems_.push_back(std::move(selected_elem_info)); |
nothing calls this directly
no test coverage detected