Sha256: f4049c2189535fda95a92df56c99d208d7699b80903657e2c15d8cf54a8a826b

Contents?: true

Size: 872 Bytes

Versions: 1

Compression:

Stored size: 872 Bytes

Contents

module CohortScope
  class Cohort < ::Arel::Nodes::Node
    IMPOSSIBLE = '1 = 2'

    def initialize(active_record, characteristics, minimum_cohort_size)
      @active_record = active_record
      @characteristics = characteristics
      @minimum_cohort_size = minimum_cohort_size
    end

    def expr
      @expr ||= resolve
    end
    alias :to_sql :expr

    private

    # Recursively look for a scope that meets the characteristics and is at least <tt>minimum_cohort_size</tt>.
    def resolve
      if @characteristics.empty?
        IMPOSSIBLE
      elsif (current = @active_record.where(CohortScope.conditions_for(@characteristics))).count >= @minimum_cohort_size
        current.constraints.inject(:and).to_sql
      else
        @characteristics = self.class.reduce_characteristics(@active_record, @characteristics)
        resolve
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cohort_scope-0.3.0 lib/cohort_scope/cohort.rb