@@ -9,7 +9,7 @@ use crate::{
99 geom:: types:: get_column_name, DefaultAestheticValue , DefaultParam , DefaultParamValue ,
1010 ParameterValue , StatResult ,
1111 } ,
12- utils :: { sql_greatest , sql_least , sql_percentile } ,
12+ reader :: SqlDialect ,
1313 DataFrame , GgsqlError , Mappings , Result ,
1414} ;
1515
@@ -86,8 +86,9 @@ impl GeomTrait for Boxplot {
8686 group_by : & [ String ] ,
8787 parameters : & HashMap < String , ParameterValue > ,
8888 _execute_query : & dyn Fn ( & str ) -> Result < DataFrame > ,
89+ dialect : & dyn SqlDialect ,
8990 ) -> Result < StatResult > {
90- stat_boxplot ( query, aesthetics, group_by, parameters)
91+ stat_boxplot ( query, aesthetics, group_by, parameters, dialect )
9192 }
9293}
9394
@@ -102,6 +103,7 @@ fn stat_boxplot(
102103 aesthetics : & Mappings ,
103104 group_by : & [ String ] ,
104105 parameters : & HashMap < String , ParameterValue > ,
106+ dialect : & dyn SqlDialect ,
105107) -> Result < StatResult > {
106108 let y = get_column_name ( aesthetics, "pos2" ) . ok_or_else ( || {
107109 GgsqlError :: ValidationError ( "Boxplot requires 'y' aesthetic mapping" . to_string ( ) )
@@ -147,7 +149,7 @@ fn stat_boxplot(
147149 }
148150
149151 // Query for boxplot summary statistics
150- let summary = boxplot_sql_compute_summary ( query, & groups, & value_col, coef) ;
152+ let summary = boxplot_sql_compute_summary ( query, & groups, & value_col, coef, dialect ) ;
151153 let stats_query = boxplot_sql_append_outliers ( & summary, & groups, & value_col, query, outliers) ;
152154
153155 Ok ( StatResult :: Transformed {
@@ -162,13 +164,13 @@ fn stat_boxplot(
162164 } )
163165}
164166
165- fn boxplot_sql_compute_summary ( from : & str , groups : & [ String ] , value : & str , coef : & f64 ) -> String {
167+ fn boxplot_sql_compute_summary ( from : & str , groups : & [ String ] , value : & str , coef : & f64 , dialect : & dyn SqlDialect ) -> String {
166168 let groups_str = groups. join ( ", " ) ;
167- let lower_expr = sql_greatest ( & [ & format ! ( "q1 - {coef} * (q3 - q1)" ) , "min" ] ) ;
168- let upper_expr = sql_least ( & [ & format ! ( "q3 + {coef} * (q3 - q1)" ) , "max" ] ) ;
169- let q1 = sql_percentile ( value, 0.25 , from, groups) ;
170- let median = sql_percentile ( value, 0.50 , from, groups) ;
171- let q3 = sql_percentile ( value, 0.75 , from, groups) ;
169+ let lower_expr = dialect . sql_greatest ( & [ & format ! ( "q1 - {coef} * (q3 - q1)" ) , "min" ] ) ;
170+ let upper_expr = dialect . sql_least ( & [ & format ! ( "q3 + {coef} * (q3 - q1)" ) , "max" ] ) ;
171+ let q1 = dialect . sql_percentile ( value, 0.25 , from, groups) ;
172+ let median = dialect . sql_percentile ( value, 0.50 , from, groups) ;
173+ let q3 = dialect . sql_percentile ( value, 0.75 , from, groups) ;
172174 format ! (
173175 "SELECT
174176 *,
@@ -293,6 +295,7 @@ fn boxplot_sql_append_outliers(
293295mod tests {
294296 use super :: * ;
295297 use crate :: plot:: AestheticValue ;
298+ use crate :: reader:: AnsiDialect ;
296299
297300 // ==================== Helper Functions ====================
298301
@@ -314,7 +317,7 @@ mod tests {
314317 #[ test]
315318 fn test_sql_compute_summary_basic ( ) {
316319 let groups = vec ! [ "category" . to_string( ) ] ;
317- let result = boxplot_sql_compute_summary ( "data" , & groups, "value" , & 1.5 ) ;
320+ let result = boxplot_sql_compute_summary ( "data" , & groups, "value" , & 1.5 , & AnsiDialect ) ;
318321 assert ! ( result. contains( "NTILE(4) OVER (ORDER BY value)" ) ) ;
319322 assert ! ( result. contains( "AS q1" ) ) ;
320323 assert ! ( result. contains( "AS median" ) ) ;
@@ -330,15 +333,15 @@ mod tests {
330333 #[ test]
331334 fn test_sql_compute_summary_multiple_groups ( ) {
332335 let groups = vec ! [ "cat" . to_string( ) , "region" . to_string( ) ] ;
333- let result = boxplot_sql_compute_summary ( "tbl" , & groups, "val" , & 1.5 ) ;
336+ let result = boxplot_sql_compute_summary ( "tbl" , & groups, "val" , & 1.5 , & AnsiDialect ) ;
334337 assert ! ( result. contains( "GROUP BY cat, region" ) ) ;
335338 assert ! ( result. contains( "NTILE(4) OVER (ORDER BY val)" ) ) ;
336339 }
337340
338341 #[ test]
339342 fn test_sql_compute_summary_custom_coef ( ) {
340343 let groups = vec ! [ "pos1" . to_string( ) ] ;
341- let result = boxplot_sql_compute_summary ( "q" , & groups, "pos2" , & 2.5 ) ;
344+ let result = boxplot_sql_compute_summary ( "q" , & groups, "pos2" , & 2.5 , & AnsiDialect ) ;
342345 assert ! ( result. contains( "2.5" ) ) ;
343346 assert ! (
344347 result. contains( "(CASE WHEN (q1 - 2.5 * (q3 - q1)) >= (min) THEN (q1 - 2.5 * (q3 - q1)) ELSE (min) END)" )
@@ -364,11 +367,11 @@ mod tests {
364367 #[ test]
365368 fn test_boxplot_sql_compute_summary_single_group ( ) {
366369 let groups = vec ! [ "category" . to_string( ) ] ;
367- let result = boxplot_sql_compute_summary ( "SELECT * FROM sales" , & groups, "price" , & 1.5 ) ;
370+ let result = boxplot_sql_compute_summary ( "SELECT * FROM sales" , & groups, "price" , & 1.5 , & AnsiDialect ) ;
368371
369- let q1 = sql_percentile ( "price" , 0.25 , "SELECT * FROM sales" , & groups) ;
370- let median = sql_percentile ( "price" , 0.50 , "SELECT * FROM sales" , & groups) ;
371- let q3 = sql_percentile ( "price" , 0.75 , "SELECT * FROM sales" , & groups) ;
372+ let q1 = AnsiDialect . sql_percentile ( "price" , 0.25 , "SELECT * FROM sales" , & groups) ;
373+ let median = AnsiDialect . sql_percentile ( "price" , 0.50 , "SELECT * FROM sales" , & groups) ;
374+ let q3 = AnsiDialect . sql_percentile ( "price" , 0.75 , "SELECT * FROM sales" , & groups) ;
372375 let expected = format ! (
373376 r#"SELECT
374377 *,
@@ -394,11 +397,11 @@ mod tests {
394397 #[ test]
395398 fn test_boxplot_sql_compute_summary_multiple_groups ( ) {
396399 let groups = vec ! [ "region" . to_string( ) , "product" . to_string( ) ] ;
397- let result = boxplot_sql_compute_summary ( "SELECT * FROM data" , & groups, "revenue" , & 1.5 ) ;
400+ let result = boxplot_sql_compute_summary ( "SELECT * FROM data" , & groups, "revenue" , & 1.5 , & AnsiDialect ) ;
398401
399- let q1 = sql_percentile ( "revenue" , 0.25 , "SELECT * FROM data" , & groups) ;
400- let median = sql_percentile ( "revenue" , 0.50 , "SELECT * FROM data" , & groups) ;
401- let q3 = sql_percentile ( "revenue" , 0.75 , "SELECT * FROM data" , & groups) ;
402+ let q1 = AnsiDialect . sql_percentile ( "revenue" , 0.25 , "SELECT * FROM data" , & groups) ;
403+ let median = AnsiDialect . sql_percentile ( "revenue" , 0.50 , "SELECT * FROM data" , & groups) ;
404+ let q3 = AnsiDialect . sql_percentile ( "revenue" , 0.75 , "SELECT * FROM data" , & groups) ;
402405 let expected = format ! (
403406 r#"SELECT
404407 *,
@@ -507,7 +510,7 @@ mod tests {
507510 ) ;
508511 parameters. insert ( "outliers" . to_string ( ) , ParameterValue :: Boolean ( true ) ) ;
509512
510- let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters) ;
513+ let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters, & AnsiDialect ) ;
511514
512515 assert ! ( result. is_err( ) ) ;
513516 assert ! ( result. unwrap_err( ) . to_string( ) . contains( "coef" ) ) ;
@@ -522,7 +525,7 @@ mod tests {
522525 parameters. insert ( "outliers" . to_string ( ) , ParameterValue :: Boolean ( true ) ) ;
523526 // Missing coef
524527
525- let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters) ;
528+ let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters, & AnsiDialect ) ;
526529
527530 assert ! ( result. is_err( ) ) ;
528531 assert ! ( result. unwrap_err( ) . to_string( ) . contains( "coef" ) ) ;
@@ -540,7 +543,7 @@ mod tests {
540543 ParameterValue :: String ( "yes" . to_string ( ) ) ,
541544 ) ;
542545
543- let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters) ;
546+ let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters, & AnsiDialect ) ;
544547
545548 assert ! ( result. is_err( ) ) ;
546549 assert ! ( result. unwrap_err( ) . to_string( ) . contains( "outliers" ) ) ;
@@ -555,7 +558,7 @@ mod tests {
555558 parameters. insert ( "coef" . to_string ( ) , ParameterValue :: Number ( 1.5 ) ) ;
556559 // Missing outliers
557560
558- let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters) ;
561+ let result = stat_boxplot ( "SELECT * FROM data" , & aesthetics, & groups, & parameters, & AnsiDialect ) ;
559562
560563 assert ! ( result. is_err( ) ) ;
561564 assert ! ( result. unwrap_err( ) . to_string( ) . contains( "outliers" ) ) ;
0 commit comments