Sha256: 152c27279c91d2eedb6dc5bfd57dc51b4987421344c37d886676edc1a6332753

Contents?: true

Size: 1.97 KB

Versions: 59

Compression:

Stored size: 1.97 KB

Contents

module ForestAdminDatasourceToolkit
  module Components
    module Query
      class Sort < Array
        def projection
          Projection.new(map { |clause| clause[:field] })
        end

        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

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

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

        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

        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
      end
    end
  end
end

Version data entries

59 entries across 59 versions & 1 rubygems

Version Path
forest_admin_datasource_toolkit-1.0.0.pre.beta.98 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.97 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.96 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.95 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.94 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.93 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.92 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.91 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.90 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.89 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.88 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.87 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.86 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.85 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.83 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.82 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.81 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.80 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.79 lib/forest_admin_datasource_toolkit/components/query/sort.rb
forest_admin_datasource_toolkit-1.0.0.pre.beta.78 lib/forest_admin_datasource_toolkit/components/query/sort.rb