Class: ForestAdminDatasourceToolkit::Components::Query::Sort

Inherits:
Array
  • Object
show all
Defined in:
lib/forest_admin_datasource_toolkit/components/query/sort.rb

Instance Method Summary collapse

Instance Method Details

#apply(records) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 46

def apply(records)
  records.sort do |a, b|
    comparison = 0
    (0..(length - 1)).each do |i|
      field = self[i][:field]
      ascending = self[i][:ascending]
      break unless comparison.zero?

      value_on_a = ForestAdminDatasourceToolkit::Utils::Record.field_value(a, field)
      value_on_b = ForestAdminDatasourceToolkit::Utils::Record.field_value(b, field)

      comparison = value_on_a <=> value_on_b
      comparison = 1 if comparison.nil?
      comparison *= -1 unless ascending
    end

    comparison
  end
end

#inverseObject



32
33
34
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 32

def inverse
  self.class.new(map { |ob| { field: ob[:field], ascending: !ob[:ascending] } })
end

#nest(prefix) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 22

def nest(prefix)
  if prefix&.length
    self.class.new(map do |ob|
                     { field: "#{prefix}:#{ob[:field]}", ascending: ob[:ascending] }
                   end)
  else
    self
  end
end

#projectionObject



5
6
7
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 5

def projection
  Projection.new(map { |clause| clause[:field] })
end

#replace_clausesObject



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 9

def replace_clauses(...)
  Sort.new(
    map(...)
    .reduce(Sort.new) do |memo, clause|
      if clause.is_a?(Array) || clause.is_a?(self.class)
        memo.union(clause)
      else
        memo.union([clause])
      end
    end
  )
end

#unnestObject



36
37
38
39
40
41
42
43
44
# File 'lib/forest_admin_datasource_toolkit/components/query/sort.rb', line 36

def unnest
  prefix = first[:field].split(':')[0]
  raise 'Cannot unnest sort.' unless all? { |ob| ob[:field].start_with?(prefix) }

  self.class.new(map do |ob|
                   { field: ob[:field][prefix.length + 1, ob[:field].length - prefix.length - 1],
                     ascending: ob[:ascending] }
                 end)
end