@@ -39,6 +39,7 @@ fn summary_stats_(
39
39
ColumnDisplayType :: String => Ok ( summary_stats_string ( column) ?. into ( ) ) ,
40
40
ColumnDisplayType :: Boolean => Ok ( summary_stats_boolean ( column) ?. into ( ) ) ,
41
41
ColumnDisplayType :: Date => Ok ( summary_stats_date ( column) ?. into ( ) ) ,
42
+ ColumnDisplayType :: Datetime => Ok ( summary_stats_datetime ( column) ?. into ( ) ) ,
42
43
_ => Err ( anyhow:: anyhow!( "Unkown type" ) ) ,
43
44
}
44
45
}
@@ -79,21 +80,6 @@ fn summary_stats_boolean(column: SEXP) -> anyhow::Result<SummaryStatsBoolean> {
79
80
}
80
81
81
82
fn summary_stats_date ( column : SEXP ) -> anyhow:: Result < SummaryStatsDate > {
82
- let robj_to_string = |robj : & RObject | -> String {
83
- let string: Option < String > = unwrap ! ( robj. clone( ) . try_into( ) , Err ( e) => {
84
- log:: error!( "Date stats: Error converting RObject to String: {e}" ) ;
85
- None
86
- } ) ;
87
-
88
- match string {
89
- Some ( s) => s,
90
- None => {
91
- log:: warn!( "Date stats: Expected a string, got NA" ) ;
92
- "NA" . to_string ( )
93
- } ,
94
- }
95
- } ;
96
-
97
83
let r_stats: HashMap < String , RObject > =
98
84
call_summary_fn ( "summary_stats_date" , column) ?. try_into ( ) ?;
99
85
@@ -108,6 +94,44 @@ fn summary_stats_date(column: SEXP) -> anyhow::Result<SummaryStatsDate> {
108
94
} ) )
109
95
}
110
96
97
+ fn summary_stats_datetime ( column : SEXP ) -> anyhow:: Result < SummaryStatsDatetime > {
98
+ // use the same implementationas the date
99
+ let r_stats: HashMap < String , RObject > =
100
+ call_summary_fn ( "summary_stats_date" , column) ?. try_into ( ) ?;
101
+
102
+ let num_unique: i32 = r_stats[ "num_unique" ] . clone ( ) . try_into ( ) ?;
103
+ let timezone: Option < String > = RFunction :: from ( "summary_stats_get_timezone" )
104
+ . add ( column)
105
+ . call_in ( ARK_ENVS . positron_ns ) ?
106
+ . try_into ( ) ?;
107
+
108
+ Ok ( SummaryStatsDatetime (
109
+ data_explorer_comm:: SummaryStatsDatetime {
110
+ min_date : robj_to_string ( & r_stats[ "min_date" ] ) ,
111
+ mean_date : robj_to_string ( & r_stats[ "mean_date" ] ) ,
112
+ median_date : robj_to_string ( & r_stats[ "median_date" ] ) ,
113
+ max_date : robj_to_string ( & r_stats[ "max_date" ] ) ,
114
+ num_unique : num_unique as i64 ,
115
+ timezone,
116
+ } ,
117
+ ) )
118
+ }
119
+
120
+ fn robj_to_string ( robj : & RObject ) -> String {
121
+ let string: Option < String > = unwrap ! ( robj. clone( ) . try_into( ) , Err ( e) => {
122
+ log:: error!( "Date stats: Error converting RObject to String: {e}" ) ;
123
+ None
124
+ } ) ;
125
+
126
+ match string {
127
+ Some ( s) => s,
128
+ None => {
129
+ log:: warn!( "Date stats: Expected a string, got NA" ) ;
130
+ "NA" . to_string ( )
131
+ } ,
132
+ }
133
+ }
134
+
111
135
fn call_summary_fn ( function : & str , column : SEXP ) -> anyhow:: Result < RObject > {
112
136
Ok ( RFunction :: from ( function)
113
137
. add ( column)
@@ -153,6 +177,12 @@ impl_summary_stats_conversion!(
153
177
data_explorer_comm:: SummaryStatsDate ,
154
178
ColumnDisplayType :: Date
155
179
) ;
180
+ impl_summary_stats_conversion ! (
181
+ datetime_stats,
182
+ SummaryStatsDatetime ,
183
+ data_explorer_comm:: SummaryStatsDatetime ,
184
+ ColumnDisplayType :: Datetime
185
+ ) ;
156
186
157
187
fn empty_column_summary_stats ( ) -> data_explorer_comm:: ColumnSummaryStats {
158
188
data_explorer_comm:: ColumnSummaryStats {
@@ -243,4 +273,27 @@ mod tests {
243
273
assert_eq ! ( stats, expected) ;
244
274
} )
245
275
}
276
+
277
+ #[ test]
278
+ fn test_datetime_summary ( ) {
279
+ r_test ( || {
280
+ let column = r_parse_eval0 (
281
+ "as.POSIXct(c('2015-07-24 23:15:07', '2015-07-24 23:15:07', NA), tz = 'Japan')" ,
282
+ R_ENVS . global ,
283
+ )
284
+ . unwrap ( ) ;
285
+ let stats = summary_stats_ ( column. sexp , ColumnDisplayType :: Datetime ) . unwrap ( ) ;
286
+ let expected: ColumnSummaryStats =
287
+ SummaryStatsDatetime ( data_explorer_comm:: SummaryStatsDatetime {
288
+ num_unique : 2 ,
289
+ min_date : "2015-07-24 23:15:07" . to_string ( ) ,
290
+ mean_date : "2015-07-24 23:15:07" . to_string ( ) ,
291
+ median_date : "2015-07-24 23:15:07" . to_string ( ) ,
292
+ max_date : "2015-07-24 23:15:07" . to_string ( ) ,
293
+ timezone : Some ( "Japan" . to_string ( ) ) ,
294
+ } )
295
+ . into ( ) ;
296
+ assert_eq ! ( stats, expected) ;
297
+ } )
298
+ }
246
299
}
0 commit comments