jet/postgres/functions.go

392 lines
13 KiB
Go
Raw Normal View History

2019-08-03 14:10:47 +02:00
package postgres
import (
"github.com/go-jet/jet/v2/internal/jet"
)
2019-08-03 14:10:47 +02:00
// This functions can be used, instead of its method counterparts, to have a better indentation of a complex condition
// in the Go code and in the generated SQL.
var (
// AND function adds AND operator between expressions.
AND = jet.AND
// OR function adds OR operator between expressions.
OR = jet.OR
)
2019-08-17 14:49:35 +02:00
// ROW is construct one table row from list of expressions.
2019-08-03 14:10:47 +02:00
var ROW = jet.ROW
// ------------------ Mathematical functions ---------------//
2019-08-17 14:49:35 +02:00
// ABSf calculates absolute value from float expression
2019-08-03 14:10:47 +02:00
var ABSf = jet.ABSf
2019-08-17 14:49:35 +02:00
// ABSi calculates absolute value from int expression
2019-08-03 14:10:47 +02:00
var ABSi = jet.ABSi
2019-08-17 14:49:35 +02:00
// POW calculates power of base with exponent
2019-08-03 14:10:47 +02:00
var POW = jet.POW
2019-08-17 14:49:35 +02:00
// POWER calculates power of base with exponent
2019-08-03 14:10:47 +02:00
var POWER = jet.POWER
2019-08-17 14:49:35 +02:00
// SQRT calculates square root of numeric expression
2019-08-03 14:10:47 +02:00
var SQRT = jet.SQRT
2019-08-17 14:49:35 +02:00
// CBRT calculates cube root of numeric expression
2019-08-03 14:10:47 +02:00
var CBRT = jet.CBRT
2019-08-17 14:49:35 +02:00
// CEIL calculates ceil of float expression
2019-08-03 14:10:47 +02:00
var CEIL = jet.CEIL
2019-08-17 14:49:35 +02:00
// FLOOR calculates floor of float expression
2019-08-03 14:10:47 +02:00
var FLOOR = jet.FLOOR
2019-08-17 14:49:35 +02:00
// ROUND calculates round of a float expressions with optional precision
2019-08-03 14:10:47 +02:00
var ROUND = jet.ROUND
2019-08-17 14:49:35 +02:00
// SIGN returns sign of float expression
2019-08-03 14:10:47 +02:00
var SIGN = jet.SIGN
2019-08-17 14:49:35 +02:00
// TRUNC calculates trunc of float expression with optional precision
2019-08-03 14:10:47 +02:00
var TRUNC = jet.TRUNC
2019-08-17 14:49:35 +02:00
// LN calculates natural algorithm of float expression
2019-08-03 14:10:47 +02:00
var LN = jet.LN
2019-08-17 14:49:35 +02:00
// LOG calculates logarithm of float expression
2019-08-03 14:10:47 +02:00
var LOG = jet.LOG
// ----------------- Aggregate functions -------------------//
2019-08-17 14:49:35 +02:00
// AVG is aggregate function used to calculate avg value from numeric expression
2019-08-03 14:10:47 +02:00
var AVG = jet.AVG
2019-08-17 14:49:35 +02:00
// BIT_AND is aggregate function used to calculates the bitwise AND of all non-null input values, or null if none.
2019-08-03 14:10:47 +02:00
var BIT_AND = jet.BIT_AND
2019-08-17 14:49:35 +02:00
// BIT_OR is aggregate function used to calculates the bitwise OR of all non-null input values, or null if none.
2019-08-03 14:10:47 +02:00
var BIT_OR = jet.BIT_OR
2019-08-17 14:49:35 +02:00
// BOOL_AND is aggregate function. Returns true if all input values are true, otherwise false
2019-08-03 14:10:47 +02:00
var BOOL_AND = jet.BOOL_AND
2019-08-17 14:49:35 +02:00
// BOOL_OR is aggregate function. Returns true if at least one input value is true, otherwise false
2019-08-03 14:10:47 +02:00
var BOOL_OR = jet.BOOL_OR
2019-08-17 14:49:35 +02:00
// COUNT is aggregate function. Returns number of input rows for which the value of expression is not null.
2019-08-03 14:10:47 +02:00
var COUNT = jet.COUNT
2019-08-17 14:49:35 +02:00
// EVERY is aggregate function. Returns true if all input values are true, otherwise false
2019-08-03 14:10:47 +02:00
var EVERY = jet.EVERY
2019-08-17 14:49:35 +02:00
2019-10-18 10:09:56 +02:00
// MAX is aggregate function. Returns maximum value of expression across all input values
var MAX = jet.MAX
2019-08-17 14:49:35 +02:00
// MAXf is aggregate function. Returns maximum value of float expression across all input values
2019-08-03 14:10:47 +02:00
var MAXf = jet.MAXf
2019-08-17 14:49:35 +02:00
// MAXi is aggregate function. Returns maximum value of int expression across all input values
2019-08-03 14:10:47 +02:00
var MAXi = jet.MAXi
2019-08-17 14:49:35 +02:00
// MIN is aggregate function. Returns minimum value of expression across all input values.
var MIN = jet.MIN
2019-08-17 14:49:35 +02:00
// MINf is aggregate function. Returns minimum value of float expression across all input values
2019-08-03 14:10:47 +02:00
var MINf = jet.MINf
2019-08-17 14:49:35 +02:00
// MINi is aggregate function. Returns minimum value of int expression across all input values
2019-08-03 14:10:47 +02:00
var MINi = jet.MINi
2019-08-17 14:49:35 +02:00
// SUM is aggregate function. Returns sum of all expressions
var SUM = jet.SUM
2019-08-17 14:49:35 +02:00
// SUMf is aggregate function. Returns sum of expression across all float expressions
2019-08-03 14:10:47 +02:00
var SUMf = jet.SUMf
2019-08-17 14:49:35 +02:00
// SUMi is aggregate function. Returns sum of expression across all integer expression.
2019-08-03 14:10:47 +02:00
var SUMi = jet.SUMi
// -------------------- Window functions -----------------------//
// ROW_NUMBER returns number of the current row within its partition, counting from 1
var ROW_NUMBER = jet.ROW_NUMBER
// RANK of the current row with gaps; same as row_number of its first peer
var RANK = jet.RANK
// DENSE_RANK returns rank of the current row without gaps; this function counts peer groups
var DENSE_RANK = jet.DENSE_RANK
// PERCENT_RANK calculates relative rank of the current row: (rank - 1) / (total partition rows - 1)
var PERCENT_RANK = jet.PERCENT_RANK
// CUME_DIST calculates cumulative distribution: (number of partition rows preceding or peer with current row) / total partition rows
var CUME_DIST = jet.CUME_DIST
// NTILE returns integer ranging from 1 to the argument value, dividing the partition as equally as possible
var NTILE = jet.NTILE
// LAG returns value evaluated at the row that is offset rows before the current row within the partition;
// if there is no such row, instead return default (which must be of the same type as value).
// Both offset and default are evaluated with respect to the current row.
// If omitted, offset defaults to 1 and default to null
var LAG = jet.LAG
// LEAD returns value evaluated at the row that is offset rows after the current row within the partition;
// if there is no such row, instead return default (which must be of the same type as value).
// Both offset and default are evaluated with respect to the current row.
// If omitted, offset defaults to 1 and default to null
var LEAD = jet.LEAD
// FIRST_VALUE returns value evaluated at the row that is the first row of the window frame
var FIRST_VALUE = jet.FIRST_VALUE
// LAST_VALUE returns value evaluated at the row that is the last row of the window frame
var LAST_VALUE = jet.LAST_VALUE
// NTH_VALUE returns value evaluated at the row that is the nth row of the window frame (counting from 1); null if no such row
var NTH_VALUE = jet.NTH_VALUE
2019-08-03 14:10:47 +02:00
//--------------------- String functions ------------------//
2019-08-17 14:49:35 +02:00
// BIT_LENGTH returns number of bits in string expression
2019-08-03 14:10:47 +02:00
var BIT_LENGTH = jet.BIT_LENGTH
2019-08-17 14:49:35 +02:00
// CHAR_LENGTH returns number of characters in string expression
2019-08-03 14:10:47 +02:00
var CHAR_LENGTH = jet.CHAR_LENGTH
2019-08-17 14:49:35 +02:00
// OCTET_LENGTH returns number of bytes in string expression
2019-08-03 14:10:47 +02:00
var OCTET_LENGTH = jet.OCTET_LENGTH
2019-08-17 14:49:35 +02:00
// LOWER returns string expression in lower case
2019-08-03 14:10:47 +02:00
var LOWER = jet.LOWER
2019-08-17 14:49:35 +02:00
// UPPER returns string expression in upper case
2019-08-03 14:10:47 +02:00
var UPPER = jet.UPPER
2019-08-17 14:49:35 +02:00
// BTRIM removes the longest string consisting only of characters
// in characters (a space by default) from the start and end of string
2019-08-03 14:10:47 +02:00
var BTRIM = jet.BTRIM
2019-08-17 14:49:35 +02:00
// LTRIM removes the longest string containing only characters
// from characters (a space by default) from the start of string
2019-08-03 14:10:47 +02:00
var LTRIM = jet.LTRIM
2019-08-17 14:49:35 +02:00
// RTRIM removes the longest string containing only characters
// from characters (a space by default) from the end of string
2019-08-03 14:10:47 +02:00
var RTRIM = jet.RTRIM
2019-08-17 14:49:35 +02:00
// CHR returns character with the given code.
2019-08-03 14:10:47 +02:00
var CHR = jet.CHR
2019-08-17 14:49:35 +02:00
// CONCAT adds two or more expressions together
var CONCAT = func(expressions ...Expression) StringExpression {
2019-08-11 09:52:02 +02:00
return jet.CONCAT(explicitLiteralCasts(expressions...)...)
}
2019-08-17 14:49:35 +02:00
// CONCAT_WS adds two or more expressions together with a separator.
2019-08-14 10:11:43 +02:00
func CONCAT_WS(separator Expression, expressions ...Expression) StringExpression {
return jet.CONCAT_WS(explicitLiteralCast(separator), explicitLiteralCasts(expressions...)...)
}
2019-08-17 14:49:35 +02:00
// CONVERT converts string to dest_encoding. The original encoding is
// specified by src_encoding. The string must be valid in this encoding.
2019-08-03 14:10:47 +02:00
var CONVERT = jet.CONVERT
2019-08-17 14:49:35 +02:00
// CONVERT_FROM converts string to the database encoding. The original
// encoding is specified by src_encoding. The string must be valid in this encoding.
2019-08-03 14:10:47 +02:00
var CONVERT_FROM = jet.CONVERT_FROM
2019-08-17 14:49:35 +02:00
// CONVERT_TO converts string to dest_encoding.
2019-08-03 14:10:47 +02:00
var CONVERT_TO = jet.CONVERT_TO
2019-08-17 14:49:35 +02:00
// ENCODE encodes binary data into a textual representation.
// Supported formats are: base64, hex, escape. escape converts zero bytes and
// high-bit-set bytes to octal sequences (\nnn) and doubles backslashes.
2019-08-03 14:10:47 +02:00
var ENCODE = jet.ENCODE
2019-08-17 14:49:35 +02:00
// DECODE decodes binary data from textual representation in string.
// Options for format are same as in encode.
2019-08-03 14:10:47 +02:00
var DECODE = jet.DECODE
2019-08-17 14:49:35 +02:00
// FORMAT formats a number to a format like "#,###,###.##", rounded to a specified number of decimal places, then it returns the result as a string.
func FORMAT(formatStr StringExpression, formatArgs ...Expression) StringExpression {
2019-08-11 09:52:02 +02:00
return jet.FORMAT(formatStr, explicitLiteralCasts(formatArgs...)...)
}
2019-08-17 14:49:35 +02:00
// INITCAP converts the first letter of each word to upper case
// and the rest to lower case. Words are sequences of alphanumeric
// characters separated by non-alphanumeric characters.
2019-08-03 14:10:47 +02:00
var INITCAP = jet.INITCAP
2019-08-17 14:49:35 +02:00
// LEFT returns first n characters in the string.
// When n is negative, return all but last |n| characters.
2019-08-03 14:10:47 +02:00
var LEFT = jet.LEFT
2019-08-17 14:49:35 +02:00
// RIGHT returns last n characters in the string.
// When n is negative, return all but first |n| characters.
2019-08-03 14:10:47 +02:00
var RIGHT = jet.RIGHT
2019-08-17 14:49:35 +02:00
// LENGTH returns number of characters in string with a given encoding
2019-08-03 14:10:47 +02:00
var LENGTH = jet.LENGTH
2019-08-17 14:49:35 +02:00
// LPAD fills up the string to length length by prepending the characters
// fill (a space by default). If the string is already longer than length
// then it is truncated (on the right).
2019-08-03 14:10:47 +02:00
var LPAD = jet.LPAD
2019-08-17 14:49:35 +02:00
// RPAD fills up the string to length length by appending the characters
// fill (a space by default). If the string is already longer than length then it is truncated.
2019-08-03 14:10:47 +02:00
var RPAD = jet.RPAD
2019-08-17 14:49:35 +02:00
// MD5 calculates the MD5 hash of string, returning the result in hexadecimal
2019-08-03 14:10:47 +02:00
var MD5 = jet.MD5
2019-08-17 14:49:35 +02:00
// REPEAT repeats string the specified number of times
2019-08-03 14:10:47 +02:00
var REPEAT = jet.REPEAT
2019-08-17 14:49:35 +02:00
// REPLACE replaces all occurrences in string of substring from with substring to
2019-08-03 14:10:47 +02:00
var REPLACE = jet.REPLACE
2019-08-17 14:49:35 +02:00
// REVERSE returns reversed string.
2019-08-03 14:10:47 +02:00
var REVERSE = jet.REVERSE
2019-08-17 14:49:35 +02:00
// STRPOS returns location of specified substring (same as position(substring in string),
// but note the reversed argument order)
2019-08-03 14:10:47 +02:00
var STRPOS = jet.STRPOS
2019-08-17 14:49:35 +02:00
// SUBSTR extracts substring
2019-08-03 14:10:47 +02:00
var SUBSTR = jet.SUBSTR
2019-08-17 14:49:35 +02:00
// TO_ASCII convert string to ASCII from another encoding
2019-08-03 14:10:47 +02:00
var TO_ASCII = jet.TO_ASCII
2019-08-17 14:49:35 +02:00
// TO_HEX converts number to its equivalent hexadecimal representation
2019-08-03 14:10:47 +02:00
var TO_HEX = jet.TO_HEX
//----------Data Type Formatting Functions ----------------------//
2019-08-17 14:49:35 +02:00
// TO_CHAR converts expression to string with format
2019-08-03 14:10:47 +02:00
var TO_CHAR = jet.TO_CHAR
2019-08-17 14:49:35 +02:00
// TO_DATE converts string to date using format
2019-08-03 14:10:47 +02:00
var TO_DATE = jet.TO_DATE
2019-08-17 14:49:35 +02:00
// TO_NUMBER converts string to numeric using format
2019-08-03 14:10:47 +02:00
var TO_NUMBER = jet.TO_NUMBER
2019-08-17 14:49:35 +02:00
// TO_TIMESTAMP converts string to time stamp with time zone using format
2019-08-03 14:10:47 +02:00
var TO_TIMESTAMP = jet.TO_TIMESTAMP
//----------------- Date/Time Functions and Operators ------------//
// Additional time unit types for EXTRACT function
const (
DOW unit = MILLENNIUM + 1 + iota
DOY
EPOCH
ISODOW
ISOYEAR
JULIAN
QUARTER
TIMEZONE
TIMEZONE_HOUR
TIMEZONE_MINUTE
)
// EXTRACT function retrieves subfields such as year or hour from date/time values
// EXTRACT(DAY, User.CreatedAt)
func EXTRACT(field unit, from Expression) FloatExpression {
return FloatExp(jet.EXTRACT(unitToString(field), from))
}
2019-08-17 14:49:35 +02:00
// CURRENT_DATE returns current date
2019-08-03 14:10:47 +02:00
var CURRENT_DATE = jet.CURRENT_DATE
2019-08-17 14:49:35 +02:00
// CURRENT_TIME returns current time with time zone
2019-08-03 14:10:47 +02:00
var CURRENT_TIME = jet.CURRENT_TIME
2019-08-17 14:49:35 +02:00
// CURRENT_TIMESTAMP returns current timestamp with time zone
2019-08-03 14:10:47 +02:00
var CURRENT_TIMESTAMP = jet.CURRENT_TIMESTAMP
2019-08-17 14:49:35 +02:00
// LOCALTIME returns local time of day using optional precision
2019-08-03 14:10:47 +02:00
var LOCALTIME = jet.LOCALTIME
2019-08-17 14:49:35 +02:00
// LOCALTIMESTAMP returns current date and time using optional precision
2019-08-03 14:10:47 +02:00
var LOCALTIMESTAMP = jet.LOCALTIMESTAMP
2019-08-17 14:49:35 +02:00
// NOW returns current date and time
2019-08-03 14:10:47 +02:00
var NOW = jet.NOW
// --------------- Conditional Expressions Functions -------------//
2019-08-17 14:49:35 +02:00
// COALESCE function returns the first of its arguments that is not null.
2019-08-03 14:10:47 +02:00
var COALESCE = jet.COALESCE
2019-08-17 14:49:35 +02:00
// NULLIF function returns a null value if value1 equals value2; otherwise it returns value1.
2019-08-03 14:10:47 +02:00
var NULLIF = jet.NULLIF
2019-08-17 14:49:35 +02:00
// GREATEST selects the largest value from a list of expressions
2019-08-03 14:10:47 +02:00
var GREATEST = jet.GREATEST
2019-08-17 14:49:35 +02:00
// LEAST selects the smallest value from a list of expressions
2019-08-03 14:10:47 +02:00
var LEAST = jet.LEAST
2019-08-17 14:49:35 +02:00
// EXISTS checks for existence of the rows in subQuery
2019-08-03 14:10:47 +02:00
var EXISTS = jet.EXISTS
2019-08-17 14:49:35 +02:00
// CASE create CASE operator with optional list of expressions
2019-08-03 14:10:47 +02:00
var CASE = jet.CASE
2019-08-11 09:52:02 +02:00
func explicitLiteralCasts(expressions ...Expression) []jet.Expression {
ret := []jet.Expression{}
for _, exp := range expressions {
2019-08-11 09:52:02 +02:00
ret = append(ret, explicitLiteralCast(exp))
}
return ret
}
2019-08-11 09:52:02 +02:00
func explicitLiteralCast(expresion Expression) jet.Expression {
if _, ok := expresion.(jet.LiteralExpression); !ok {
return expresion
}
switch expresion.(type) {
case jet.BoolExpression:
return CAST(expresion).AS_BOOL()
case jet.IntegerExpression:
return CAST(expresion).AS_INTEGER()
case jet.FloatExpression:
return CAST(expresion).AS_NUMERIC()
case jet.StringExpression:
return CAST(expresion).AS_TEXT()
}
return expresion
}
// MODE computes the most frequent value of the aggregated argument
var MODE = jet.MODE
// PERCENTILE_CONT computes a value corresponding to the specified fraction within the ordered set of
// aggregated argument values. This will interpolate between adjacent input items if needed.
func PERCENTILE_CONT(fraction FloatExpression) *jet.OrderSetAggregateFunc {
return jet.PERCENTILE_CONT(castFloatLiteral(fraction))
}
// PERCENTILE_DISC computes the first value within the ordered set of aggregated argument values whose position
// in the ordering equals or exceeds the specified fraction. The aggregated argument must be of a sortable type.
func PERCENTILE_DISC(fraction FloatExpression) *jet.OrderSetAggregateFunc {
return jet.PERCENTILE_DISC(castFloatLiteral(fraction))
}
func castFloatLiteral(fraction FloatExpression) FloatExpression {
if _, ok := fraction.(jet.LiteralExpression); ok {
return CAST(fraction).AS_DOUBLE() // to make postgres aware of the type
}
return fraction
}