Class: MultiTenant::ArelTenantVisitor
- Inherits:
-
Arel::Visitors::DepthFirst
- Object
- Arel::Visitors::DepthFirst
- MultiTenant::ArelTenantVisitor
- Defined in:
- lib/activerecord-multi-tenant/query_rewriter.rb
Instance Method Summary collapse
- #existing_tenant_relations ⇒ Object
-
#initialize(arel) ⇒ ArelTenantVisitor
constructor
A new instance of ArelTenantVisitor.
- #outer_joins_by_table_name ⇒ Object
- #tenant_relations ⇒ Object
- #visit_Arel_Nodes_Equality(o, _collector = nil) ⇒ Object
- #visit_Arel_Nodes_OuterJoin(o, collector = nil) ⇒ Object (also: #visit_Arel_Nodes_FullOuterJoin, #visit_Arel_Nodes_RightOuterJoin)
- #visit_Arel_Nodes_SelectStatement(o, _collector = nil) ⇒ Object
- #visit_Arel_Table(o, _collector = nil) ⇒ Object (also: #visit_Arel_Nodes_TableAlias)
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_relations ⇒ Object
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_name ⇒ Object
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_relations ⇒ Object
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 |