Sha256: 156727e86716f9d02d335d0ebcb474f41247d5f382860a41f82049d6b47be2c1

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

module Recliner
  class ViewGenerator
    extend ActiveSupport::Memoizable
    
    attr_reader :options
    
    def initialize(options={})
      @options = { :conditions! => {}, :order => :_id }.merge(options)
    end
    
    def generate
      map = ""
      
      map << "if (#{conditions}) {\n" unless conditions.blank?
      map << "  emit(#{key}, #{value});\n"
      map << "}\n" unless conditions.blank?
      
      [ViewFunction::Map.new(map), nil]
    end
    
  private
    def key
      key = options[:key] || options[:order]

      if key.is_a?(Array)
        '[' + key.map { |k| "doc.#{k}" }.join(', ') + ']'
      else
        "doc.#{key}"
      end
    end
    
    def value
      if options[:select]
        "{" + Array(options[:select]).map { |field|
          "\"#{field}\": doc.#{field}"
        }.join(", ") + "}"
      else
        'doc'
      end
    end
    
    def conditions
      case options[:conditions]
      when Hash
        conditions = field_conditions(options[:conditions!].merge(options[:conditions]))
      when String
        conditions = field_conditions(options[:conditions!])
        conditions << "(#{options[:conditions]})"
      else
        conditions = field_conditions(options[:conditions!])
      end
      
      conditions.join(' && ')
    end
    
    def field_conditions(conditions)
      conditions.map { |k, v|
        case v
        when true
          "doc.#{k}"
        when false
          "!doc.#{k}"
        else
          "doc.#{k} === #{v.to_json}"
        end
      }
    end
    
    memoize :key, :value, :conditions
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
recliner-0.0.1 lib/recliner/views/generator.rb