Skip to content

Commit

Permalink
Add to string expression (#221)
Browse files Browse the repository at this point in the history
  • Loading branch information
Ulimo authored Dec 22, 2023
1 parent a8f6cf8 commit 2a4ad87
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/FlowtideDotNet.Core/Compute/Internal/BuiltInStringFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ public static void AddStringFunctions(FunctionsRegister functionsRegister)
functionsRegister.RegisterScalarFunctionWithExpression(FunctionsString.Uri, FunctionsString.Trim, (x) => TrimImplementation(x));
functionsRegister.RegisterScalarFunctionWithExpression(FunctionsString.Uri, FunctionsString.LTrim, (x) => LTrimImplementation(x));
functionsRegister.RegisterScalarFunctionWithExpression(FunctionsString.Uri, FunctionsString.RTrim, (x) => RTrimImplementation(x));
functionsRegister.RegisterScalarFunctionWithExpression(FunctionsString.Uri, FunctionsString.To_String, (x) => ToStringImplementation(x));
}

private static FlxValue ToStringImplementation(in FlxValue val)
{
if (val.IsNull)
{
return NullValue;
}
return FlxValue.FromBytes(FlexBuffer.SingleValue(FlxValueStringFunctions.ToString(val)));
}

private static FlxValue LowerImplementation(in FlxValue val)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ public static class FunctionsString
public const string Trim = "trim";
public const string LTrim = "ltrim";
public const string RTrim = "rtrim";
public const string To_String = "to_string";
}
}
22 changes: 22 additions & 0 deletions src/FlowtideDotNet.Substrait/Sql/Internal/BuiltInSqlFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,28 @@ public static void AddBuiltInFunctions(SqlFunctionRegister sqlFunctionRegister)
}
});

sqlFunctionRegister.RegisterScalarFunction("to_string", (f, visitor, emitData) =>
{
if (f.Args == null || f.Args.Count != 1)
{
throw new InvalidOperationException("to_string must have exactly one argument");
}
if (f.Args[0] is FunctionArg.Unnamed unnamed && unnamed.FunctionArgExpression is FunctionArgExpression.FunctionExpression funcExpr)
{
var expr = visitor.Visit(funcExpr.Expression, emitData);
return new ScalarFunction()
{
ExtensionUri = FunctionsString.Uri,
ExtensionName = FunctionsString.To_String,
Arguments = new List<Expressions.Expression>() { expr.Expr }
};
}
else
{
throw new NotImplementedException("to_string does not support the input parameter");
}
});

sqlFunctionRegister.RegisterScalarFunction("guid", (f, visitor, emitData) =>
{
if (f.Args == null || f.Args.Count != 1)
Expand Down
18 changes: 18 additions & 0 deletions tests/FlowtideDotNet.AcceptanceTests/DatetimeFunctionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,5 +123,23 @@ FROM buffered
var rows2 = GetActualRows();
// This test only validates that it can run for now
}

[Fact]
public async Task ToStringTest()
{
GenerateData();
await StartStream(@"
INSERT INTO output
SELECT
to_string(orderkey) as orderkey
FROM Orders
");
await WaitForUpdate();
AssertCurrentDataEqual(
Orders.Select(o => new {
OrderKey = o.OrderKey.ToString()
})
);
}
}
}

0 comments on commit 2a4ad87

Please sign in to comment.