Skip to content

Commit 2aafc36

Browse files
committed
compiler tests in work
1 parent ce463e3 commit 2aafc36

File tree

1 file changed

+148
-0
lines changed
  • rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator

1 file changed

+148
-0
lines changed

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/compiler.rs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)