@@ -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+ }
0 commit comments