diff --git a/ibis/mapd/api.py b/ibis/mapd/api.py index ebb7486e6d8e..e42bb8ce355c 100644 --- a/ibis/mapd/api.py +++ b/ibis/mapd/api.py @@ -1,6 +1,6 @@ from ibis.config import options +from ibis.mapd.compiler import dialect, compiles, rewrites from ibis.mapd.client import MapDClient -from ibis.mapd.compiler import dialect import ibis.common as com diff --git a/ibis/mapd/client.py b/ibis/mapd/client.py index 60ac8951dfec..0c615bd41a32 100644 --- a/ibis/mapd/client.py +++ b/ibis/mapd/client.py @@ -1,6 +1,6 @@ from ibis.compat import parse_version from ibis.client import Database, Query, SQLClient -from ibis.mapd import compiler as comp +from ibis.mapd.compiler import MapDDialect, build_ast from ibis.util import log from pymapd.cursor import Cursor @@ -126,7 +126,7 @@ class MapDClient(SQLClient): """ database_class = Database sync_query = MapDQuery - dialect = comp.MapDDialect + dialect = MapDDialect def __init__( self, uri: str=None, user: str=None, password: str=None, @@ -177,7 +177,7 @@ def _build_ast(self, expr, context): :param context: :return: """ - result = comp.build_ast(expr, context) + result = build_ast(expr, context) return result def _fully_qualified_name(self, name, database): diff --git a/ibis/mapd/compiler.py b/ibis/mapd/compiler.py index 01fb85e0f78e..55174593d076 100644 --- a/ibis/mapd/compiler.py +++ b/ibis/mapd/compiler.py @@ -3,9 +3,11 @@ import ibis.common as com import ibis.util as util import ibis.expr.operations as ops -import ibis.sql.compiler as comp +import ibis.sql.compiler as compiles -from .operations import _operation_registry, _name_expr +from .operations import ( + _operation_registry, _name_expr, Sin +) def build_ast(expr, context): @@ -25,7 +27,7 @@ def to_sql(expr, context=None): return query.compile() -class MapDSelectBuilder(comp.SelectBuilder): +class MapDSelectBuilder(compiles.SelectBuilder): """ """ @@ -37,14 +39,14 @@ def _convert_group_by(self, exprs): return exprs -class MapDQueryBuilder(comp.QueryBuilder): +class MapDQueryBuilder(compiles.QueryBuilder): """ """ select_builder = MapDSelectBuilder -class MapDQueryContext(comp.QueryContext): +class MapDQueryContext(compiles.QueryContext): """ """ @@ -52,7 +54,7 @@ def _to_sql(self, expr, ctx): return to_sql(expr, context=ctx) -class MapDSelect(comp.Select): +class MapDSelect(compiles.Select): """ """ @@ -102,7 +104,7 @@ def format_limit(self): return buf.getvalue() -class MapDTableSetFormatter(comp.TableSetFormatter): +class MapDTableSetFormatter(compiles.TableSetFormatter): """ """ @@ -160,7 +162,7 @@ def _quote_identifier(self, name): return name -class MapDExprTranslator(comp.ExprTranslator): +class MapDExprTranslator(compiles.ExprTranslator): """ """ @@ -170,8 +172,19 @@ class MapDExprTranslator(comp.ExprTranslator): def name(self, translated, name, force=True): return _name_expr(translated, name) + @classmethod + def compiles(cls, klass, f=None): + def decorator(f): + cls._registry[klass] = f -class MapDDialect(comp.Dialect): + if f is None: + return decorator + else: + decorator(f) + return f + + +class MapDDialect(compiles.Dialect): """ """ @@ -183,7 +196,11 @@ class MapDDialect(comp.Dialect): rewrites = MapDExprTranslator.rewrites -@rewrites(ops.FloorDivide) -def _floor_divide(expr): - left, right = expr.op().args - return left.div(right).floor() +@compiles(Sin) +def compile_sin(translator, expr): + # pull out the arguments to the expression + arg, = expr.op().args + + # compile the argument + compiled_arg = translator.translate(arg) + return 'sin(%s)' % compiled_arg diff --git a/ibis/mapd/identifiers.py b/ibis/mapd/identifiers.py index 9d12557c3924..25f479118e56 100644 --- a/ibis/mapd/identifiers.py +++ b/ibis/mapd/identifiers.py @@ -250,7 +250,11 @@ 'varchar', }) -_identifiers = _ddl | _dml | _data_type +_ibis = frozenset({ + 'literal' +}) + +_identifiers = _ddl | _dml | _data_type | _ibis def quote_identifier(name, quotechar='"', force=False): diff --git a/ibis/mapd/operations.py b/ibis/mapd/operations.py index 11ba609a71d8..b3b0ba318b9e 100644 --- a/ibis/mapd/operations.py +++ b/ibis/mapd/operations.py @@ -1,5 +1,6 @@ from six import StringIO from datetime import date, datetime +from ibis.mapd.identifiers import quote_identifier import ibis.common as com import ibis.util as util @@ -8,7 +9,7 @@ import ibis.expr.operations as ops import ibis.sql.transforms as transforms -from ibis.mapd.identifiers import quote_identifier +from ibis.expr.types import NumericValue def _cast(translator, expr): @@ -551,6 +552,8 @@ class Cot(TrigonometryUnary): class Sin(TrigonometryUnary): """Returns the sine of x""" + def output_type(self): + return ops.dt.float64.scalar_type() class Tan(TrigonometryUnary): @@ -726,7 +729,7 @@ class StringLengthBytes(ops.UnaryOp): } _agg_ops = { - # this function receive a x and e parameter + # TODO: this function receive a x and e parameter ApproxCountDistinct: agg('approx_count_cistinct'), ops.Count: agg('count'), ops.CountDistinct: agg('count'), # this function receive a x parameter @@ -770,3 +773,10 @@ class StringLengthBytes(ops.UnaryOp): _operation_registry.update(_date_ops) _operation_registry.update(_agg_ops) # _operation_registry.update(_unsupported_ops) + + +def sin(numeric_value): + return Sin(numeric_value).to_expr() + + +NumericValue.sin = sin