MCPcopy Create free account
hub / github.com/GraphLite-AI/GraphLite / apply_order_by

Method apply_order_by

graphlite/src/exec/executor.rs:8405–8457  ·  view source on GitHub ↗

Apply ORDER BY clause to query result

(
        &self,
        mut result: QueryResult,
        order_clause: &crate::ast::OrderClause,
        context: &ExecutionContext,
    )

Source from the content-addressed store, hash-verified

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(

Calls 6

cloneMethod · 0.80
set_variableMethod · 0.80
cmpMethod · 0.80
partial_cmpMethod · 0.80
getMethod · 0.45
evaluate_expressionMethod · 0.45

Tested by

no test coverage detected