diff --git a/core/src/main/groovy/com/virtusa/gto/nyql/db/QFunctions.groovy b/core/src/main/groovy/com/virtusa/gto/nyql/db/QFunctions.groovy index f337e09..3f5cefe 100644 --- a/core/src/main/groovy/com/virtusa/gto/nyql/db/QFunctions.groovy +++ b/core/src/main/groovy/com/virtusa/gto/nyql/db/QFunctions.groovy @@ -582,6 +582,28 @@ trait QFunctions { String.format('COUNT(%s)', ___resolveIn(___val(c) ?: '*', ___pm(c))) } + /** + * -------------------------------------------------------------- + * Stat functions + * -------------------------------------------------------------- + */ + + @CompileStatic String stat_stddevpop(cx) { + String.format('STDDEV_POP(%s)', ___resolveInP(cx)) + } + + @CompileStatic String stat_stddevsamp(cx) { + String.format('STDDEV_SAMP(%s)', ___resolveInP(cx)) + } + + @CompileStatic String stat_varpop(cx) { + String.format('VAR_POP(%s)', ___resolveInP(cx)) + } + + @CompileStatic String stat_varsamp(cx) { + String.format('VAR_SAMP(%s)', ___resolveInP(cx)) + } + /** * Returns the sum value of given column. * diff --git a/core/src/main/groovy/com/virtusa/gto/nyql/traits/FunctionTraits.groovy b/core/src/main/groovy/com/virtusa/gto/nyql/traits/FunctionTraits.groovy index 6ce768c..4d8da2c 100644 --- a/core/src/main/groovy/com/virtusa/gto/nyql/traits/FunctionTraits.groovy +++ b/core/src/main/groovy/com/virtusa/gto/nyql/traits/FunctionTraits.groovy @@ -32,6 +32,12 @@ trait FunctionTraits { @CompileStatic FunctionColumn AVG(Object column) { fColumn(column, 'avg') } @CompileStatic FunctionColumn SUM(Object column) { fColumn(column, 'sum') } + // stats functions + @CompileStatic FunctionColumn STDDEV_POP(Object expr) { fColumn(expr, 'stat_stddevpop') } + @CompileStatic FunctionColumn STDDEV_SAMP(Object expr) { fColumn(expr, 'stat_stddevsamp') } + @CompileStatic FunctionColumn VAR_POP(Object expr) { fColumn(expr, 'stat_varpop') } + @CompileStatic FunctionColumn VAR_SAMP(Object expr) { fColumn(expr, 'stat_varsamp') } + @CompileStatic FunctionColumn LCASE(Object column) { fColumn(column, 'lcase') } @CompileStatic FunctionColumn UCASE(Object column) { fColumn(column, 'ucase') } @CompileStatic FunctionColumn TRIM(Object column) { fColumn(column, 'trim') } diff --git a/docs/functions.md b/docs/functions.md index c60a1b1..e59916d 100644 --- a/docs/functions.md +++ b/docs/functions.md @@ -145,6 +145,17 @@ Album.rating + 1 AS newRating |TAN (_value_ ) | Returns the tangent for the given value. | |TRUNCATE(_column, d_ ) | Truncate the given decimal number to _d_ decimal places. This does not _round_ the number. Negative _d_ values will truncate before the decimal point. | + +### Stats Functions + +| Function | Details | +|---|---| +|STDDEV_POP (_column_ ) | Population standard deviation of values in given column. | +|STDDEV_SAMP (_column_ ) | Sample standard deviation of values in given column. | +|VAR_POP (_column_ ) | Population variance of values in given column. | +|VAR_SAMP (_column_ ) | Sample variance of values in given column. | + + ### Casting Functions | Function | Details | diff --git a/tests/scripts/projection/func2_projection.groovy b/tests/scripts/projection/func2_projection.groovy index 6a511dc..98cdc61 100644 --- a/tests/scripts/projection/func2_projection.groovy +++ b/tests/scripts/projection/func2_projection.groovy @@ -157,4 +157,15 @@ mssql: "SELECT ROUND(l.v, 2, 1) FROM `Logs` l", pg: "SELECT TRUNC(l.v, 2) FROM `Logs` l" ], + + $DSL.select { + TARGET (Stats.alias('s')) + FETCH (STDDEV_POP(s.income), STDDEV_SAMP(s.income), VAR_POP(s.income), VAR_SAMP(s.income)) + GROUP_BY (s.year) + }, + [ + mysql: "SELECT STDDEV_POP(s.income), STDDEV_SAMP(s.income), VAR_POP(s.income), VAR_SAMP(s.income) FROM `Stats` s GROUP BY s.year", + mssql: "SELECT STDEVP(s.income), STDEV(s.income), VARP(s.income), VAR(s.income) FROM `Stats` s GROUP BY s.year", + pg: "SELECT STDDEV_POP(s.income), STDDEV_SAMP(s.income), VAR_POP(s.income), VAR_SAMP(s.income) FROM `Stats` s GROUP BY s.year" + ], ] \ No newline at end of file diff --git a/translators/mssql/src/main/groovy/com/virtusa/gto/nyql/db/mssql/MSSqlFunctions.groovy b/translators/mssql/src/main/groovy/com/virtusa/gto/nyql/db/mssql/MSSqlFunctions.groovy index 31a7d3e..6473e87 100644 --- a/translators/mssql/src/main/groovy/com/virtusa/gto/nyql/db/mssql/MSSqlFunctions.groovy +++ b/translators/mssql/src/main/groovy/com/virtusa/gto/nyql/db/mssql/MSSqlFunctions.groovy @@ -20,6 +20,26 @@ abstract class MSSqlFunctions extends AbstractSQLTranslator implements QFunction super(theOptions) } + @Override + String stat_stddevpop(Object cx) { + return String.format('STDEVP(%s)', ___resolveInP(cx)) + } + + @Override + String stat_stddevsamp(Object cx) { + return String.format('STDEV(%s)', ___resolveInP(cx)) + } + + @Override + String stat_varpop(Object cx) { + return String.format('VARP(%s)', ___resolveInP(cx)) + } + + @Override + String stat_varsamp(Object cx) { + return String.format('VAR(%s)', ___resolveInP(cx)) + } + @CompileStatic @Override String truncate(Object cx) {