Class: Oso::Polar::Data::Adapter::ActiveRecordAdapter

Inherits:
Oso::Polar::Data::Adapter show all
Defined in:
lib/oso/polar/data/adapter/active_record_adapter.rb

Overview

Example data filtering adapter for ActiveRecord

Constant Summary collapse

OPS =
{
  'Eq' => '=', 'In' => 'IN', 'Nin' => 'NOT IN', 'Neq' => '!=',
  'Lt' => '<', 'Gt' => '>', 'Leq' => '<=', 'Geq' => '>='
}.freeze

Instance Method Summary collapse

Instance Method Details

#build_query(filter) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/oso/polar/data/adapter/active_record_adapter.rb', line 9

def build_query(filter) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
  types = filter.types
  query = filter.relations.reduce(filter.model.all) do |q, rel|
    rec = types[rel.left].fields[rel.name]
    join_type = rec.kind == 'one' ? 'LEFT' : 'INNER'
    q.joins(
      "#{join_type} JOIN #{rel.right.table_name} ON " \
      "#{rel.left.table_name}.#{rec.my_field} = " \
      "#{rel.right.table_name}.#{rec.other_field}"
    )
  end

  filter.conditions.map do |conjs|
    conjs.reduce(query) do |q, conj|
      q.where(*sqlize(conj))
    end
  end.reduce(:or).distinct
end

#execute_query(query) ⇒ Object



28
29
30
# File 'lib/oso/polar/data/adapter/active_record_adapter.rb', line 28

def execute_query(query)
  query.to_a
end