Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 30 additions & 3 deletions src/Parsers/Kusto/KustoFunctions/KQLAggregationFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,18 @@ bool TakeAnyIf::convertImpl(String & out, IParser::Pos & pos)

bool Variance::convertImpl(String & out, IParser::Pos & pos)
{
return directMapping(out, pos, "varSamp");
const String fn_name = getKQLFunctionName(pos);
if (fn_name.empty())
return false;

const String expr = getArgument(fn_name, pos);
out = std::format(
"IF (isNaN(varSamp(if(toTypeName({0}) = 'Nullable(Nothing)', throwIf(toTypeName({0}) = 'Nullable(Nothing)', "
Comment thread
ltrk2 marked this conversation as resolved.
"'summarize operator: Failed to resolve scalar expression named null'), {0})) AS variance_{1}), 0, variance_{1})",
expr,
generateUniqueIdentifier());

return true;
}

bool VarianceIf::convertImpl(String & out, IParser::Pos & pos)
Expand All @@ -610,14 +621,30 @@ bool VarianceIf::convertImpl(String & out, IParser::Pos & pos)

const String expr = getArgument(fn_name, pos);
const String predicate = getArgument(fn_name, pos);
out = std::format("varSampIf({}, {})", expr, predicate);
out = std::format(
"IF (isNaN(varSampIf((if(toTypeName({0}) = 'Nullable(Nothing)', throwIf(toTypeName({0}) = 'Nullable(Nothing)', "
"'summarize operator: Failed to resolve scalar expression named null'), {0})), {1}) AS variance_{2}), 0, variance_{2})",
expr,
predicate,
generateUniqueIdentifier());

return true;
}

bool VarianceP::convertImpl(String & out, IParser::Pos & pos)
{
return directMapping(out, pos, "varPop");
const String fn_name = getKQLFunctionName(pos);
if (fn_name.empty())
return false;

const String expr = getArgument(fn_name, pos);
out = std::format(
"IF (isNaN(varPop(if(toTypeName({0}) = 'Nullable(Nothing)', throwIf(toTypeName({0}) = 'Nullable(Nothing)', "
"'summarize operator: Failed to resolve scalar expression named null'), {0})) AS variance_{1}), 0, variance_{1})",
expr,
generateUniqueIdentifier());

return true;
}

bool CountDistinct::convertImpl(String & out, IParser::Pos & pos)
Expand Down
30 changes: 18 additions & 12 deletions src/Parsers/tests/KQL/gtest_KQL_AggregateFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,18 +110,6 @@ INSTANTIATE_TEST_SUITE_P(ParserKQLQuery_Aggregate, ParserTest,
"Customers | summarize by FirstName, LastName, Age",
"SELECT\n FirstName,\n LastName,\n Age\nFROM Customers\nGROUP BY\n FirstName,\n LastName,\n Age"
},
{
"Customers | summarize variance(Age)",
"SELECT varSamp(Age) AS variance_Age\nFROM Customers"
},
{
"Customers | summarize variancep(Age)",
"SELECT varPop(Age) AS variancep_Age\nFROM Customers"
},
{
"Customers | summarize varianceif(Age, Age < 30)",
"SELECT varSampIf(Age, Age < 30) AS varianceif_Age\nFROM Customers"
},
{
"Customers | summarize z=arg_max(Age, FirstName, LastName) by Occupation",
"SELECT\n Occupation,\n argMax(FirstName, Age) AS FirstName,\n argMax(LastName, Age) AS LastName,\n argMax(Age, Age) AS z\nFROM Customers\nGROUP BY Occupation"
Expand All @@ -135,3 +123,21 @@ INSTANTIATE_TEST_SUITE_P(ParserKQLQuery_Aggregate, ParserTest,
"SELECT uniqCombined64Merge(18)(xy) AS Column1\nFROM\n(\n SELECT uniqCombined64MergeState(18)(arrayJoin([x, y])) AS xy\n FROM\n (\n SELECT\n uniqCombined64State(18)(Education) AS x,\n uniqCombined64State(18)(Occupation) AS y\n FROM Customers\n )\n)"
}
})));

INSTANTIATE_TEST_SUITE_P(ParserKQLQuery_Aggregate, ParserRegexTest,
::testing::Combine(
::testing::Values(std::make_shared<DB::ParserKQLStatement>()),
::testing::ValuesIn(std::initializer_list<ParserTestCase>{
{
"Customers | summarize variance(Age)",
R"(SELECT IF\(isNaN\(varSamp\(if\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', throwIf\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', \'summarize operator: Failed to resolve scalar expression named null\'\), Age\)\) AS variance_\d+\), 0, variance_\d+\) AS variance_Age\nFROM Customers)"
},
{
"Customers | summarize variancep(Age)",
R"(SELECT IF\(isNaN\(varPop\(if\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', throwIf\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', \'summarize operator: Failed to resolve scalar expression named null\'\), Age\)\) AS variance_\d+\), 0, variance_\d+\) AS variancep_Age\nFROM Customers)"
},
{
"Customers | summarize varianceif(Age, Age < 30)",
R"(SELECT IF\(isNaN\(varSampIf\(if\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', throwIf\(toTypeName\(Age\) = \'Nullable\(Nothing\)\', \'summarize operator: Failed to resolve scalar expression named null\'\), Age\), Age < 30\) AS variance_\d+\), 0, variance_\d+\) AS varianceif_Age\nFROM Customers)"
}
})));
3 changes: 3 additions & 0 deletions tests/queries/0_stateless/02366_kql_summarize.sql
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,9 @@ print '-- variance/variancep/varianceif --';
Customers | summarize variance(Age);
Customers | summarize variancep(Age);
Customers | summarize varianceif(Age, Age < 30);
Customers | summarize variance(null); -- { clientError Code: 395 }
Customers | summarize variancep(null); -- { clientError Code: 395 }
Customers | summarize varianceif(null, Age < 30); -- { clientError Code: 395 }

print '-- arg_max --';
Customers | summarize arg_max(Age); -- { clientError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
Expand Down