Sha256: 9e5a932c594b091a4b35b113126ea6e97df3dcb93a9f702609c5cfe94eb1bb40

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

module Aggrobot
  module QueryPlanner
    class BucketedGroupsQueryPlanner < DefaultQueryPlanner

      def initialize(collection, group, opts = {})
        ParametersValidator.validate_options(opts, [:buckets], [:keep_empty])
        raise_error 'Need to set group first' unless group
        super(collection, group)
        create_query_map(opts[:buckets])
        @keep_empty = opts[:keep_empty]
      end

      def sub_query(group_name)
        @query_map[group_name]
      end

      def query_results(extra_cols = [])
        return empty_default_groups if collection_is_none?
        results = collect_query_results(extra_cols)
        results.reject! { |r| r[1] == 0 } unless @keep_empty
        results
      end

      private

      def collect_query_results(extra_cols)
        columns = ['', SqlFunctions.count] + extra_cols
        @query_map.collect do |group_name, query|
          sanitized_group_name = SqlFunctions.sanitize(group_name)
          columns[0] = sanitized_group_name
          results = query.group(sanitized_group_name).limit(1).pluck(*columns).first
          @query_map[group_name] = @query_map[group_name].none unless results
          results || [group_name, 0]
        end
      end

      def empty_default_groups
        @keep_empty ? @query_map.keys.collect { |k| [k, 0] } : []
      end

      def create_query_map(groups)
        @query_map = {}
        groups.each do |group|
          @query_map[group.to_s] = @collection.where(@group => group)
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
aggrobot-0.0.2 lib/aggrobot/query_planner/bucketed_groups_query_planner.rb