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