Skip to main content

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                expand_paths: true,
53                hidden_file_prefix: None,
54                projection: None,
55                column_mapping: None,
56                default_values: None,
57                row_index: None,
58                pre_slice: args.n_rows.map(|len| Slice::Positive { offset: 0, len }),
59                cast_columns_policy: CastColumnsPolicy::ERROR_ON_MISMATCH,
60                missing_columns_policy: MissingColumnsPolicy::Raise,
61                extra_columns_policy: ExtraColumnsPolicy::Raise,
62                include_file_paths: None,
63                deletion_files: None,
64                table_statistics: None,
65                row_count: None,
66                source_sizes: None,
67            },
68        )?
69        .build()
70        .into();
71
72        if let Some(rc) = args.row_index {
73            lf = lf.with_row_index(rc.name.clone(), Some(rc.offset))
74        };
75
76        Ok(lf)
77    }
78}