Class: Arel::Visitors::Clickhouse

Inherits:
ToSql
  • Object
show all
Defined in:
lib/arel/visitors/clickhouse.rb

Instance Method Summary collapse

Instance Method Details

#aggregate(name, o, collector) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/arel/visitors/clickhouse.rb', line 7

def aggregate(name, o, collector)
  # replacing function name for materialized view
  if o.expressions.first && o.expressions.first != '*' && !o.expressions.first.is_a?(String) && o.expressions.first.relation&.is_view
    super("#{name.downcase}Merge", o, collector)
  else
    super
  end
end

#sanitize_as_setting_name(value) ⇒ Object



81
82
83
84
# File 'lib/arel/visitors/clickhouse.rb', line 81

def sanitize_as_setting_name(value)
  return value if Arel::Nodes::SqlLiteral === value
  @connection.sanitize_as_setting_name(value)
end

#sanitize_as_setting_value(value) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/arel/visitors/clickhouse.rb', line 73

def sanitize_as_setting_value(value)
  if value == :default
    'DEFAULT'
  else
    quote(value)
  end
end

#visit_Arel_Attributes_Attribute(o, collector) ⇒ Object

clickhouse.com/docs/en/sql-reference/statements/delete DELETE and UPDATE in ClickHouse working only without table name



18
19
20
21
# File 'lib/arel/visitors/clickhouse.rb', line 18

def visit_Arel_Attributes_Attribute(o, collector)
  collector << quote_table_name(o.relation.table_alias || o.relation.name) << '.' unless collector.value.start_with?('DELETE FROM ') || collector.value.include?(' UPDATE ')
  collector << quote_column_name(o.name)
end

#visit_Arel_Nodes_DoesNotMatch(o, collector) ⇒ Object



68
69
70
71
# File 'lib/arel/visitors/clickhouse.rb', line 68

def visit_Arel_Nodes_DoesNotMatch(o, collector)
  op = o.case_sensitive ? " NOT LIKE " : " NOT ILIKE "
  infix_value o, collector, op
end

#visit_Arel_Nodes_Final(o, collector) ⇒ Object



38
39
40
41
42
# File 'lib/arel/visitors/clickhouse.rb', line 38

def visit_Arel_Nodes_Final(o, collector)
  visit o.expr, collector
  collector << ' FINAL'
  collector
end

#visit_Arel_Nodes_Matches(o, collector) ⇒ Object



63
64
65
66
# File 'lib/arel/visitors/clickhouse.rb', line 63

def visit_Arel_Nodes_Matches(o, collector)
  op = o.case_sensitive ? " LIKE " : " ILIKE "
  infix_value o, collector, op
end

#visit_Arel_Nodes_SelectOptions(o, collector) ⇒ Object



23
24
25
# File 'lib/arel/visitors/clickhouse.rb', line 23

def visit_Arel_Nodes_SelectOptions(o, collector)
  maybe_visit o.settings, super
end

#visit_Arel_Nodes_Settings(o, collector) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/arel/visitors/clickhouse.rb', line 44

def visit_Arel_Nodes_Settings(o, collector)
  return collector if o.expr.empty?

  collector << "SETTINGS "
  o.expr.each_with_index do |(key, value), i|
    collector << ", " if i > 0
    collector << key.to_s.gsub(/\W+/, "")
    collector << " = "
    collector << sanitize_as_setting_value(value)
  end
  collector
end

#visit_Arel_Nodes_UpdateStatement(o, collector) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/arel/visitors/clickhouse.rb', line 27

def visit_Arel_Nodes_UpdateStatement(o, collector)
  o = prepare_update_statement(o)

  collector << 'ALTER TABLE '
  collector = visit o.relation, collector
  collect_nodes_for o.values, collector, ' UPDATE '
  collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
  collect_nodes_for o.orders, collector, ' ORDER BY '
  maybe_visit o.limit, collector
end

#visit_Arel_Nodes_Using(o, collector) ⇒ Object



57
58
59
60
61
# File 'lib/arel/visitors/clickhouse.rb', line 57

def visit_Arel_Nodes_Using o, collector
  collector << "USING "
  visit o.expr, collector
  collector
end