You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Include weight column if provided, otherwise default to 1.0
366
370
let weight_col = ifletSome(w) = weight {
367
-
format!(", {} AS weight", w)
371
+
format!(", \"{}\" AS weight", w)
368
372
}else{
369
373
", 1.0 AS weight".to_string()
370
374
};
371
375
376
+
let quoted_value = format!("\"{}\"", value);
372
377
// Only filter out nulls in value column, keep NULLs in group columns
373
-
let filter_valid = format!("{} IS NOT NULL",value);
378
+
let filter_valid = format!("{} IS NOT NULL",quoted_value);
374
379
380
+
let quoted_groups:Vec<String> = group_by.iter().map(|g| format!("\"{}\"", g)).collect();
375
381
format!(
376
382
"data AS (
377
383
SELECT {groups}{value} AS val{weight_col}
378
384
FROM ({from})
379
385
WHERE {filter_valid}
380
386
)",
381
-
groups = with_trailing_comma(&group_by.join(", ")),
382
-
value = value,
387
+
groups = with_trailing_comma("ed_groups.join(", ")),
388
+
value = quoted_value,
383
389
weight_col = weight_col,
384
390
from = from,
385
391
filter_valid = filter_valid
@@ -419,7 +425,8 @@ fn build_grid_cte(
419
425
);
420
426
}
421
427
422
-
let groups = groups.join(", ");
428
+
let quoted_groups:Vec<String> = groups.iter().map(|g| format!("\"{}\"", g)).collect();
429
+
let groups = quoted_groups.join(", ");
423
430
format!(
424
431
"{seq}, grid AS (
425
432
SELECT
@@ -451,7 +458,7 @@ fn compute_density(
451
458
}else{
452
459
group_by
453
460
.iter()
454
-
.map(|g| format!("data.{col} IS NOT DISTINCT FROM bandwidth.{col}", col = g))
461
+
.map(|g| format!("data.\"{}\" IS NOT DISTINCT FROM bandwidth.\"{}\"", g, g))
455
462
.collect::<Vec<String>>()
456
463
.join(" AND ")
457
464
};
@@ -462,7 +469,7 @@ fn compute_density(
462
469
}else{
463
470
let grid_data_conds:Vec<String> = group_by
464
471
.iter()
465
-
.map(|g| format!("grid.{col} IS NOT DISTINCT FROM data.{col}", col = g))
472
+
.map(|g| format!("grid.\"{}\" IS NOT DISTINCT FROM data.\"{}\"", g, g))
466
473
.collect();
467
474
format!("WHERE {}", grid_data_conds.join(" AND "))
468
475
};
@@ -476,7 +483,7 @@ fn compute_density(
476
483
);
477
484
478
485
// Build group-related SQL fragments
479
-
let grid_groups:Vec<String> = group_by.iter().map(|g| format!("grid.{}", g)).collect();
486
+
let grid_groups:Vec<String> = group_by.iter().map(|g| format!("grid.\"{}\"", g)).collect();
480
487
let aggregation = format!(
481
488
"GROUP BY grid.x{grid_group_by}
482
489
ORDER BY grid.x{grid_group_by}",
@@ -486,7 +493,8 @@ fn compute_density(
486
493
let groups = if group_by.is_empty(){
487
494
String::new()
488
495
}else{
489
-
format!("{},", group_by.join(", "))
496
+
let quoted:Vec<String> = group_by.iter().map(|g| format!("\"{}\"", g)).collect();
497
+
format!("{},", quoted.join(", "))
490
498
};
491
499
492
500
// Generate the density computation query
@@ -546,9 +554,9 @@ mod tests {
546
554
547
555
let expected = r#"WITH RECURSIVE bandwidth AS (SELECT 0.5 AS bw),
548
556
data AS (
549
-
SELECT x AS val, 1.0 AS weight
557
+
SELECT "x" AS val, 1.0 AS weight
550
558
FROM (SELECT x FROM (VALUES (1.0), (2.0), (3.0)) AS t(x))
551
-
WHERE x IS NOT NULL
559
+
WHERE "x" IS NOT NULL
552
560
),
553
561
"__ggsql_base__"(n) AS (SELECT 0 UNION ALL SELECT n + 1 FROM "__ggsql_base__" WHERE n < 7),"__ggsql_seq__"(n) AS (SELECT CAST(a.n * 64 + b.n * 8 + c.n AS REAL) AS n FROM "__ggsql_base__" a, "__ggsql_base__" b, "__ggsql_base__" c WHERE a.n * 64 + b.n * 8 + c.n < 512),
554
562
grid AS (
@@ -607,37 +615,37 @@ mod tests {
607
615
let kernel = choose_kde_kernel(¶meters).expect("kernel should be valid");
608
616
let sql = compute_density("x",&groups, kernel,&bw_cte,&data_cte,&grid_cte);
609
617
610
-
let expected = r#"WITH RECURSIVE bandwidth AS (SELECT 0.5 AS bw, region, category FROM (SELECT x, region, category FROM (VALUES (1.0, 'A', 'X'), (2.0, 'B', 'Y')) AS t(x, region, category)) GROUP BY region, category),
618
+
let expected = r#"WITH RECURSIVE bandwidth AS (SELECT 0.5 AS bw, "region", "category" FROM (SELECT x, region, category FROM (VALUES (1.0, 'A', 'X'), (2.0, 'B', 'Y')) AS t(x, region, category)) GROUP BY "region", "category"),
611
619
data AS (
612
-
SELECT region, category, x AS val, 1.0 AS weight
620
+
SELECT "region", "category", "x" AS val, 1.0 AS weight
613
621
FROM (SELECT x, region, category FROM (VALUES (1.0, 'A', 'X'), (2.0, 'B', 'Y')) AS t(x, region, category))
614
-
WHERE x IS NOT NULL
622
+
WHERE "x" IS NOT NULL
615
623
),
616
624
"__ggsql_base__"(n) AS (SELECT 0 UNION ALL SELECT n + 1 FROM "__ggsql_base__" WHERE n < 7),"__ggsql_seq__"(n) AS (SELECT CAST(a.n * 64 + b.n * 8 + c.n AS REAL) AS n FROM "__ggsql_base__" a, "__ggsql_base__" b, "__ggsql_base__" c WHERE a.n * 64 + b.n * 8 + c.n < 512),
617
625
grid AS (
618
626
SELECT
619
-
region, category,
627
+
"region", "category",
620
628
-11 + ("__ggsql_seq__".n * 22 / 511) AS x
621
629
FROM "__ggsql_seq__"
622
-
CROSS JOIN (SELECT DISTINCT region, category FROM (SELECT x, region, category FROM (VALUES (1.0, 'A', 'X'), (2.0, 'B', 'Y')) AS t(x, region, category))) AS groups
630
+
CROSS JOIN (SELECT DISTINCT "region", "category" FROM (SELECT x, region, category FROM (VALUES (1.0, 'A', 'X'), (2.0, 'B', 'Y')) AS t(x, region, category))) AS groups
623
631
)
624
632
SELECT
625
633
"__ggsql_stat_x",
626
-
region, category,
634
+
"region", "category",
627
635
"__ggsql_stat_intensity",
628
636
"__ggsql_stat_intensity" / "__norm" AS "__ggsql_stat_density"
0 commit comments