Sha256: 85de5081a6bd99c8b4a838da76b250f5f17906078bb59dc6823c4bd9cfb3c81b

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

module Vapid
  module Directives
    # Group directive
    class Group < Vapid::Directive
      FILTER_METHODS = [:limit, :order].freeze

      renders :all

      before_render do
        Models::Group.named(subject).try(:records)
      end

      # Filters
      filter :repeat do |query, limit|
        query.limit(limit)
      end

      # @todo This is a hack to allow all supported ActiveRecord databases to
      #   use/search/order by JSON. Ideally, we'd look for the JSON capabilities
      #   of the host DB, and adjust the implementation accordingly.
      filter :order do |query, args|
        fields, desc_indexes = parse_conditions(args)
        values = fetch_values(query, fields)
        sorted_values = sort_values(values, desc_indexes)
        statement = sorted_values.map { |v| "ID=#{v[0]} DESC" }.join(", ")

        query.order(statement)
      end

      def repeating?
        @args.any? { |a| a.first == "repeat" }
      end

      private

        def parse_conditions(args)
          fields = []
          desc_indexes = []
          conditions = args.scan(/(-)?(\w+)/)

          conditions.each_with_index do |(sign, field), i|
            fields << field
            desc_indexes << i if sign == "-"
          end

          [fields, desc_indexes]
        end

        def fetch_values(query, fields)
          query.unscope(FILTER_METHODS).each_with_object({}) do |record, values|
            values[record.id] = record.content.values_at(*fields)
          end
        end

        def sort_values(values, desc_indexes)
          values.sort do |a, b|
            x = a[1]
            y = b[1]

            desc_indexes.each do |i|
              orig = x[i]
              x[i] = y[i]
              y[i] = orig
            end

            x <=> y
          end
        end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vapid-0.1.0 lib/vapid/directives/group.rb