95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
import abc
|
|
|
|
from pypika.terms import (
|
|
Field,
|
|
Function,
|
|
Term,
|
|
)
|
|
from pypika.utils import format_alias_sql
|
|
|
|
|
|
class Array(Term):
|
|
def __init__(self, values: list, converter_cls=None, converter_options: dict = None, alias: str = None):
|
|
super().__init__(alias)
|
|
self._values = values
|
|
self._converter_cls = converter_cls
|
|
self._converter_options = converter_options or dict()
|
|
|
|
def get_sql(self):
|
|
if self._converter_cls:
|
|
converted = []
|
|
for value in self._values:
|
|
converter = self._converter_cls(value, **self._converter_options)
|
|
converted.append(converter.get_sql())
|
|
sql = "".join(["[", ",".join(converted), "]"])
|
|
|
|
else:
|
|
sql = str(self._values)
|
|
|
|
return format_alias_sql(sql, self.alias)
|
|
|
|
|
|
class HasAny(Function):
|
|
def __init__(
|
|
self,
|
|
left_array: Array or Field,
|
|
right_array: Array or Field,
|
|
alias: str = None,
|
|
schema: str = None,
|
|
):
|
|
self._left_array = left_array
|
|
self._right_array = right_array
|
|
self.alias = alias
|
|
self.schema = schema
|
|
self.args = ()
|
|
self.name = "hasAny"
|
|
|
|
def get_sql(self, with_alias=False, with_namespace=False, quote_char=None, dialect=None, **kwargs):
|
|
left = self._left_array.get_sql()
|
|
right = self._right_array.get_sql()
|
|
sql = "{name}({left},{right})".format(
|
|
name=self.name,
|
|
left='"%s"' % left if isinstance(self._left_array, Field) else left,
|
|
right='"%s"' % right if isinstance(self._right_array, Field) else right,
|
|
)
|
|
return format_alias_sql(sql, self.alias, **kwargs)
|
|
|
|
|
|
class _AbstractArrayFunction(Function, metaclass=abc.ABCMeta):
|
|
def __init__(self, array: Array or Field, alias: str = None, schema: str = None):
|
|
self.schema = schema
|
|
self.alias = alias
|
|
self.name = self.clickhouse_function()
|
|
self._array = array
|
|
|
|
def get_sql(self, with_namespace=False, quote_char=None, dialect=None, **kwargs):
|
|
array = self._array.get_sql()
|
|
sql = "{name}({array})".format(
|
|
name=self.name,
|
|
array='"%s"' % array if isinstance(self._array, Field) else array,
|
|
)
|
|
return format_alias_sql(sql, self.alias, **kwargs)
|
|
|
|
@classmethod
|
|
@abc.abstractmethod
|
|
def clickhouse_function(cls) -> str:
|
|
pass
|
|
|
|
|
|
class NotEmpty(_AbstractArrayFunction):
|
|
@classmethod
|
|
def clickhouse_function(cls) -> str:
|
|
return "notEmpty"
|
|
|
|
|
|
class Empty(_AbstractArrayFunction):
|
|
@classmethod
|
|
def clickhouse_function(cls) -> str:
|
|
return "empty"
|
|
|
|
|
|
class Length(_AbstractArrayFunction):
|
|
@classmethod
|
|
def clickhouse_function(cls) -> str:
|
|
return "length"
|