Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(functions): add to_hex #478

Merged
merged 1 commit into from
Jan 7, 2024
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions arroyo-sql-testing/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,17 @@ mod tests {
},
None
);

single_test_codegen!(
"to_hex",
"to_hex(1)",
arroyo_sql::TestStruct {
non_nullable_i32: 1i32,
..Default::default()
},
"1".to_string()
);

// BitLength
single_test_codegen!(
"bit_length_null",
Expand Down
26 changes: 20 additions & 6 deletions arroyo-sql/src/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -442,11 +442,10 @@ impl Expression {
}
}

pub fn traverse_mut<T, F: Fn(&mut T, &mut Expression) -> ()>(
&mut self,
context: &mut T,
f: &F,
) {
pub fn traverse_mut<T, F>(&mut self, context: &mut T, f: &F)
where
F: Fn(&mut T, &mut Expression) -> (),
{
match self {
Expression::Column(_) => {}
Expression::UnaryBoolean(e) => {
Expand Down Expand Up @@ -790,6 +789,7 @@ impl<'a> ExpressionContext<'a> {
| BuiltinScalarFunction::Rpad
| BuiltinScalarFunction::Rtrim
| BuiltinScalarFunction::RegexpMatch
| BuiltinScalarFunction::ToHex
| BuiltinScalarFunction::RegexpReplace => {
let string_function: StringFunction =
(fun.clone(), arg_expressions).try_into()?;
Expand Down Expand Up @@ -860,7 +860,6 @@ impl<'a> ExpressionContext<'a> {
fun.clone(),
Box::new(arg_expressions.remove(0)),
)?),
BuiltinScalarFunction::ToHex => bail!("hex not implemented"),
BuiltinScalarFunction::Uuid => bail!("UUID unimplemented"),
BuiltinScalarFunction::Cbrt => bail!("cube root unimplemented"),
BuiltinScalarFunction::Degrees => bail!("degrees not implemented yet"),
Expand Down Expand Up @@ -2249,6 +2248,7 @@ pub enum StringFunction {
Right(Box<Expression>, Box<Expression>),
Rpad(Box<Expression>, Box<Expression>, Option<Box<Expression>>),
Rtrim(Box<Expression>, Option<Box<Expression>>),
ToHex(Box<Expression>),
}

#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd)]
Expand Down Expand Up @@ -2354,6 +2354,9 @@ impl TryFrom<(BuiltinScalarFunction, Vec<Expression>)> for StringFunction {
(1, BuiltinScalarFunction::Ascii) => {
Ok(StringFunction::Ascii(Box::new(args.remove(0))))
}
(1, BuiltinScalarFunction::ToHex) => {
Ok(StringFunction::ToHex(Box::new(args.remove(0))))
}
(1, BuiltinScalarFunction::BitLength) => {
Ok(StringFunction::BitLength(Box::new(args.remove(0))))
}
Expand Down Expand Up @@ -2513,6 +2516,7 @@ impl StringFunction {
fn expressions(&mut self) -> Vec<&mut Expression> {
match self {
StringFunction::Ascii(expr)
| StringFunction::ToHex(expr)
| StringFunction::BitLength(expr)
| StringFunction::CharacterLength(expr)
| StringFunction::OctetLength(expr)
Expand Down Expand Up @@ -2572,6 +2576,10 @@ impl StringFunction {
DataType::Int32,
expr.expression_type(input_context).is_optional(),
),
StringFunction::ToHex(expr) => TypeDef::DataType(
DataType::Utf8,
expr.expression_type(input_context).is_optional(),
),
StringFunction::StartsWith(expr1, expr2) => TypeDef::DataType(
DataType::Boolean,
expr1.expression_type(input_context).is_optional()
Expand Down Expand Up @@ -2639,6 +2647,9 @@ impl StringFunction {
StringFunction::Ascii(_) => {
parse_quote!(arroyo_worker::operators::functions::strings::ascii(arg))
}
StringFunction::ToHex(_) => {
parse_quote!(arroyo_worker::operators::functions::strings::to_hex(arg))
}
StringFunction::BitLength(_) => {
parse_quote!(arroyo_worker::operators::functions::strings::bit_length(
arg
Expand Down Expand Up @@ -2781,6 +2792,7 @@ impl StringFunction {
| StringFunction::Trim(arg, None)
| StringFunction::Ltrim(arg, None)
| StringFunction::Rtrim(arg, None)
| StringFunction::ToHex(arg)
| StringFunction::RegexpMatch(arg, _) => {
let expr = arg.generate(input_context);
match arg.expression_type(input_context).is_optional() {
Expand Down Expand Up @@ -3015,6 +3027,7 @@ impl CodeGenerator<ValuePointerContext, TypeDef, syn::Expr> for StringFunction {
| StringFunction::Trim(arg, None)
| StringFunction::Ltrim(arg, None)
| StringFunction::Rtrim(arg, None)
| StringFunction::ToHex(arg)
| StringFunction::RegexpMatch(arg, _) => {
let expr = arg.generate(input_context);
match arg.expression_type(input_context).is_optional() {
Expand Down Expand Up @@ -3262,6 +3275,7 @@ impl CodeGenerator<ValuePointerContext, TypeDef, syn::Expr> for StringFunction {
| StringFunction::InitCap(expr)
| StringFunction::Ltrim(expr, None)
| StringFunction::Rtrim(expr, None)
| StringFunction::ToHex(expr)
| StringFunction::Trim(expr, None) => TypeDef::DataType(
DataType::Utf8,
expr.expression_type(input_context).is_optional(),
Expand Down
4 changes: 4 additions & 0 deletions arroyo-worker/src/operators/functions/strings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,7 @@ pub fn rtrim(string: String, trimming_characters: String) -> String {
let char_slice: &[char] = &chars;
string.trim_end_matches(char_slice).to_string()
}

pub fn to_hex(string: String) -> String {
hex::encode(string)
}