Class: MultiTenant::ArelTenantVisitor

Inherits:
Arel::Visitors::DepthFirst
  • Object
show all
Defined in:
lib/activerecord-multi-tenant/query_rewriter.rb

Instance Method Summary collapse

Constructor Details

#initialize(arel) ⇒ ArelTenantVisitor

Returns a new instance of ArelTenantVisitor.



5
6
7
8
9
10
11
12
13
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 5

def initialize(arel)
  super(Proc.new {})
  @tenant_relations = {}
  @existing_tenant_relations = {}
  @outer_joins_by_table_name = {}
  @statement_node_id = nil

  accept(arel.ast)
end

Instance Method Details

#existing_tenant_relationsObject



19
20
21
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 19

def existing_tenant_relations
  @existing_tenant_relations
end

#outer_joins_by_table_nameObject



23
24
25
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 23

def outer_joins_by_table_name
  @outer_joins_by_table_name
end

#tenant_relationsObject



15
16
17
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 15

def tenant_relations
  @tenant_relations
end

#visit_Arel_Nodes_Equality(o, _collector = nil) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 42

def visit_Arel_Nodes_Equality(o, _collector = nil)
  if o.left.is_a?(Arel::Attributes::Attribute)
    table_name = o.left.relation.table_name
    model = MultiTenant.multi_tenant_model_for_table(table_name)
    @existing_tenant_relations[@statement_node_id] ||= []
    @existing_tenant_relations[@statement_node_id] << o.left.relation if model.present? && o.left.name == model.partition_key
  end
end

#visit_Arel_Nodes_OuterJoin(o, collector = nil) ⇒ Object Also known as: visit_Arel_Nodes_FullOuterJoin, visit_Arel_Nodes_RightOuterJoin



51
52
53
54
55
56
57
58
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 51

def visit_Arel_Nodes_OuterJoin(o, collector = nil)
  if o.left.is_a?(Arel::Nodes::TableAlias) || o.left.is_a?(Arel::Table)
    @outer_joins_by_table_name[@statement_node_id] ||= {}
    @outer_joins_by_table_name[@statement_node_id][o.left.name] = o
  end
  visit o.left
  visit o.right
end

#visit_Arel_Nodes_SelectStatement(o, _collector = nil) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 33

def visit_Arel_Nodes_SelectStatement(o, _collector = nil)
  @statement_node_id = o.object_id
  visit o.cores
  visit o.orders
  visit o.limit
  visit o.lock
  visit o.offset
end

#visit_Arel_Table(o, _collector = nil) ⇒ Object Also known as: visit_Arel_Nodes_TableAlias



27
28
29
30
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 27

def visit_Arel_Table(o, _collector = nil)
  @tenant_relations[@statement_node_id] ||= []
  @tenant_relations[@statement_node_id] << o if tenant_relation?(o.table_name)
end