Class: ForestAdminDatasourceToolkit::Components::Query::Sort
- Inherits:
-
Array
- Object
- Array
- ForestAdminDatasourceToolkit::Components::Query::Sort
- Defined in:
- lib/forest_admin_datasource_toolkit/components/query/sort.rb
Instance Method Summary collapse
- #apply(records) ⇒ Object
- #inverse ⇒ Object
- #nest(prefix) ⇒ Object
- #projection ⇒ Object
- #replace_clauses ⇒ Object
- #unnest ⇒ Object
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 |
#inverse ⇒ Object
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 |
#projection ⇒ Object
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_clauses ⇒ Object
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 |
#unnest ⇒ Object
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 |