Sha256: e0a0cec9f4a7e4964b5c937ebc8df929dd0cc422ce117791222f49b2bbcee37f

Contents?: true

Size: 1.66 KB

Versions: 10

Compression:

Stored size: 1.66 KB

Contents

class Card
  class Query
    module Sorting
      SORT_JOIN_TO_ITEM_MAP = { left: "left_id", right: "right_id" }.freeze

      def sort val
        return nil if @superquery
        sort_field = val[:return] || "db_content"
        item = val.delete(:item) || "left"

        if sort_field == "count"
          sort_by_count val, item
        elsif (join_field = SORT_JOIN_TO_ITEM_MAP[item.to_sym])
          sq = join_cards(val, to_field: join_field,
                               side: "LEFT",
                               conditions_on_join: true)
          @mods[:sort] ||= "#{sq.table_alias}.#{sort_field}"
        else
          raise Card::Error::BadQuery, "sort item: #{item} not yet implemented"
        end
      end

      # EXPERIMENTAL!
      def sort_by_count val, item
        if item == "referred_to"
          @mods[:sort] = "coalesce(count,0)" # needed for postgres
          cs = Query.new(
            return: "coalesce(count(*), 0) as count",
            group: "sort_join_field",
            superquery: self
          )
          subselect = Query.new val.merge(return: "id", superquery: self)
          cs.add_condition "referer_id in (#{subselect.sql})"
          # FIXME: - SQL generated before SQL phase
          cs.joins << Join.new(
            from: cs,
            to: %w(card_references wr referee_id)
          )
          cs.mods[:sort_join_field] = "#{cs.table_alias}.id as sort_join_field"
          # HACK!

          joins << Join.new(
            from: self,
            to: [cs, "srtbl", "sort_join_field"]
          )
        else
          raise Card::Error::BadQuery, "count with item: #{item} not yet implemented"
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
card-1.20.2 lib/card/query/sorting.rb
card-1.20.1 lib/card/query/sorting.rb
card-1.20.0 lib/card/query/sorting.rb
card-1.19.6 lib/card/query/sorting.rb
card-1.19.5 lib/card/query/sorting.rb
card-1.19.4 lib/card/query/sorting.rb
card-1.19.3 lib/card/query/sorting.rb
card-1.19.2 lib/card/query/sorting.rb
card-1.19.1 lib/card/query/sorting.rb
card-1.19.0 lib/card/query/sorting.rb