MCPcopy Create free account
hub / github.com/apache/datafusion / gen_range_inner

Method gen_range_inner

datafusion/functions-nested/src/range.rs:298–350  ·  view source on GitHub ↗

Generates an array of integers from start to stop with a given step. This function takes 1 to 3 ArrayRefs as arguments, representing start, stop, and step values. It returns a `Result ` representing the resulting ListArray after the operation. # Arguments `args` - An array of 1 to 3 ArrayRefs representing start, stop, and step (step value can not be zero) values. # Examples gen_range

(&self, args: &[ArrayRef])

Source from the content-addressed store, hash-verified

296 /// gen_range(1, 4) => [1, 2, 3]
297 /// gen_range(1, 7, 2) => [1, 3, 5]
298 fn gen_range_inner(&self, args: &[ArrayRef]) -> Result<ArrayRef> {
299 let (start_array, stop_array, step_array) = match args {
300 [stop_array] => (None, as_int64_array(stop_array)?, None),
301 [start_array, stop_array] => (
302 Some(as_int64_array(start_array)?),
303 as_int64_array(stop_array)?,
304 None,
305 ),
306 [start_array, stop_array, step_array] => (
307 Some(as_int64_array(start_array)?),
308 as_int64_array(stop_array)?,
309 Some(as_int64_array(step_array)?),
310 ),
311 _ => return internal_err!("{} expects 1 to 3 arguments", self.name()),
312 };
313
314 let mut values = vec![];
315 let mut offsets = vec![0];
316 let mut valid = NullBufferBuilder::new(stop_array.len());
317 for (idx, stop) in stop_array.iter().enumerate() {
318 match retrieve_range_args(start_array, stop, step_array, idx) {
319 Some((_, _, 0)) => {
320 return exec_err!(
321 "step can't be 0 for function {}(start [, stop, step])",
322 self.name()
323 );
324 }
325 Some((start, stop, step)) => {
326 generate_range_values(
327 start,
328 stop,
329 step,
330 self.include_upper_bound,
331 &mut values,
332 )?;
333 offsets.push(values.len() as i32);
334 valid.append_non_null();
335 }
336 // If any of the arguments is NULL, append a NULL value to the result.
337 None => {
338 offsets.push(values.len() as i32);
339 valid.append_null();
340 }
341 };
342 }
343 let arr = Arc::new(ListArray::try_new(
344 Arc::new(Field::new_list_field(DataType::Int64, true)),
345 OffsetBuffer::new(offsets.into()),
346 Arc::new(Int64Array::from(values)),
347 valid.finish(),
348 )?);
349 Ok(arr)
350 }
351
352 fn gen_range_date(&self, args: &[ArrayRef]) -> Result<ArrayRef> {
353 let [start, stop, step] = take_function_args(self.name(), args)?;

Callers 1

invoke_with_argsMethod · 0.80

Calls 10

as_int64_arrayFunction · 0.85
newFunction · 0.85
retrieve_range_argsFunction · 0.85
generate_range_valuesFunction · 0.85
lenMethod · 0.45
iterMethod · 0.45
pushMethod · 0.45
append_nullMethod · 0.45
intoMethod · 0.45
finishMethod · 0.45

Tested by

no test coverage detected