| 407 | } |
| 408 | |
| 409 | QueryNode::Ptr QueryAnalyzer::create_querynode_from_node(const Node::Ptr &node, |
| 410 | uint32_t level, |
| 411 | std::string *err) { |
| 412 | QueryNode::Ptr query_node = nullptr; |
| 413 | |
| 414 | if (node == nullptr) { |
| 415 | return nullptr; |
| 416 | } |
| 417 | |
| 418 | // copy subclass object according to node op |
| 419 | if (node->type() == Node::NodeType::REL_EXPR) { |
| 420 | // REL_EXPR include T_EQ, T_NE, T_LT, T_GT, T_LE, T_GE, T_LIKE, T_IN, |
| 421 | // T_CONTAIN_ALL, T_CONTAIN_ANY, T_IS_NULL, T_IS_NOT_NULL |
| 422 | // use type == REL_EXPR to simplify */ |
| 423 | query_node = std::make_shared<QueryRelNode>(); |
| 424 | } else { |
| 425 | if (node->op() == NodeOp::T_INT_VALUE || |
| 426 | node->op() == NodeOp::T_FLOAT_VALUE || |
| 427 | node->op() == NodeOp::T_STRING_VALUE || |
| 428 | node->op() == NodeOp::T_NULL_VALUE || |
| 429 | node->op() == NodeOp::T_BOOL_VALUE) { |
| 430 | ConstantNode::Ptr constant_node = |
| 431 | std::dynamic_pointer_cast<ConstantNode>(node); |
| 432 | query_node = std::make_shared<QueryConstantNode>(constant_node->value()); |
| 433 | } else if (node->op() == NodeOp::T_ID) { |
| 434 | IDNode::Ptr id_node = std::dynamic_pointer_cast<IDNode>(node); |
| 435 | query_node = std::make_shared<QueryIDNode>(id_node->value()); |
| 436 | } else if (node->op() == NodeOp::T_VECTOR_MATRIX_VALUE) { |
| 437 | VectorMatrixNode::Ptr vector_node = |
| 438 | std::dynamic_pointer_cast<VectorMatrixNode>(node); |
| 439 | query_node = |
| 440 | std::make_shared<QueryVectorMatrixNode>(std::move(vector_node)); |
| 441 | } else if (node->op() == NodeOp::T_FUNCTION_CALL) { |
| 442 | FuncNode::Ptr func_node = std::dynamic_pointer_cast<FuncNode>(node); |
| 443 | QueryFuncNode::Ptr query_func_node = std::make_shared<QueryFuncNode>(); |
| 444 | query_func_node->set_func_name_node(create_querynode_from_node( |
| 445 | func_node->get_func_name_node(), level + 1, err)); |
| 446 | for (auto argument : func_node->arguments()) { |
| 447 | query_func_node->add_argument( |
| 448 | create_querynode_from_node(argument, level + 1, err)); |
| 449 | } |
| 450 | query_node = std::move(query_func_node); |
| 451 | } else if (node->op() == NodeOp::T_LIST_VALUE) { |
| 452 | InValueExprListNode::Ptr in_value_expr_list_node = |
| 453 | std::dynamic_pointer_cast<InValueExprListNode>(node); |
| 454 | QueryListNode::Ptr query_in_value_expr_node = |
| 455 | std::make_shared<QueryListNode>(); |
| 456 | |
| 457 | for (auto in_value_expr : in_value_expr_list_node->in_value_expr_list()) { |
| 458 | query_in_value_expr_node->add_value_expr( |
| 459 | create_querynode_from_node(in_value_expr, level, err)); |
| 460 | } |
| 461 | query_in_value_expr_node->set_exclude(in_value_expr_list_node->exclude()); |
| 462 | query_node = std::move(query_in_value_expr_node); |
| 463 | } else { /* others are normal Node */ |
| 464 | query_node = std::make_shared<QueryNode>(); |
| 465 | } |
| 466 | } |
nothing calls this directly
no test coverage detected