@@ -329,4 +329,152 @@ mod tests {
329329 assert_eq ! ( source_symbol. get_dependencies( ) . len( ) , 0 ) ;
330330 assert_eq ! ( created_at_symbol. get_dependencies( ) . len( ) , 0 ) ;
331331 }
332+
333+ #[ test]
334+ fn test_add_measure_evaluator_count_measure ( ) {
335+ let schema = create_visitors_schema ( ) ;
336+ let evaluator = Rc :: new ( MockCubeEvaluator :: new ( schema) ) ;
337+ let sql_utils = Rc :: new ( MockSqlUtils ) ;
338+ let security_context = Rc :: new ( MockSecurityContext ) ;
339+ let timezone = Tz :: UTC ;
340+
341+ let mut compiler = Compiler :: new ( evaluator, sql_utils, security_context, timezone) ;
342+
343+ let symbol = compiler
344+ . add_measure_evaluator ( "visitor_checkins.count" . to_string ( ) )
345+ . unwrap ( ) ;
346+
347+ // Check symbol type
348+ assert ! ( symbol. is_measure( ) ) ;
349+ assert ! ( !symbol. is_dimension( ) ) ;
350+
351+ // Check full name
352+ assert_eq ! ( symbol. full_name( ) , "visitor_checkins.count" ) ;
353+
354+ // Check cube name and member name
355+ assert_eq ! ( symbol. cube_name( ) , "visitor_checkins" ) ;
356+ assert_eq ! ( symbol. name( ) , "count" ) ;
357+
358+ // Check no dependencies for simple measure
359+ let dependencies = symbol. get_dependencies ( ) ;
360+ assert_eq ! (
361+ dependencies. len( ) ,
362+ 0 ,
363+ "Simple measure should have no dependencies"
364+ ) ;
365+
366+ // Check measure type
367+ let measure = symbol. as_measure ( ) . unwrap ( ) ;
368+ assert_eq ! ( measure. measure_type( ) , "count" ) ;
369+ }
370+
371+ #[ test]
372+ fn test_add_measure_evaluator_sum_measure ( ) {
373+ let schema = create_visitors_schema ( ) ;
374+ let evaluator = Rc :: new ( MockCubeEvaluator :: new ( schema) ) ;
375+ let sql_utils = Rc :: new ( MockSqlUtils ) ;
376+ let security_context = Rc :: new ( MockSecurityContext ) ;
377+ let timezone = Tz :: UTC ;
378+
379+ let mut compiler = Compiler :: new ( evaluator, sql_utils, security_context, timezone) ;
380+
381+ let symbol = compiler
382+ . add_measure_evaluator ( "visitors.total_revenue" . to_string ( ) )
383+ . unwrap ( ) ;
384+
385+ // Check symbol type
386+ assert ! ( symbol. is_measure( ) ) ;
387+ assert ! ( !symbol. is_dimension( ) ) ;
388+
389+ // Check full name
390+ assert_eq ! ( symbol. full_name( ) , "visitors.total_revenue" ) ;
391+
392+ // Check cube name and member name
393+ assert_eq ! ( symbol. cube_name( ) , "visitors" ) ;
394+ assert_eq ! ( symbol. name( ) , "total_revenue" ) ;
395+
396+ // Check no dependencies for simple measure
397+ let dependencies = symbol. get_dependencies ( ) ;
398+ assert_eq ! (
399+ dependencies. len( ) ,
400+ 0 ,
401+ "Simple measure should have no dependencies"
402+ ) ;
403+
404+ // Check measure type
405+ let measure = symbol. as_measure ( ) . unwrap ( ) ;
406+ assert_eq ! ( measure. measure_type( ) , "sum" ) ;
407+ }
408+
409+ #[ test]
410+ fn test_add_measure_evaluator_caching ( ) {
411+ let schema = create_visitors_schema ( ) ;
412+ let evaluator = Rc :: new ( MockCubeEvaluator :: new ( schema) ) ;
413+ let sql_utils = Rc :: new ( MockSqlUtils ) ;
414+ let security_context = Rc :: new ( MockSecurityContext ) ;
415+ let timezone = Tz :: UTC ;
416+
417+ let mut compiler = Compiler :: new ( evaluator, sql_utils, security_context, timezone) ;
418+
419+ // Add measure twice
420+ let symbol1 = compiler
421+ . add_measure_evaluator ( "visitors.total_revenue" . to_string ( ) )
422+ . unwrap ( ) ;
423+ let symbol2 = compiler
424+ . add_measure_evaluator ( "visitors.total_revenue" . to_string ( ) )
425+ . unwrap ( ) ;
426+
427+ // Should return the same cached instance
428+ assert_eq ! (
429+ symbol1. full_name( ) ,
430+ symbol2. full_name( ) ,
431+ "Cached symbols should have the same full name"
432+ ) ;
433+ }
434+
435+ #[ test]
436+ fn test_add_measure_evaluator_invalid_path ( ) {
437+ let schema = create_visitors_schema ( ) ;
438+ let evaluator = Rc :: new ( MockCubeEvaluator :: new ( schema) ) ;
439+ let sql_utils = Rc :: new ( MockSqlUtils ) ;
440+ let security_context = Rc :: new ( MockSecurityContext ) ;
441+ let timezone = Tz :: UTC ;
442+
443+ let mut compiler = Compiler :: new ( evaluator, sql_utils, security_context, timezone) ;
444+
445+ // Try to add non-existent measure
446+ let result = compiler. add_measure_evaluator ( "nonexistent.measure" . to_string ( ) ) ;
447+
448+ assert ! ( result. is_err( ) , "Should fail for non-existent measure" ) ;
449+ }
450+
451+ #[ test]
452+ fn test_add_measure_evaluator_multiple_measures ( ) {
453+ let schema = create_visitors_schema ( ) ;
454+ let evaluator = Rc :: new ( MockCubeEvaluator :: new ( schema) ) ;
455+ let sql_utils = Rc :: new ( MockSqlUtils ) ;
456+ let security_context = Rc :: new ( MockSecurityContext ) ;
457+ let timezone = Tz :: UTC ;
458+
459+ let mut compiler = Compiler :: new ( evaluator, sql_utils, security_context, timezone) ;
460+
461+ // Add multiple different measures
462+ let count_symbol = compiler
463+ . add_measure_evaluator ( "visitor_checkins.count" . to_string ( ) )
464+ . unwrap ( ) ;
465+ let revenue_symbol = compiler
466+ . add_measure_evaluator ( "visitors.total_revenue" . to_string ( ) )
467+ . unwrap ( ) ;
468+
469+ // Verify each measure
470+ assert_eq ! ( count_symbol. full_name( ) , "visitor_checkins.count" ) ;
471+ assert_eq ! ( count_symbol. as_measure( ) . unwrap( ) . measure_type( ) , "count" ) ;
472+
473+ assert_eq ! ( revenue_symbol. full_name( ) , "visitors.total_revenue" ) ;
474+ assert_eq ! ( revenue_symbol. as_measure( ) . unwrap( ) . measure_type( ) , "sum" ) ;
475+
476+ // All should have no dependencies
477+ assert_eq ! ( count_symbol. get_dependencies( ) . len( ) , 0 ) ;
478+ assert_eq ! ( revenue_symbol. get_dependencies( ) . len( ) , 0 ) ;
479+ }
332480}
0 commit comments