Apply ORDER BY clause to query result
(
&self,
mut result: QueryResult,
order_clause: &crate::ast::OrderClause,
context: &ExecutionContext,
)
| 8403 | |
| 8404 | /// Apply ORDER BY clause to query result |
| 8405 | fn apply_order_by( |
| 8406 | &self, |
| 8407 | mut result: QueryResult, |
| 8408 | order_clause: &crate::ast::OrderClause, |
| 8409 | context: &ExecutionContext, |
| 8410 | ) -> Result<QueryResult, ExecutionError> { |
| 8411 | use std::cmp::Ordering; |
| 8412 | |
| 8413 | result.rows.sort_by(|a, b| { |
| 8414 | for order_item in &order_clause.items { |
| 8415 | // Evaluate the expression for both rows using cloned context |
| 8416 | let mut context_a = context.clone(); |
| 8417 | for var_name in &result.variables { |
| 8418 | if let Some(value) = a.values.get(var_name) { |
| 8419 | context_a.set_variable(var_name.clone(), value.clone()); |
| 8420 | } |
| 8421 | } |
| 8422 | |
| 8423 | let mut context_b = context.clone(); |
| 8424 | for var_name in &result.variables { |
| 8425 | if let Some(value) = b.values.get(var_name) { |
| 8426 | context_b.set_variable(var_name.clone(), value.clone()); |
| 8427 | } |
| 8428 | } |
| 8429 | |
| 8430 | let val_a = self.evaluate_expression(&order_item.expression, &context_a); |
| 8431 | let val_b = self.evaluate_expression(&order_item.expression, &context_b); |
| 8432 | |
| 8433 | let ordering = match (val_a, val_b) { |
| 8434 | (Ok(Value::String(s1)), Ok(Value::String(s2))) => s1.cmp(&s2), |
| 8435 | (Ok(Value::Number(n1)), Ok(Value::Number(n2))) => { |
| 8436 | n1.partial_cmp(&n2).unwrap_or(Ordering::Equal) |
| 8437 | } |
| 8438 | (Ok(Value::Null), Ok(Value::Null)) => Ordering::Equal, |
| 8439 | (Ok(Value::Null), _) => Ordering::Less, |
| 8440 | (_, Ok(Value::Null)) => Ordering::Greater, |
| 8441 | _ => Ordering::Equal, |
| 8442 | }; |
| 8443 | |
| 8444 | let final_ordering = match order_item.direction { |
| 8445 | crate::ast::OrderDirection::Ascending => ordering, |
| 8446 | crate::ast::OrderDirection::Descending => ordering.reverse(), |
| 8447 | }; |
| 8448 | |
| 8449 | if final_ordering != Ordering::Equal { |
| 8450 | return final_ordering; |
| 8451 | } |
| 8452 | } |
| 8453 | Ordering::Equal |
| 8454 | }); |
| 8455 | |
| 8456 | Ok(result) |
| 8457 | } |
| 8458 | |
| 8459 | /// Apply LIMIT clause to query result |
| 8460 | fn apply_limit( |
no test coverage detected