Skip to content

Commit 1f2795c

Browse files
committed
Minor tweaks to naming and features
1 parent de092b9 commit 1f2795c

6 files changed

Lines changed: 40 additions & 40 deletions

File tree

src/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,16 @@ proptest.workspace = true
7676
ureq = "3"
7777

7878
[features]
79-
default = ["duckdb", "sqlite", "vegalite", "ipc", "builtin-data"]
79+
default = ["duckdb", "sqlite", "vegalite", "ipc", "parquet", "builtin-data"]
8080
ipc = ["polars/ipc"]
8181
duckdb = ["dep:duckdb", "dep:arrow"]
8282
polars-sql = ["polars/sql"]
83-
builtin-data = ["polars/parquet"]
83+
parquet = ["polars/parquet"]
8484
postgres = ["dep:postgres"]
8585
sqlite = ["dep:rusqlite"]
8686
vegalite = []
8787
ggplot2 = []
88+
builtin-data = []
8889
python = ["dep:pyo3"]
8990
rest-api = ["dep:axum", "dep:tokio", "dep:tower-http", "dep:tracing", "dep:tracing-subscriber", "duckdb", "vegalite"]
9091
all-readers = ["duckdb", "postgres", "sqlite", "polars-sql"]

src/naming.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,6 @@ pub const SOURCE_COLUMN: &str = concatcp!(GGSQL_PREFIX, "source", GGSQL_SUFFIX);
8888
/// Alias for schema extraction queries
8989
pub const SCHEMA_ALIAS: &str = concatcp!(GGSQL_SUFFIX, "schema", GGSQL_SUFFIX);
9090

91-
// ============================================================================
92-
// Internal SQL Aliases
93-
// ============================================================================
94-
95-
/// CTE name for recursive base counter in generate_series: `__ggsql_base__`
96-
pub const SERIES_BASE: &str = concatcp!(GGSQL_PREFIX, "base", GGSQL_SUFFIX);
97-
98-
/// CTE name for sequence output from generate_series: `__ggsql_seq__`
99-
pub const SERIES_SEQ: &str = concatcp!(GGSQL_PREFIX, "seq", GGSQL_SUFFIX);
100-
10191
// ============================================================================
10292
// Constructor Functions
10393
// ============================================================================

src/plot/layer/geom/boxplot.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ fn boxplot_sql_compute_summary(from: &str, groups: &[String], value: &str, coef:
182182
{q1} AS q1,
183183
{median} AS median,
184184
{q3} AS q3
185-
FROM ({from}) AS _qt
185+
FROM ({from}) AS __ggsql_qt__
186186
WHERE {value} IS NOT NULL
187187
GROUP BY {groups}
188-
) AS _fn",
188+
) AS __ggsql_fn__",
189189
lower_expr = lower_expr,
190190
upper_expr = upper_expr,
191191
groups = groups_str,
@@ -382,10 +382,10 @@ mod tests {
382382
{q1} AS q1,
383383
{median} AS median,
384384
{q3} AS q3
385-
FROM (SELECT * FROM sales) AS _qt
385+
FROM (SELECT * FROM sales) AS __ggsql_qt__
386386
WHERE price IS NOT NULL
387387
GROUP BY category
388-
) AS _fn"#
388+
) AS __ggsql_fn__"#
389389
);
390390

391391
assert_eq!(result, expected);
@@ -412,10 +412,10 @@ mod tests {
412412
{q1} AS q1,
413413
{median} AS median,
414414
{q3} AS q3
415-
FROM (SELECT * FROM data) AS _qt
415+
FROM (SELECT * FROM data) AS __ggsql_qt__
416416
WHERE revenue IS NOT NULL
417417
GROUP BY region, product
418-
) AS _fn"#
418+
) AS __ggsql_fn__"#
419419
);
420420

421421
assert_eq!(result, expected);

src/plot/layer/geom/density.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ fn density_sql_bandwidth(
268268
SELECT
269269
{rule} AS bw{comma}
270270
{groups_str}
271-
FROM ({from}) AS _qt
271+
FROM ({from}) AS __ggsql_qt__
272272
WHERE {value} IS NOT NULL
273273
{group_by}
274274
)",
@@ -391,11 +391,10 @@ fn build_grid_cte(groups: &[String], from: &str, min: f64, max: f64, n_points: u
391391
if !has_groups {
392392
return format!(
393393
"{seq}, grid AS (
394-
SELECT {min} + ({seq_name}.n * {diff} / {n_points}) AS x
395-
FROM {seq_name}
394+
SELECT {min} + (__ggsql_seq__.n * {diff} / {n_points}) AS x
395+
FROM __ggsql_seq__
396396
)",
397397
seq = seq,
398-
seq_name = crate::naming::SERIES_SEQ,
399398
min = min,
400399
diff = diff,
401400
n_points = n_points
@@ -407,12 +406,11 @@ fn build_grid_cte(groups: &[String], from: &str, min: f64, max: f64, n_points: u
407406
"{seq}, grid AS (
408407
SELECT
409408
{groups},
410-
{min} + ({seq_name}.n * {diff} / {n_points}) AS x
411-
FROM {seq_name}
409+
{min} + (__ggsql_seq__.n * {diff} / {n_points}) AS x
410+
FROM __ggsql_seq__
412411
CROSS JOIN (SELECT DISTINCT {groups} FROM ({from})) AS groups
413412
)",
414413
seq = seq,
415-
seq_name = crate::naming::SERIES_SEQ,
416414
groups = groups,
417415
diff = diff,
418416
min = min,

src/plot/scale/scale_type/continuous.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ impl ScaleTypeTrait for Continuous {
154154
///
155155
/// Supports OOB modes:
156156
/// - "censor": CASE WHEN col >= min AND col <= max THEN col ELSE NULL END
157-
/// - "squish": MAX(min, MIN(col, max))
157+
/// - "squish": GREATEST(min, LEAST(col, max))
158158
/// - "keep": No transformation (returns None)
159159
///
160160
/// Only applies when input_range is explicitly specified via FROM clause.

src/utils.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,16 @@ pub fn sql_least(exprs: &[&str]) -> String {
2525
/// deep recursion: only recurses ~cbrt(n) times, then cross-joins three
2626
/// copies to cover the full range.
2727
pub fn sql_generate_series(n: usize) -> String {
28-
use crate::naming::{SERIES_BASE, SERIES_SEQ};
2928
let base_size = (n as f64).cbrt().ceil() as usize;
3029
let base_sq = base_size * base_size;
3130
let base_max = base_size - 1;
3231
format!(
33-
"{SERIES_BASE}(n) AS (\
34-
SELECT 0 UNION ALL SELECT n + 1 FROM {SERIES_BASE} WHERE n < {base_max}\
32+
"__ggsql_base__(n) AS (\
33+
SELECT 0 UNION ALL SELECT n + 1 FROM __ggsql_base__ WHERE n < {base_max}\
3534
),\
36-
{SERIES_SEQ}(n) AS (\
35+
__ggsql_seq__(n) AS (\
3736
SELECT CAST(a.n * {base_sq} + b.n * {base_size} + c.n AS REAL) AS n \
38-
FROM {SERIES_BASE} a, {SERIES_BASE} b, {SERIES_BASE} c \
37+
FROM __ggsql_base__ a, __ggsql_base__ b, __ggsql_base__ c \
3938
WHERE a.n * {base_sq} + b.n * {base_size} + c.n < {n}\
4039
)"
4140
)
@@ -49,7 +48,7 @@ pub fn sql_generate_series(n: usize) -> String {
4948
pub fn sql_percentile(column: &str, fraction: f64, from: &str, groups: &[String]) -> String {
5049
let group_filter = groups
5150
.iter()
52-
.map(|g| format!("AND _pct.{g} IS NOT DISTINCT FROM _qt.{g}"))
51+
.map(|g| format!("AND __ggsql_pct__.{g} IS NOT DISTINCT FROM __ggsql_qt__.{g}"))
5352
.collect::<Vec<_>>()
5453
.join(" ");
5554

@@ -65,7 +64,7 @@ pub fn sql_percentile(column: &str, fraction: f64, from: &str, groups: &[String]
6564
FROM (\
6665
SELECT {column} AS __val, \
6766
NTILE(4) OVER (ORDER BY {column}) AS __tile \
68-
FROM ({from}) AS _pct \
67+
FROM ({from}) AS __ggsql_pct__ \
6968
WHERE {column} IS NOT NULL {group_filter}\
7069
))"
7170
)
@@ -113,16 +112,28 @@ mod tests {
113112
fn test_generate_series_small() {
114113
let sql = sql_generate_series(8);
115114
// base_size = ceil(8^(1/3)) = 2, base_sq = 4, base_max = 1
116-
assert!(sql.contains("WHERE n < 1"), "base CTE should recurse up to base_max=1");
117-
assert!(sql.contains("a.n * 4 + b.n * 2 + c.n"), "cross-join arithmetic");
118-
assert!(sql.contains("a.n * 4 + b.n * 2 + c.n < 8"), "seq CTE filters to n");
115+
assert!(
116+
sql.contains("WHERE n < 1"),
117+
"base CTE should recurse up to base_max=1"
118+
);
119+
assert!(
120+
sql.contains("a.n * 4 + b.n * 2 + c.n"),
121+
"cross-join arithmetic"
122+
);
123+
assert!(
124+
sql.contains("a.n * 4 + b.n * 2 + c.n < 8"),
125+
"seq CTE filters to n"
126+
);
119127
}
120128

121129
#[test]
122130
fn test_generate_series_exact_cube() {
123131
let sql = sql_generate_series(27);
124132
// base_size = ceil(27^(1/3)) = 3, base_sq = 9, base_max = 2
125-
assert!(sql.contains("WHERE n < 2"), "base CTE should recurse up to base_max=2");
133+
assert!(
134+
sql.contains("WHERE n < 2"),
135+
"base CTE should recurse up to base_max=2"
136+
);
126137
assert!(sql.contains("a.n * 9 + b.n * 3 + c.n < 27"));
127138
}
128139

@@ -158,16 +169,16 @@ mod tests {
158169
assert!(sql.contains("__tile = 3"));
159170
assert!(sql.contains("NTILE(4)"));
160171
assert!(sql.contains("val AS __val"));
161-
assert!(sql.contains("FROM (SELECT * FROM t) AS _pct"));
172+
assert!(sql.contains("FROM (SELECT * FROM t) AS __ggsql_pct__"));
162173
assert!(!sql.contains("IS NOT DISTINCT FROM"));
163174
}
164175

165176
#[test]
166177
fn test_percentile_with_groups() {
167178
let groups = vec!["region".to_string(), "year".to_string()];
168179
let sql = sql_percentile("price", 0.25, "SELECT * FROM sales", &groups);
169-
assert!(sql.contains("_pct.region IS NOT DISTINCT FROM _qt.region"));
170-
assert!(sql.contains("_pct.year IS NOT DISTINCT FROM _qt.year"));
180+
assert!(sql.contains("__ggsql_pct__.region IS NOT DISTINCT FROM __ggsql_qt__.region"));
181+
assert!(sql.contains("__ggsql_pct__.year IS NOT DISTINCT FROM __ggsql_qt__.year"));
171182
}
172183

173184
#[test]

0 commit comments

Comments
 (0)