Skip to content

Commit ce463e3

Browse files
committed
compiler tests in work
1 parent 70728cb commit ce463e3

File tree

6 files changed

+169
-250
lines changed

6 files changed

+169
-250
lines changed

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

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,172 @@ impl Compiler {
161161
Ok(node)
162162
}
163163
}
164+
165+
#[cfg(test)]
166+
mod tests {
167+
use super::*;
168+
use crate::test_fixtures::cube_bridge::{MockCubeEvaluator, MockSecurityContext, MockSqlUtils};
169+
use crate::test_fixtures::schemas::create_visitors_schema;
170+
use chrono_tz::Tz;
171+
172+
#[test]
173+
fn test_add_dimension_evaluator_number_dimension() {
174+
let schema = create_visitors_schema();
175+
let evaluator = Rc::new(MockCubeEvaluator::new(schema));
176+
let sql_utils = Rc::new(MockSqlUtils);
177+
let security_context = Rc::new(MockSecurityContext);
178+
let timezone = Tz::UTC;
179+
180+
let mut compiler = Compiler::new(evaluator, sql_utils, security_context, timezone);
181+
182+
let symbol = compiler
183+
.add_dimension_evaluator("visitors.id".to_string())
184+
.unwrap();
185+
186+
// Check symbol type
187+
assert!(symbol.is_dimension());
188+
assert!(!symbol.is_measure());
189+
190+
// Check full name
191+
assert_eq!(symbol.full_name(), "visitors.id");
192+
193+
// Check cube name and member name
194+
assert_eq!(symbol.cube_name(), "visitors");
195+
assert_eq!(symbol.name(), "id");
196+
197+
// Check no dependencies for simple dimension
198+
let dependencies = symbol.get_dependencies();
199+
assert_eq!(
200+
dependencies.len(),
201+
0,
202+
"Simple dimension should have no dependencies"
203+
);
204+
205+
// Check dimension type
206+
let dimension = symbol.as_dimension().unwrap();
207+
assert_eq!(dimension.dimension_type(), "number");
208+
}
209+
210+
#[test]
211+
fn test_add_dimension_evaluator_string_dimension() {
212+
let schema = create_visitors_schema();
213+
let evaluator = Rc::new(MockCubeEvaluator::new(schema));
214+
let sql_utils = Rc::new(MockSqlUtils);
215+
let security_context = Rc::new(MockSecurityContext);
216+
let timezone = Tz::UTC;
217+
218+
let mut compiler = Compiler::new(evaluator, sql_utils, security_context, timezone);
219+
220+
let symbol = compiler
221+
.add_dimension_evaluator("visitors.source".to_string())
222+
.unwrap();
223+
224+
// Check symbol type
225+
assert!(symbol.is_dimension());
226+
assert!(!symbol.is_measure());
227+
228+
// Check full name
229+
assert_eq!(symbol.full_name(), "visitors.source");
230+
231+
// Check cube name and member name
232+
assert_eq!(symbol.cube_name(), "visitors");
233+
assert_eq!(symbol.name(), "source");
234+
235+
// Check no dependencies for simple dimension
236+
let dependencies = symbol.get_dependencies();
237+
assert_eq!(
238+
dependencies.len(),
239+
0,
240+
"Simple dimension should have no dependencies"
241+
);
242+
243+
// Check dimension type
244+
let dimension = symbol.as_dimension().unwrap();
245+
assert_eq!(dimension.dimension_type(), "string");
246+
}
247+
248+
#[test]
249+
fn test_add_dimension_evaluator_caching() {
250+
let schema = create_visitors_schema();
251+
let evaluator = Rc::new(MockCubeEvaluator::new(schema));
252+
let sql_utils = Rc::new(MockSqlUtils);
253+
let security_context = Rc::new(MockSecurityContext);
254+
let timezone = Tz::UTC;
255+
256+
let mut compiler = Compiler::new(evaluator, sql_utils, security_context, timezone);
257+
258+
// Add dimension twice
259+
let symbol1 = compiler
260+
.add_dimension_evaluator("visitors.id".to_string())
261+
.unwrap();
262+
let symbol2 = compiler
263+
.add_dimension_evaluator("visitors.id".to_string())
264+
.unwrap();
265+
266+
// Should return the same cached instance
267+
assert_eq!(
268+
symbol1.full_name(),
269+
symbol2.full_name(),
270+
"Cached symbols should have the same full name"
271+
);
272+
}
273+
274+
#[test]
275+
fn test_add_dimension_evaluator_invalid_path() {
276+
let schema = create_visitors_schema();
277+
let evaluator = Rc::new(MockCubeEvaluator::new(schema));
278+
let sql_utils = Rc::new(MockSqlUtils);
279+
let security_context = Rc::new(MockSecurityContext);
280+
let timezone = Tz::UTC;
281+
282+
let mut compiler = Compiler::new(evaluator, sql_utils, security_context, timezone);
283+
284+
// Try to add non-existent dimension
285+
let result = compiler.add_dimension_evaluator("nonexistent.dimension".to_string());
286+
287+
assert!(result.is_err(), "Should fail for non-existent dimension");
288+
}
289+
290+
#[test]
291+
fn test_add_dimension_evaluator_multiple_dimensions() {
292+
let schema = create_visitors_schema();
293+
let evaluator = Rc::new(MockCubeEvaluator::new(schema));
294+
let sql_utils = Rc::new(MockSqlUtils);
295+
let security_context = Rc::new(MockSecurityContext);
296+
let timezone = Tz::UTC;
297+
298+
let mut compiler = Compiler::new(evaluator, sql_utils, security_context, timezone);
299+
300+
// Add multiple different dimensions
301+
let id_symbol = compiler
302+
.add_dimension_evaluator("visitors.id".to_string())
303+
.unwrap();
304+
let source_symbol = compiler
305+
.add_dimension_evaluator("visitors.source".to_string())
306+
.unwrap();
307+
let created_at_symbol = compiler
308+
.add_dimension_evaluator("visitors.created_at".to_string())
309+
.unwrap();
310+
311+
// Verify each dimension
312+
assert_eq!(id_symbol.full_name(), "visitors.id");
313+
assert_eq!(id_symbol.as_dimension().unwrap().dimension_type(), "number");
314+
315+
assert_eq!(source_symbol.full_name(), "visitors.source");
316+
assert_eq!(
317+
source_symbol.as_dimension().unwrap().dimension_type(),
318+
"string"
319+
);
320+
321+
assert_eq!(created_at_symbol.full_name(), "visitors.created_at");
322+
assert_eq!(
323+
created_at_symbol.as_dimension().unwrap().dimension_type(),
324+
"time"
325+
);
326+
327+
// All should have no dependencies
328+
assert_eq!(id_symbol.get_dependencies().len(), 0);
329+
assert_eq!(source_symbol.get_dependencies().len(), 0);
330+
assert_eq!(created_at_symbol.get_dependencies().len(), 0);
331+
}
332+
}

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/geo_dimension.rs

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
1-
mod calendar_dimension;
2-
mod case_dimension;
31
mod common;
42
mod cube_symbol;
53
mod dimension_symbol;
6-
mod geo_dimension;
74
mod measure_symbol;
85
mod member_expression_symbol;
96
mod member_symbol;
10-
mod primitive_type;
11-
mod simple_dimension;
12-
mod switch_dimension;
137
mod symbol_factory;
148
mod time_dimension_symbol;
159

16-
pub use calendar_dimension::CalendarDimension;
17-
pub use case_dimension::CaseDimension;
1810
pub use common::*;
1911
pub use cube_symbol::{
2012
CubeNameSymbol, CubeNameSymbolFactory, CubeTableSymbol, CubeTableSymbolFactory,
2113
};
2214
pub use dimension_symbol::*;
23-
pub use geo_dimension::GeoDimension;
2415
pub use measure_symbol::{
2516
DimensionTimeShift, MeasureSymbol, MeasureSymbolFactory, MeasureTimeShifts,
2617
};
2718
pub use member_expression_symbol::{MemberExpressionExpression, MemberExpressionSymbol};
2819
pub use member_symbol::MemberSymbol;
29-
pub use primitive_type::*;
30-
pub use simple_dimension::SimpleDimension;
31-
pub use switch_dimension::SwitchDimension;
3220
pub use symbol_factory::SymbolFactory;
3321
pub use time_dimension_symbol::TimeDimensionSymbol;

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/primitive_type.rs

Lines changed: 0 additions & 108 deletions
This file was deleted.

0 commit comments

Comments
 (0)