158 lines
3.0 KiB
Python
158 lines
3.0 KiB
Python
from enum import Enum
|
|
from typing import Any
|
|
|
|
__author__ = "Timothy Heys"
|
|
__email__ = "theys@kayak.com"
|
|
|
|
|
|
class Arithmetic(Enum):
|
|
add = "+"
|
|
sub = "-"
|
|
mul = "*"
|
|
div = "/"
|
|
lshift = "<<"
|
|
rshift = ">>"
|
|
|
|
|
|
class Comparator(Enum):
|
|
pass
|
|
|
|
|
|
class Equality(Comparator):
|
|
eq = "="
|
|
ne = "<>"
|
|
gt = ">"
|
|
gte = ">="
|
|
lt = "<"
|
|
lte = "<="
|
|
|
|
|
|
class Matching(Comparator):
|
|
not_like = " NOT LIKE "
|
|
like = " LIKE "
|
|
not_ilike = " NOT ILIKE "
|
|
ilike = " ILIKE "
|
|
rlike = " RLIKE "
|
|
regex = " REGEX "
|
|
regexp = " REGEXP "
|
|
bin_regex = " REGEX BINARY "
|
|
as_of = " AS OF "
|
|
glob = " GLOB "
|
|
|
|
|
|
class Boolean(Comparator):
|
|
and_ = "AND"
|
|
or_ = "OR"
|
|
xor_ = "XOR"
|
|
true = "TRUE"
|
|
false = "FALSE"
|
|
|
|
|
|
class Order(Enum):
|
|
asc = "ASC"
|
|
desc = "DESC"
|
|
|
|
|
|
class JoinType(Enum):
|
|
inner = ""
|
|
left = "LEFT"
|
|
right = "RIGHT"
|
|
outer = "FULL OUTER"
|
|
left_outer = "LEFT OUTER"
|
|
right_outer = "RIGHT OUTER"
|
|
full_outer = "FULL OUTER"
|
|
cross = "CROSS"
|
|
hash = "HASH"
|
|
|
|
|
|
class ReferenceOption(Enum):
|
|
cascade = "CASCADE"
|
|
no_action = "NO ACTION"
|
|
restrict = "RESTRICT"
|
|
set_null = "SET NULL"
|
|
set_default = "SET DEFAULT"
|
|
|
|
|
|
class SetOperation(Enum):
|
|
union = "UNION"
|
|
union_all = "UNION ALL"
|
|
intersect = "INTERSECT"
|
|
except_of = "EXCEPT"
|
|
minus = "MINUS"
|
|
|
|
|
|
class DatePart(Enum):
|
|
year = "YEAR"
|
|
quarter = "QUARTER"
|
|
month = "MONTH"
|
|
week = "WEEK"
|
|
day = "DAY"
|
|
hour = "HOUR"
|
|
minute = "MINUTE"
|
|
second = "SECOND"
|
|
microsecond = "MICROSECOND"
|
|
|
|
|
|
class SqlType:
|
|
def __init__(self, name: str) -> None:
|
|
self.name = name
|
|
|
|
def __call__(self, length: int) -> "SqlTypeLength":
|
|
return SqlTypeLength(self.name, length)
|
|
|
|
def get_sql(self, **kwargs: Any) -> str:
|
|
return "{name}".format(name=self.name)
|
|
|
|
|
|
class SqlTypeLength:
|
|
def __init__(self, name: str, length: int) -> None:
|
|
self.name = name
|
|
self.length = length
|
|
|
|
def get_sql(self, **kwargs: Any) -> str:
|
|
return "{name}({length})".format(name=self.name, length=self.length)
|
|
|
|
|
|
class SqlTypes:
|
|
BOOLEAN = "BOOLEAN"
|
|
INTEGER = "INTEGER"
|
|
FLOAT = "FLOAT"
|
|
NUMERIC = "NUMERIC"
|
|
SIGNED = "SIGNED"
|
|
UNSIGNED = "UNSIGNED"
|
|
|
|
DATE = "DATE"
|
|
TIME = "TIME"
|
|
TIMESTAMP = "TIMESTAMP"
|
|
|
|
CHAR = SqlType("CHAR")
|
|
VARCHAR = SqlType("VARCHAR")
|
|
LONG_VARCHAR = SqlType("LONG VARCHAR")
|
|
BINARY = SqlType("BINARY")
|
|
VARBINARY = SqlType("VARBINARY")
|
|
LONG_VARBINARY = SqlType("LONG VARBINARY")
|
|
|
|
|
|
class Dialects(Enum):
|
|
VERTICA = "vertica"
|
|
CLICKHOUSE = "clickhouse"
|
|
ORACLE = "oracle"
|
|
MSSQL = "mssql"
|
|
MYSQL = "mysql"
|
|
POSTGRESQL = "postgressql"
|
|
REDSHIFT = "redshift"
|
|
SQLLITE = "sqllite"
|
|
SNOWFLAKE = "snowflake"
|
|
|
|
|
|
class JSONOperators(Enum):
|
|
HAS_KEY = "?"
|
|
CONTAINS = "@>"
|
|
CONTAINED_BY = "<@"
|
|
HAS_KEYS = "?&"
|
|
HAS_ANY_KEYS = "?|"
|
|
GET_JSON_VALUE = "->"
|
|
GET_TEXT_VALUE = "->>"
|
|
GET_PATH_JSON_VALUE = "#>"
|
|
GET_PATH_TEXT_VALUE = "#>>"
|