def add_operation(op, func_name, db): """ Registers the given operation within the Ibis SQL translation toolchain Parameters ---------- op: operator class name: used in issuing statements to SQL engine database: database the relevant operator is registered to """ full_name = '{0}.{1}'.format(db, func_name) # TODO # if op.input_type is rlz.listof: # translator = comp.varargs(full_name) # else: arity = len(op.signature) translator = fixed_arity(full_name, arity) comp._operation_registry[op] = translator
arg_formatted = translator.translate(arg) if digits is not None: digits_formatted = translator.translate(digits) return 'bround({}, {})'.format(arg_formatted, digits_formatted) return 'bround({})'.format(arg_formatted) _operation_registry = {**operation_registry} _operation_registry.update({ ops.IsNan: unary('isnan'), ops.IfNull: fixed_arity('ifnull', 2), ops.StructField: _struct_field, ops.MapValueForKey: _map_value_for_key, ops.ArrayLength: unary('size'), ops.Round: _round, ops.HLLCardinality: reduction('approx_count_distinct'), ops.StrRight: fixed_arity('right', 2), ops.StringSplit: fixed_arity('SPLIT', 2), ops.RegexSearch:
arg, digits = op.args arg_formatted = translator.translate(arg) if digits is not None: digits_formatted = translator.translate(digits) return 'bround({}, {})'.format(arg_formatted, digits_formatted) return 'bround({})'.format(arg_formatted) _operation_registry = {**operation_registry} _operation_registry.update( { ops.IsNan: unary('isnan'), ops.IfNull: fixed_arity('ifnull', 2), ops.StructField: _struct_field, ops.MapValueForKey: _map_value_for_key, ops.ArrayLength: unary('size'), ops.Round: _round, ops.HLLCardinality: reduction('approx_count_distinct'), ops.StrRight: fixed_arity('right', 2), ops.StringSplit: fixed_arity('SPLIT', 2), ops.RegexSearch: fixed_arity('rlike', 2), ops.StringConcat: _string_concat, ops.ArrayConcat: fixed_arity('concat', 2), ops.GroupConcat: _group_concat, ops.Cast: _cast, ops.ExtractYear: unary('year'), ops.ExtractMonth: unary('month'), ops.ExtractDay: unary('day'),
ops.ExtractDay: _extract_field('day'), ops.ExtractHour: _extract_field('hour'), ops.ExtractMinute: _extract_field('minute'), ops.ExtractSecond: _extract_field('second'), ops.ExtractMillisecond: _extract_field('millisecond'), ops.ExtractEpochSeconds: _extract_field('epochseconds'), ops.Hash: _hash, ops.StringReplace: fixed_arity('REPLACE', 3), ops.StringSplit: fixed_arity('SPLIT', 2), ops.StringConcat: _string_concat, ops.StringJoin: _string_join, ops.StringAscii: _string_ascii, ops.StringFind: _string_find, ops.StrRight: _string_right, ops.Repeat: fixed_arity('REPEAT', 2), ops.RegexSearch:
ops.Uppercase: unary('upper'), ops.Reverse: unary('reverse'), ops.Strip: unary('trim'), ops.LStrip: unary('ltrim'), ops.RStrip: unary('rtrim'), ops.Capitalize: unary('initcap'), ops.Substring: _substring, ops.StrRight: fixed_arity('strright', 2), ops.Repeat: fixed_arity('repeat', 2), ops.StringFind: _string_find, ops.Translate: fixed_arity('translate', 3), ops.FindInSet: _find_in_set, ops.LPad: fixed_arity('lpad', 3), ops.RPad: fixed_arity('rpad', 3), ops.StringJoin: _string_join, ops.StringSQLLike:
ops.ExtractYear: _extract_field("year"), ops.ExtractMonth: _extract_field("month"), ops.ExtractDay: _extract_field("day"), ops.ExtractHour: _extract_field("hour"), ops.ExtractMinute: _extract_field("minute"), ops.ExtractSecond: _extract_field("second"), ops.ExtractMillisecond: _extract_field("millisecond"), ops.StringReplace: fixed_arity("REPLACE", 3), ops.StringSplit: fixed_arity("SPLIT", 2), ops.StringConcat: _string_concat, ops.StringJoin: _string_join, ops.StringAscii: _string_ascii, ops.StringFind: _string_find, ops.StrRight: _string_right, ops.Repeat: fixed_arity("REPEAT", 2), ops.RegexSearch:
_reduction('max'), ops.Min: _reduction('min'), ops.Sum: _reduction('sum'), ops.Mean: _reduction('avg', 'float64'), # string methods ops.LStrip: unary(sa.func.ltrim), ops.Lowercase: unary(sa.func.lower), ops.RStrip: unary(sa.func.rtrim), ops.Repeat: fixed_arity(sa.func.replicate, 2), ops.Reverse: unary(sa.func.reverse), ops.StringFind: _string_find, ops.StringLength: unary(sa.func.length), ops.StringReplace: fixed_arity(sa.func.replace, 3), ops.Strip: unary(sa.func.trim), ops.Substring: _substr, ops.Uppercase: unary(sa.func.upper), # math
return sa.func.regexp_substr(sa_arg, sa_expr, sa_group) _operation_registry.update( { ops.Literal: _literal, # We override this here to support time zones ops.TableColumn: _table_column, # types ops.Cast: _cast, ops.TypeOf: _typeof, # Floating ops.IsNan: _is_nan, ops.IsInf: _is_inf, # null handling ops.IfNull: fixed_arity(sa.func.coalesce, 2), # boolean reductions ops.Any: unary(sa.func.bool_or), ops.All: unary(sa.func.bool_and), ops.NotAny: unary(lambda x: sa.not_(sa.func.bool_or(x))), ops.NotAll: unary(lambda x: sa.not_(sa.func.bool_and(x))), # strings ops.Substring: _substr, ops.StringFind: _string_find, ops.GroupConcat: _string_agg, ops.Capitalize: unary(sa.func.initcap), ops.RegexSearch: _regex_search, ops.RegexReplace: _regex_replace, ops.RegexExtract: _regex_extract, ops.Translate: fixed_arity('translate', 3), ops.StringSplit: fixed_arity(sa.func.string_to_array, 2),
_operation_registry = { **base_sql.operation_registry, **impala_compiler._operation_registry, } _operation_registry.update( { ops.ExtractYear: _extract_field('year'), ops.ExtractQuarter: _extract_field('quarter'), ops.ExtractMonth: _extract_field('month'), ops.ExtractDay: _extract_field('day'), ops.ExtractHour: _extract_field('hour'), ops.ExtractMinute: _extract_field('minute'), ops.ExtractSecond: _extract_field('second'), ops.ExtractMillisecond: _extract_field('millisecond'), ops.ExtractEpochSeconds: _extract_field('epochseconds'), ops.StringReplace: fixed_arity('REPLACE', 3), ops.StringSplit: fixed_arity('SPLIT', 2), ops.StringConcat: _string_concat, ops.StringJoin: _string_join, ops.StringAscii: _string_ascii, ops.StringFind: _string_find, ops.StrRight: _string_right, ops.Repeat: fixed_arity('REPEAT', 2), ops.RegexSearch: _regex_search, ops.RegexExtract: _regex_extract, ops.RegexReplace: _regex_replace, ops.GroupConcat: reduction('STRING_AGG'), ops.IfNull: fixed_arity('IFNULL', 2), ops.Cast: _cast, ops.StructField: _struct_field, ops.ArrayCollect: unary('ARRAY_AGG'),