@@ -400,19 +400,25 @@ def _cube_query_tool(dimensions: str, measures: str, dim_filters: str, meas_filt
400400 expr = mdef ["expression" ]
401401 mes_lines .append (f"{ expr } AS { measure } " )
402402 meas_list = ",\n " .join (mes_lines )
403+ top_clause = f"TOP { top } " if top else ""
404+ dim_comma = ",\n " if dim_list .strip () else ""
405+ where_dim_clause = f"WHERE { dim_filters } " if dim_filters else ""
406+ where_meas_clause = f"WHERE { meas_filters } " if meas_filters else ""
407+ order_clause = f"ORDER BY { order_by } " if order_by else ""
408+
403409 sql = (
404- f"SELECT { 'TOP ' + str ( top ) if top else '' } * from\n "
410+ f"SELECT { top_clause } * from\n "
405411 "(SELECT\n "
406- f" { dim_list } { ', \n ' if dim_list . strip () else '' } "
412+ f" { dim_list } { dim_comma } "
407413 f" { meas_list } \n "
408414 "FROM (\n "
409415 f"{ cube ['sql' ].strip ()} \n "
410- f"{ 'WHERE ' + dim_filters if dim_filters else '' } "
416+ f"{ where_dim_clause } "
411417 ") AS c\n "
412418 f"GROUP BY { ', ' .join (dim_list_raw )} "
413419 ") AS a\n "
414- f"{ 'WHERE ' + meas_filters if meas_filters else '' } "
415- f"{ 'ORDER BY ' + order_by if order_by else '' } "
420+ f"{ where_meas_clause } "
421+ f"{ order_clause } "
416422 ";"
417423 )
418424 return sql
@@ -439,6 +445,17 @@ async def _dynamic_tool(dimensions, measures, dim_filters="", meas_filters="", o
439445 measure_lines = []
440446 for n , m in cube .get ('measures' , {}).items ():
441447 measure_lines .append (f" - { n } : { m .get ('description' , '' )} " )
448+
449+ # Create example strings for documentation
450+ dim_examples = [f"{ d } { e } " for d , e in zip (list (cube .get ('dimensions' , {}))[:2 ], ["= 'value'" , "in ('X', 'Y', 'Z')" ])]
451+ dim_example = ' AND ' .join (dim_examples )
452+
453+ meas_examples = [f"{ m } { e } " for m , e in zip (list (cube .get ('measures' , {}))[:2 ], ["> 1000" , "= 100" ])]
454+ meas_example = ' AND ' .join (meas_examples )
455+
456+ order_examples = [f"{ d } { e } " for d , e in zip (list (cube .get ('dimensions' , {}))[:2 ], [" ASC" , " DESC" ])]
457+ order_example = ' , ' .join (order_examples )
458+
442459 _dynamic_tool .__doc__ = f"""
443460 Tool to query the cube '{ name } '.
444461 { cube .get ('description' , '' )}
@@ -451,11 +468,11 @@ async def _dynamic_tool(dimensions, measures, dim_filters="", meas_filters="", o
451468 { chr (10 ).join (measure_lines )}
452469
453470 * dim_filters (str): Filter expression to apply to dimensions. Valid dimension names are: [{ ', ' .join (cube .get ('dimensions' , {}).keys ())} ], use valid SQL expressions, for example:
454- \" { ' AND ' . join ([ f" { d } { e } " for d , e in zip ( list ( cube . get ( 'dimensions' , {}))[: 2 ], [ "= 'value'" , "in ('X', 'Y', 'Z')" ])]) } \ "
471+ " { dim_example } "
455472 * meas_filters (str): Filter expression to apply to computed measures. Valid measure names are: [{ ', ' .join (cube .get ('measures' , {}).keys ())} ], use valid SQL expressions, for example:
456- \" { ' AND ' . join ([ f" { m } { e } " for m , e in zip ( list ( cube . get ( 'measures' , {}))[: 2 ], [ "> 1000" , "= 100" ])]) } \ "
473+ " { meas_example } "
457474 * order_by (str): Order expression on any selected dimensions and measures. Use SQL syntax, for example:
458- \" { ' , ' . join ([ f" { d } { e } " for d , e in zip ( list ( cube . get ( 'dimensions' , {}))[: 2 ], [ " ASC" , " DESC" ])]) } \ "
475+ " { order_example } "
459476 top (int): Limit the number of rows returned, use a positive integer.
460477
461478 Returns:
0 commit comments