polars_lazy/scan/
anonymous_scan.rs

1use polars_core::prelude::*;
2use polars_io::{HiveOptions, RowIndex};
3use polars_utils::slice_enum::Slice;
4
5use crate::prelude::*;
6
7#[derive(Clone)]
8pub struct ScanArgsAnonymous {
9    pub infer_schema_length: Option<usize>,
10    pub schema: Option<SchemaRef>,
11    pub skip_rows: Option<usize>,
12    pub n_rows: Option<usize>,
13    pub row_index: Option<RowIndex>,
14    pub name: &'static str,
15}
16
17impl Default for ScanArgsAnonymous {
18    fn default() -> Self {
19        Self {
20            infer_schema_length: None,
21            skip_rows: None,
22            n_rows: None,
23            schema: None,
24            row_index: None,
25            name: "ANONYMOUS SCAN",
26        }
27    }
28}
29impl LazyFrame {
30    pub fn anonymous_scan(
31        function: Arc<dyn AnonymousScan>,
32        args: ScanArgsAnonymous,
33    ) -> PolarsResult<Self> {
34        let schema = match args.schema {
35            Some(s) => s,
36            None => function.schema(args.infer_schema_length)?,
37        };
38
39        let mut lf: LazyFrame = DslBuilder::anonymous_scan(
40            function,
41            AnonymousScanOptions {
42                skip_rows: args.skip_rows,
43                fmt_str: args.name,
44            },
45            UnifiedScanArgs {
46                schema: Some(schema),
47                cloud_options: None,
48                hive_options: HiveOptions::new_disabled(),
49                rechunk: false,
50                cache: false,
51                glob: false,
52                projection: None,
53                column_mapping: None,
54                default_values: None,
55                row_index: None,
56                pre_slice: args.n_rows.map(|len| Slice::Positive { offset: 0, len }),
57                cast_columns_policy: CastColumnsPolicy::ERROR_ON_MISMATCH,
58                missing_columns_policy: MissingColumnsPolicy::Raise,
59                extra_columns_policy: ExtraColumnsPolicy::Raise,
60                include_file_paths: None,
61                deletion_files: None,
62            },
63        )?
64        .build()
65        .into();
66
67        if let Some(rc) = args.row_index {
68            lf = lf.with_row_index(rc.name.clone(), Some(rc.offset))
69        };
70
71        Ok(lf)
72    }
73}