Skip to content

Commit b673c2d

Browse files
mbasmanovafacebook-github-bot
authored andcommitted
feat: Add API to return function signatures by name (facebookincubator#12289)
Summary: Pull Request resolved: facebookincubator#12289 Add velox::getFunctionSignatures(name) API to get a list of function signatures by name. Use this API to optimize lambda function resolution logic. Reviewed By: pedroerp Differential Revision: D69368657 fbshipit-source-id: e8713b2e5791c1186495a0a6423b1ab374ea8a6b
1 parent 35711b7 commit b673c2d

File tree

5 files changed

+58
-6
lines changed

5 files changed

+58
-6
lines changed

pyvelox/signatures.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void addSignatureBindings(py::module& m, bool asModuleLocalDefinitions) {
106106

107107
m.def(
108108
"get_function_signatures",
109-
&getFunctionSignatures,
109+
[]() { return getFunctionSignatures(); },
110110
py::return_value_policy::reference,
111111
"Returns a dictionary of the current signatures.");
112112

velox/functions/FunctionRegistry.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,27 @@ FunctionSignatureMap getFunctionSignatures() {
6464
return result;
6565
}
6666

67+
std::vector<const exec::FunctionSignature*> getFunctionSignatures(
68+
const std::string& functionName) {
69+
// Some functions have both simple and vector implementations (for different
70+
// signatures). Collect all signatures.
71+
// Check simple functions first.
72+
auto signatures = exec::simpleFunctions().getFunctionSignatures(functionName);
73+
74+
// Check vector functions.
75+
auto& vectorFunctions = exec::vectorFunctionFactories();
76+
vectorFunctions.withRLock([&](const auto& functions) {
77+
auto it = functions.find(functionName);
78+
if (it != functions.end()) {
79+
for (const auto& signature : it->second.signatures) {
80+
signatures.push_back(signature.get());
81+
}
82+
}
83+
});
84+
85+
return signatures;
86+
}
87+
6788
FunctionSignatureMap getVectorFunctionSignatures() {
6889
FunctionSignatureMap result;
6990
populateVectorFunctionSignatures(result);

velox/functions/FunctionRegistry.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ using FunctionSignatureMap = std::
3131
/// The mapping is function name -> list of function signatures
3232
FunctionSignatureMap getFunctionSignatures();
3333

34+
/// Returns a list of function signatures for a given function name. Returns
35+
/// empty list if function with specified name not found.
36+
std::vector<const exec::FunctionSignature*> getFunctionSignatures(
37+
const std::string& functionName);
38+
3439
/// Returns a mapping of all Vector functions registered in Velox
3540
/// The mapping is function name -> list of function signatures
3641
FunctionSignatureMap getVectorFunctionSignatures();

velox/functions/tests/FunctionRegistryTest.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,34 @@ class FunctionRegistryTest : public testing::Test {
107107
}
108108
};
109109

110+
TEST_F(FunctionRegistryTest, getFunctionSignaturesByName) {
111+
{
112+
auto signatures = getFunctionSignatures("func_one");
113+
ASSERT_EQ(signatures.size(), 1);
114+
ASSERT_EQ(
115+
signatures.at(0)->toString(),
116+
exec::FunctionSignatureBuilder()
117+
.returnType("varchar")
118+
.argumentType("varchar")
119+
.build()
120+
->toString());
121+
}
122+
123+
{
124+
auto signatures = getFunctionSignatures("vector_func_one");
125+
ASSERT_EQ(signatures.size(), 1);
126+
ASSERT_EQ(
127+
signatures.at(0)->toString(),
128+
exec::FunctionSignatureBuilder()
129+
.returnType("bigint")
130+
.argumentType("varchar")
131+
.build()
132+
->toString());
133+
}
134+
135+
ASSERT_TRUE(getFunctionSignatures("non-existent-function").empty());
136+
}
137+
110138
TEST_F(FunctionRegistryTest, getFunctionSignatures) {
111139
auto functionSignatures = getFunctionSignatures();
112140
ASSERT_EQ(functionSignatures.size(), 14);

velox/parse/Expressions.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -384,11 +384,9 @@ const exec::FunctionSignature* findLambdaSignature(
384384
const exec::FunctionSignature* findLambdaSignature(
385385
const std::shared_ptr<const CallExpr>& callExpr) {
386386
// Look for a scalar lambda function.
387-
auto allSignatures = getFunctionSignatures();
388-
auto it = allSignatures.find(callExpr->getFunctionName());
389-
390-
if (it != allSignatures.end()) {
391-
return findLambdaSignature(it->second, callExpr);
387+
auto scalarSignatures = getFunctionSignatures(callExpr->getFunctionName());
388+
if (!scalarSignatures.empty()) {
389+
return findLambdaSignature(scalarSignatures, callExpr);
392390
}
393391

394392
// Look for an aggregate lambda function.

0 commit comments

Comments
 (0)