Skip to content

Commit

Permalink
Sin function added.
Browse files Browse the repository at this point in the history
  • Loading branch information
xmnlab committed Apr 11, 2018
1 parent f524894 commit b0e0eb9
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 20 deletions.
2 changes: 1 addition & 1 deletion ibis/mapd/api.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down
6 changes: 3 additions & 3 deletions ibis/mapd/client.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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):
Expand Down
43 changes: 30 additions & 13 deletions ibis/mapd/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -25,7 +27,7 @@ def to_sql(expr, context=None):
return query.compile()


class MapDSelectBuilder(comp.SelectBuilder):
class MapDSelectBuilder(compiles.SelectBuilder):
"""
"""
Expand All @@ -37,22 +39,22 @@ 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):
"""
"""
def _to_sql(self, expr, ctx):
return to_sql(expr, context=ctx)


class MapDSelect(comp.Select):
class MapDSelect(compiles.Select):
"""
"""
Expand Down Expand Up @@ -102,7 +104,7 @@ def format_limit(self):
return buf.getvalue()


class MapDTableSetFormatter(comp.TableSetFormatter):
class MapDTableSetFormatter(compiles.TableSetFormatter):
"""
"""
Expand Down Expand Up @@ -160,7 +162,7 @@ def _quote_identifier(self, name):
return name


class MapDExprTranslator(comp.ExprTranslator):
class MapDExprTranslator(compiles.ExprTranslator):
"""
"""
Expand All @@ -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):
"""
"""
Expand All @@ -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
6 changes: 5 additions & 1 deletion ibis/mapd/identifiers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
14 changes: 12 additions & 2 deletions ibis/mapd/operations.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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):
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

0 comments on commit b0e0eb9

Please sign in to comment.