Sha256: 5e426bef0e7d57858fffead29cf78f42e409197830a7172838bb5269f8f6ddee

Contents?: true

Size: 1.97 KB

Versions: 2

Compression:

Stored size: 1.97 KB

Contents

module RecordFilter
  class Query # :nodoc: all

    attr_reader :dsl_conjunction
    attr_reader :conjunction

    def initialize(clazz, named_filter, *args, &block)
      dsl = dsl_for_named_filter(clazz, named_filter)
      dsl.instance_eval(&block) if block
      dsl.send(named_filter, *args) if named_filter && dsl.respond_to?(named_filter)

      @table = RecordFilter::Table.new(clazz)
      @dsl_conjunction = dsl.conjunction
      @conjunction = RecordFilter::Conjunctions::Base.create_from(@dsl_conjunction, @table)
    end

    def to_find_params(count_query=false)
      @params_cache ||= {}
      @params_cache[count_query] ||= begin
        params = {}
        conditions = @conjunction.to_conditions
        params = { :conditions => conditions } if conditions
        joins = @table.all_joins
        params[:joins] = joins.map { |join| join.to_sql } * ' ' unless joins.empty?
        if (joins.any? { |j| j.requires_distinct_select? })
          if count_query
            params[:select] = "DISTINCT #{@table.model_class.quoted_table_name}.#{@table.model_class.primary_key}"
          else
            params[:select] = "DISTINCT #{@table.model_class.quoted_table_name}.*"
          end
        end
        orders = @table.orders
        params[:order] = orders.map { |order| order.to_sql } * ', ' unless orders.empty?
        group_bys = @table.group_bys
        params[:group] = group_bys.map { |group_by| group_by.to_sql } * ', ' unless group_bys.empty?
        params[:limit] = @conjunction.limit if @conjunction.limit
        params[:offset] = @conjunction.offset if @conjunction.offset
        params
      end
    end

    protected

    def dsl_for_named_filter(clazz, named_filter)
      return DSL::DSLFactory.create(clazz) if named_filter.blank?
      while (clazz)
        dsl = DSL::DSLFactory.subclass(clazz)
        return DSL::DSLFactory.create(clazz) if dsl && dsl.instance_methods(false).include?(named_filter.to_s)
        clazz = clazz.superclass
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
aub-record_filter-0.8.0 lib/record_filter/query.rb
outoftime-record_filter-0.8.0 lib/record_filter/query.rb