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



93
94
95
96
# File 'lib/arel/visitors/clickhouse.rb', line 93

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



85
86
87
88
89
90
91
# File 'lib/arel/visitors/clickhouse.rb', line 85

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
22
23
24
25
# File 'lib/arel/visitors/clickhouse.rb', line 18

def visit_Arel_Attributes_Attribute(o, collector)
  if collector.value.is_a?(String)
    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)
  else
    super
  end
end

#visit_Arel_Nodes_DoesNotMatch(o, collector) ⇒ Object



72
73
74
75
# File 'lib/arel/visitors/clickhouse.rb', line 72

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



42
43
44
45
46
# File 'lib/arel/visitors/clickhouse.rb', line 42

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

#visit_Arel_Nodes_Matches(o, collector) ⇒ Object



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

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

#visit_Arel_Nodes_Rows(o, collector) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/arel/visitors/clickhouse.rb', line 77

def visit_Arel_Nodes_Rows(o, collector)
  if o.expr.is_a?(String)
    collector << "ROWS #{o.expr}"
  else
    super
  end
end

#visit_Arel_Nodes_SelectOptions(o, collector) ⇒ Object



27
28
29
# File 'lib/arel/visitors/clickhouse.rb', line 27

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

#visit_Arel_Nodes_Settings(o, collector) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/arel/visitors/clickhouse.rb', line 48

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



31
32
33
34
35
36
37
38
39
40
# File 'lib/arel/visitors/clickhouse.rb', line 31

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



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

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