Sha256: dbcf07eb3ef71b0b12cb2ebd6604536382f3260f876ae176497e8f4f34b972f7

Contents?: true

Size: 1.96 KB

Versions: 3

Compression:

Stored size: 1.96 KB

Contents

require 'set_builder/modifier/adverb'


module SetBuilder
  module Modifiers
    class DateModifier < Modifier::Adverb
      
      
      
      def self.operators
        {
          :ever => [],
          :before => [:date],
          :after => [:date],
          :on => [:date],
          :during_month => [:month],
          :during_year => [:year],
          :in_the_last => [:number, :period],
          :between => [:date, :date]
        }
      end
      
      
      
      def build_conditions_for(selector)
        case operator
        when :ever
          "#{selector} IS NOT NULL"
        when :before
          "#{selector}<'#{format_value(get_date)}'"
        when :after
          "#{selector}>'#{format_value(get_date)}'"
        when :on
          "#{selector}='#{format_value(get_date)}'"
        when :during_month
          "extract(month from #{selector})=#{values[0].to_i}"
        when :during_year
          year = values[0].to_i
          return "TRUE" if year <= 0
          "#{selector} BETWEEN '#{year}-01-01' AND '#{year}-12-31'"
        when :in_the_last
          "#{selector}>='#{format_value(get_date)}'"
        when :between
          "#{selector} BETWEEN '#{format_value(Date.parse values[0])}' AND '#{format_value(Date.parse values[1])}'"
        end
      end
      
      
      
    protected
      
      
      
      def get_date
        case operator
        when :in_the_last
          case values[1]
          when "years", "year"
            values[0].to_i.years.ago
          when "months", "month"
            values[0].to_i.months.ago
          when "weeks", "week"
            values[0].to_i.weeks.ago
          when "days", "day"
            values[0].to_i.days.ago
          end
        else
          Date.parse values[0]
        end
      end
      
      
      
      def format_value(date)
        date = [Date.new(1,1,1), date].max # constrain dates to A.D.
        date.strftime('%Y-%m-%d')
      end
      
      
      
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
set_builder-1.2.0.beta1 lib/set_builder/modifiers/date_modifier.rb
set_builder-1.1.0 lib/set_builder/modifiers/date_modifier.rb
set_builder-1.0.2 lib/set_builder/modifiers/date_modifier.rb