Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 46 additions & 9 deletions Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -355,15 +355,27 @@ public override SqlObject VisitGroup_by_clause([NotNull] sqlParser.Group_by_clau
public override SqlObject VisitOrder_by_clause([NotNull] sqlParser.Order_by_clauseContext context)
{
Contract.Requires(context != null);

List<SqlOrderByItem> orderByItems = new List<SqlOrderByItem>();
foreach (sqlParser.Order_by_itemContext orderByItemContext in context.order_by_items().order_by_item())
{
SqlOrderByItem orderByItem = (SqlOrderByItem)this.VisitOrder_by_item(orderByItemContext);
orderByItems.Add(orderByItem);
}

return SqlOrderByClause.Create(orderByItems.ToImmutableArray());

bool rank = context.K_RANK() != null;
List<SqlOrderByItem> orderByItems = new List<SqlOrderByItem>();
if (rank)
{
foreach (sqlParser.Score_expression_order_by_itemContext scoreOrderByItemContext in context.score_expression_order_by_items().score_expression_order_by_item())
{
SqlOrderByItem orderByItem = (SqlOrderByItem)this.VisitScore_expression_order_by_item(scoreOrderByItemContext);
orderByItems.Add(orderByItem);
}
}
else
{
foreach (sqlParser.Order_by_itemContext orderByItemContext in context.order_by_items().order_by_item())
{
SqlOrderByItem orderByItem = (SqlOrderByItem)this.VisitOrder_by_item(orderByItemContext);
orderByItems.Add(orderByItem);
}
}

return SqlOrderByClause.Create(rank, orderByItems.ToImmutableArray());
}

public override SqlObject VisitOrder_by_item([NotNull] sqlParser.Order_by_itemContext context)
Expand All @@ -388,6 +400,31 @@ public override SqlObject VisitOrder_by_item([NotNull] sqlParser.Order_by_itemCo
}
}

return SqlOrderByItem.Create(expression, isDescending);
}

public override SqlObject VisitScore_expression_order_by_item([NotNull] sqlParser.Score_expression_order_by_itemContext context)
{
Contract.Requires(context != null);

SqlFunctionCallScalarExpression expression = (SqlFunctionCallScalarExpression)this.Visit(context.function_call_scalar_expression());
bool? isDescending = null;
if (context.sort_order() != null)
{
if (context.sort_order().K_ASC() != null)
{
isDescending = false;
}
else if (context.sort_order().K_DESC() != null)
{
isDescending = true;
}
else
{
throw new ArgumentOutOfRangeException($"Unknown sort order : {context.sort_order()}.");
}
}

return SqlOrderByItem.Create(expression, isDescending);
}

Expand Down
1,556 changes: 788 additions & 768 deletions Microsoft.Azure.Cosmos/src/Query/Core/Parser/IsqlListener.cs

Large diffs are not rendered by default.

950 changes: 481 additions & 469 deletions Microsoft.Azure.Cosmos/src/Query/Core/Parser/IsqlVisitor.cs

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion Microsoft.Azure.Cosmos/src/Query/Core/Parser/sql.g4
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,17 @@ group_by_clause : K_GROUP K_BY scalar_expression_list ;
/*--------------------------------------------------------------------------------*/
/* ORDER BY */
/*--------------------------------------------------------------------------------*/
order_by_clause : K_ORDER K_BY order_by_items ;
order_by_clause
: K_ORDER K_BY order_by_items
| K_ORDER K_BY K_RANK score_expression_order_by_items
;

score_expression_order_by_items : score_expression_order_by_item (',' score_expression_order_by_item)* ;
Comment thread
leminh98 marked this conversation as resolved.
score_expression_order_by_item : function_call_scalar_expression sort_order? ;
Comment thread
leminh98 marked this conversation as resolved.

order_by_items : order_by_item (',' order_by_item)* ;
order_by_item : scalar_expression sort_order? ;

sort_order
: K_ASC
| K_DESC
Expand Down Expand Up @@ -227,6 +235,7 @@ K_NULL : 'null';
K_OFFSET : O F F S E T;
K_OR : O R;
K_ORDER : O R D E R;
K_RANK : R A N K;
K_RIGHT : R I G H T;
K_SELECT : S E L E C T;
K_TOP : T O P;
Expand Down
Loading