1#![allow(clippy::collapsible_if)]
44#![allow(clippy::let_and_return)]
45
46pub mod config;
47pub mod dataframe;
48pub mod prelude;
49pub mod schema;
50pub mod session;
51pub mod traits;
52
53pub mod engine {
56 pub use robin_sparkless_core::engine::{
57 CollectedRows, DataFrameBackend, DataFrameReaderBackend, GroupedDataBackend, JoinType,
58 PlanExecutor, SparkSessionBackend,
59 };
60 pub use robin_sparkless_core::expr::{
61 ExprIr, LiteralValue, WhenBuilder, WhenThenBuilder, alias, and_, approx_count_distinct,
62 between, bool_and, call, col, collect_list, collect_set, count, count_distinct, count_if,
63 eq, every, first, ge, gt, is_in, is_null, kurtosis, le, lit_bool, lit_f64, lit_i32,
64 lit_i64, lit_null, lit_str, lt, max, mean, median, min, mode, ne, not_, or_, skewness, std,
65 stddev, stddev_pop, stddev_samp, sum, try_avg, try_sum, var_pop, var_samp, variance, when,
66 };
67 pub use robin_sparkless_core::{DataType, EngineError, StructField, StructType};
68}
69
70pub mod polars {
73 pub use robin_sparkless_polars::functions::{SortOrder, *};
74 pub use robin_sparkless_polars::{
75 Column, Expr, PlDataFrame, PlDataType, PolarsError, RustUdf, StructTypePolarsExt,
76 UdfRegistry, broadcast, expression, schema_from_json,
77 };
78 pub use robin_sparkless_polars::{column, error, functions, type_coercion};
79}
80
81pub use engine::CollectedRows;
85pub use engine::{
86 DataType, EngineError, ExprIr, LiteralValue, StructField, StructType, WhenBuilder,
87 WhenThenBuilder, alias, and_, approx_count_distinct, between, bool_and, call, col,
88 collect_list, collect_set, count, count_distinct, count_if, eq, every, first, ge, gt, is_in,
89 is_null, kurtosis, le, lit_bool, lit_f64, lit_i32, lit_i64, lit_null, lit_str, lt, max, mean,
90 median, min, mode, ne, not_, or_, skewness, std, stddev, stddev_pop, stddev_samp, sum, try_avg,
91 try_sum, var_pop, var_samp, variance, when,
92};
93pub use polars::{
94 Column, Expr, PolarsError, RustUdf, StructTypePolarsExt, UdfRegistry, broadcast, expression,
95 schema_from_json,
96};
97pub use robin_sparkless_polars::functions;
99pub use robin_sparkless_polars::functions::{SortOrder, *};
100
101pub use dataframe::{
103 CubeRollupData, DataFrame, DataFrameNa, DataFrameStat, DataFrameWriter, GroupBySpec,
104 GroupedData, JoinType, PivotedGroupedData, SaveMode, SelectItem, WriteFormat, WriteMode,
105 expr_contains_only_join_key_equalities, try_extract_join_eq_columns,
106 try_extract_join_eq_columns_all,
107};
108pub use session::{DataFrameReader, SparkSession, SparkSessionBuilder};
109
110pub use robin_sparkless_polars::plan::{PlanError, PlanExprError};
112pub use traits::{FromRobinDf, IntoRobinDf};
113
114pub fn execute_plan(
116 session: &SparkSession,
117 data: Vec<Vec<serde_json::Value>>,
118 schema: Vec<(String, String)>,
119 plan: &[serde_json::Value],
120) -> Result<DataFrame, PlanError> {
121 use robin_sparkless_core::engine::PlanExecutor as _;
122
123 let boxed = robin_sparkless_polars::plan::PolarsPlanExecutor::execute_plan(
125 &session.0, data, schema, plan,
126 )
127 .map_err(|e| PlanError::InvalidPlan(e.to_string()))?;
128
129 crate::dataframe::from_backend(boxed).map_err(|e| PlanError::InvalidPlan(e.to_string()))
130}
131
132pub use config::SparklessConfig;
133
134pub fn to_engine_error(e: PolarsError) -> EngineError {
136 robin_sparkless_polars::polars_to_core_error(e)
137}
138
139pub use robin_sparkless_polars::{
141 clear_thread_udf_context, set_thread_udf_context, set_thread_udf_context_with_tz,
142};
143
144#[cfg(feature = "sql")]
145pub mod sql {
146 use crate::dataframe::DataFrame;
148 use crate::session::SparkSession;
149 use robin_sparkless_polars::PolarsError;
150
151 pub use robin_sparkless_polars::sql::{Statement, execute_sql, parse_sql};
152
153 pub fn expr_string_to_polars(
155 expr_str: &str,
156 session: &SparkSession,
157 df: &DataFrame,
158 ) -> Result<robin_sparkless_polars::Expr, PolarsError> {
159 robin_sparkless_polars::sql::expr_string_to_polars(expr_str, &session.0, &df.0)
160 }
161
162 pub fn execute_sql_root(session: &SparkSession, query: &str) -> Result<DataFrame, PolarsError> {
164 robin_sparkless_polars::sql::execute_sql(&session.0, query).map(DataFrame)
165 }
166}
167
168#[cfg(feature = "delta")]
169pub mod delta {
170 use crate::dataframe::DataFrame;
172 use robin_sparkless_polars::PolarsError;
173 use std::path::Path;
174
175 pub use robin_sparkless_polars::delta::{read_delta, read_delta_with_version, write_delta};
176
177 pub fn read_delta_root(
179 path: impl AsRef<Path>,
180 case_sensitive: bool,
181 ) -> Result<DataFrame, PolarsError> {
182 robin_sparkless_polars::delta::read_delta(path, case_sensitive).map(DataFrame)
183 }
184
185 pub fn read_delta_with_version_root(
187 path: impl AsRef<Path>,
188 version: Option<i64>,
189 case_sensitive: bool,
190 ) -> Result<DataFrame, PolarsError> {
191 robin_sparkless_polars::delta::read_delta_with_version(path, version, case_sensitive)
192 .map(DataFrame)
193 }
194}