@@ -355,15 +355,27 @@ public override SqlObject VisitGroup_by_clause([NotNull] sqlParser.Group_by_clau
355355 public override SqlObject VisitOrder_by_clause ( [ NotNull ] sqlParser . Order_by_clauseContext context )
356356 {
357357 Contract . Requires ( context != null ) ;
358-
359- List < SqlOrderByItem > orderByItems = new List < SqlOrderByItem > ( ) ;
360- foreach ( sqlParser . Order_by_itemContext orderByItemContext in context . order_by_items ( ) . order_by_item ( ) )
361- {
362- SqlOrderByItem orderByItem = ( SqlOrderByItem ) this . VisitOrder_by_item ( orderByItemContext ) ;
363- orderByItems . Add ( orderByItem ) ;
364- }
365-
366- return SqlOrderByClause . Create ( orderByItems . ToImmutableArray ( ) ) ;
358+
359+ bool rank = context . K_RANK ( ) != null ;
360+ List < SqlOrderByItem > orderByItems = new List < SqlOrderByItem > ( ) ;
361+ if ( rank )
362+ {
363+ foreach ( sqlParser . Score_expression_order_by_itemContext scoreOrderByItemContext in context . score_expression_order_by_items ( ) . score_expression_order_by_item ( ) )
364+ {
365+ SqlOrderByItem orderByItem = ( SqlOrderByItem ) this . VisitScore_expression_order_by_item ( scoreOrderByItemContext ) ;
366+ orderByItems . Add ( orderByItem ) ;
367+ }
368+ }
369+ else
370+ {
371+ foreach ( sqlParser . Order_by_itemContext orderByItemContext in context . order_by_items ( ) . order_by_item ( ) )
372+ {
373+ SqlOrderByItem orderByItem = ( SqlOrderByItem ) this . VisitOrder_by_item ( orderByItemContext ) ;
374+ orderByItems . Add ( orderByItem ) ;
375+ }
376+ }
377+
378+ return SqlOrderByClause . Create ( rank , orderByItems . ToImmutableArray ( ) ) ;
367379 }
368380
369381 public override SqlObject VisitOrder_by_item ( [ NotNull ] sqlParser . Order_by_itemContext context )
@@ -388,6 +400,31 @@ public override SqlObject VisitOrder_by_item([NotNull] sqlParser.Order_by_itemCo
388400 }
389401 }
390402
403+ return SqlOrderByItem . Create ( expression , isDescending ) ;
404+ }
405+
406+ public override SqlObject VisitScore_expression_order_by_item ( [ NotNull ] sqlParser . Score_expression_order_by_itemContext context )
407+ {
408+ Contract . Requires ( context != null ) ;
409+
410+ SqlFunctionCallScalarExpression expression = ( SqlFunctionCallScalarExpression ) this . Visit ( context . function_call_scalar_expression ( ) ) ;
411+ bool ? isDescending = null ;
412+ if ( context . sort_order ( ) != null )
413+ {
414+ if ( context . sort_order ( ) . K_ASC ( ) != null )
415+ {
416+ isDescending = false ;
417+ }
418+ else if ( context . sort_order ( ) . K_DESC ( ) != null )
419+ {
420+ isDescending = true ;
421+ }
422+ else
423+ {
424+ throw new ArgumentOutOfRangeException ( $ "Unknown sort order : { context . sort_order ( ) } .") ;
425+ }
426+ }
427+
391428 return SqlOrderByItem . Create ( expression , isDescending ) ;
392429 }
393430
0 commit comments