| 23 | |
| 24 | namespace gandiva { |
| 25 | Result<std::shared_ptr<RandomGeneratorHolder>> RandomGeneratorHolder::Make( |
| 26 | const FunctionNode& node) { |
| 27 | ARROW_RETURN_IF(node.children().size() > 1, |
| 28 | Status::Invalid("'random' function requires at most one parameter")); |
| 29 | |
| 30 | if (node.children().size() == 0) { |
| 31 | return std::shared_ptr<RandomGeneratorHolder>(new RandomGeneratorHolder()); |
| 32 | } |
| 33 | |
| 34 | auto literal = dynamic_cast<LiteralNode*>(node.children().at(0).get()); |
| 35 | ARROW_RETURN_IF(literal == nullptr, |
| 36 | Status::Invalid("'random' function requires a literal as parameter")); |
| 37 | |
| 38 | auto literal_type = literal->return_type()->id(); |
| 39 | ARROW_RETURN_IF( |
| 40 | literal_type != arrow::Type::INT32, |
| 41 | Status::Invalid("'random' function requires an int32 literal as parameter")); |
| 42 | |
| 43 | return std::shared_ptr<RandomGeneratorHolder>(new RandomGeneratorHolder( |
| 44 | literal->is_null() ? 0 : std::get<int32_t>(literal->holder()))); |
| 45 | } |
| 46 | |
| 47 | Result<std::shared_ptr<RandomIntegerGeneratorHolder>> RandomIntegerGeneratorHolder::Make( |
| 48 | const FunctionNode& node) { |