Encode a numrange value
(range_str: &str)
| 566 | |
| 567 | /// Encode a numrange value |
| 568 | pub fn encode_numrange(range_str: &str) -> Result<Vec<u8>, String> { |
| 569 | let trimmed = range_str.trim(); |
| 570 | let mut result = Vec::new(); |
| 571 | |
| 572 | // Handle empty range |
| 573 | if trimmed == "empty" { |
| 574 | result.push(0x01); // RANGE_EMPTY flag |
| 575 | return Ok(result); |
| 576 | } |
| 577 | |
| 578 | // Parse range format |
| 579 | if trimmed.len() < 3 { |
| 580 | return Err("Invalid range format".to_string()); |
| 581 | } |
| 582 | |
| 583 | let lower_inclusive = trimmed.starts_with('['); |
| 584 | let upper_inclusive = trimmed.ends_with(']'); |
| 585 | |
| 586 | let inner = &trimmed[1..trimmed.len()-1]; |
| 587 | let parts: Vec<&str> = inner.split(',').collect(); |
| 588 | |
| 589 | if parts.len() != 2 { |
| 590 | return Err("Invalid range format: expected two bounds".to_string()); |
| 591 | } |
| 592 | |
| 593 | let lower_str = parts[0].trim(); |
| 594 | let upper_str = parts[1].trim(); |
| 595 | |
| 596 | // Calculate flags |
| 597 | let mut flags = 0u8; |
| 598 | if lower_inclusive { |
| 599 | flags |= 0x02; // LB_INC |
| 600 | } |
| 601 | if upper_inclusive { |
| 602 | flags |= 0x04; // UB_INC |
| 603 | } |
| 604 | |
| 605 | let lower_infinite = lower_str == "-infinity" || lower_str.is_empty(); |
| 606 | let upper_infinite = upper_str == "infinity" || upper_str.is_empty(); |
| 607 | |
| 608 | if lower_infinite { |
| 609 | flags |= 0x08; // LB_INF |
| 610 | } |
| 611 | if upper_infinite { |
| 612 | flags |= 0x10; // UB_INF |
| 613 | } |
| 614 | |
| 615 | result.push(flags); |
| 616 | |
| 617 | // Encode numeric bounds using DecimalHandler |
| 618 | if !lower_infinite { |
| 619 | let lower_decimal = Decimal::from_str(lower_str) |
| 620 | .map_err(|e| format!("Invalid lower bound: {e}"))?; |
| 621 | let lower_bytes = DecimalHandler::encode_numeric(&lower_decimal); |
| 622 | result.extend_from_slice(&(lower_bytes.len() as i32).to_be_bytes()); |
| 623 | result.extend_from_slice(&lower_bytes); |
| 624 | } |
| 625 |