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



12
13
14
15
16
17
18
19
# File 'lib/arel/visitors/clickhouse.rb', line 12

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

#compile(node, collector = Arel::Collectors::SQLString.new) ⇒ Object



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

def compile(node, collector = Arel::Collectors::SQLString.new)
  @delete_or_update = false
  super
end

#sanitize_as_setting_name(value) ⇒ Object



120
121
122
123
# File 'lib/arel/visitors/clickhouse.rb', line 120

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



112
113
114
115
116
117
118
# File 'lib/arel/visitors/clickhouse.rb', line 112

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



23
24
25
26
27
28
29
# File 'lib/arel/visitors/clickhouse.rb', line 23

def visit_Arel_Attributes_Attribute(o, collector)
  unless @delete_or_update
    join_name  = o.relation.table_alias || o.relation.name
    collector << quote_table_name(join_name) << '.'
  end
  collector << quote_column_name(o.name)
end

#visit_Arel_Nodes_DeleteStatement(o, collector) ⇒ Object



48
49
50
51
# File 'lib/arel/visitors/clickhouse.rb', line 48

def visit_Arel_Nodes_DeleteStatement(o, collector)
  @delete_or_update = true
  super
end

#visit_Arel_Nodes_DoesNotMatch(o, collector) ⇒ Object



99
100
101
102
# File 'lib/arel/visitors/clickhouse.rb', line 99

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



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/arel/visitors/clickhouse.rb', line 53

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

  o.expr.right.each do |join|
    collector << ' '
    visit join, collector
  end

  collector
end

#visit_Arel_Nodes_GroupingSets(o, collector) ⇒ Object



65
66
67
68
# File 'lib/arel/visitors/clickhouse.rb', line 65

def visit_Arel_Nodes_GroupingSets(o, collector)
  collector << 'GROUPING SETS '
  grouping_array_or_grouping_element(o.expr, collector)
end

#visit_Arel_Nodes_LimitBy(o, collector) ⇒ Object



89
90
91
92
# File 'lib/arel/visitors/clickhouse.rb', line 89

def visit_Arel_Nodes_LimitBy(o, collector)
  collector << "LIMIT #{o.expr} BY #{o.column}"
  collector
end

#visit_Arel_Nodes_Matches(o, collector) ⇒ Object



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

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



104
105
106
107
108
109
110
# File 'lib/arel/visitors/clickhouse.rb', line 104

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



31
32
33
34
# File 'lib/arel/visitors/clickhouse.rb', line 31

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

#visit_Arel_Nodes_Settings(o, collector) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/arel/visitors/clickhouse.rb', line 70

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



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/arel/visitors/clickhouse.rb', line 36

def visit_Arel_Nodes_UpdateStatement(o, collector)
  @delete_or_update = true
  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



83
84
85
86
87
# File 'lib/arel/visitors/clickhouse.rb', line 83

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