Class: Arel::Visitors::Clickhouse
- Inherits:
-
ToSql
- Object
- ToSql
- Arel::Visitors::Clickhouse
- Defined in:
- lib/arel/visitors/clickhouse.rb
Instance Method Summary collapse
- #aggregate(name, o, collector) ⇒ Object
- #compile(node, collector = Arel::Collectors::SQLString.new) ⇒ Object
- #sanitize_as_setting_name(value) ⇒ Object
- #sanitize_as_setting_value(value) ⇒ Object
-
#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.
- #visit_Arel_Nodes_DeleteStatement(o, collector) ⇒ Object
- #visit_Arel_Nodes_DoesNotMatch(o, collector) ⇒ Object
- #visit_Arel_Nodes_Final(o, collector) ⇒ Object
- #visit_Arel_Nodes_GroupingSets(o, collector) ⇒ Object
- #visit_Arel_Nodes_LimitBy(o, collector) ⇒ Object
- #visit_Arel_Nodes_Matches(o, collector) ⇒ Object
- #visit_Arel_Nodes_Rows(o, collector) ⇒ Object
- #visit_Arel_Nodes_SelectOptions(o, collector) ⇒ Object
- #visit_Arel_Nodes_Settings(o, collector) ⇒ Object
- #visit_Arel_Nodes_UpdateStatement(o, collector) ⇒ Object
- #visit_Arel_Nodes_Using(o, collector) ⇒ Object
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 |