Sha256: cff59bf216f87a91f77731c2fc71f2ae9b5098266e632233c4d11ba2730f4bf2

Contents?: true

Size: 1.36 KB

Versions: 20

Compression:

Stored size: 1.36 KB

Contents

module Ransack
  class Visitor

    def accept(object)
      visit(object)
    end

    def can_accept?(object)
      respond_to? DISPATCH[object.class]
    end

    def visit_Array(object)
      object.map {|o| accept(o)}.compact
    end

    def visit_Ransack_Nodes_Condition(object)
      object.arel_predicate if object.valid?
    end

    def visit_Ransack_Nodes_Grouping(object)
      object.combinator == 'or' ? visit_or(object) : visit_and(object)
    end

    def visit_and(object)
      nodes = object.values.map {|o| accept(o)}.compact
      return nil unless nodes.size > 0

      if nodes.size > 1
        Arel::Nodes::Grouping.new(Arel::Nodes::And.new(nodes))
      else
        nodes.first
      end
    end

    def visit_or(object)
      nodes = object.values.map {|o| accept(o)}.compact
      return nil unless nodes.size > 0

      if nodes.size > 1
        nodes.inject(&:or)
      else
        nodes.first
      end
    end

    def visit_Ransack_Nodes_Sort(object)
      object.attr.send(object.dir) if object.valid?
    end

    def quoted?(object)
      case object
      when Arel::Nodes::SqlLiteral, Bignum, Fixnum
        false
      else
        true
      end
    end

    def visit(object)
      send(DISPATCH[object.class], object)
    end

    DISPATCH = Hash.new do |hash, klass|
      hash[klass] = "visit_#{klass.name.gsub('::', '_')}"
    end

  end
end

Version data entries

20 entries across 20 versions & 2 rubygems

Version Path
ransack-1.1.0 lib/ransack/visitor.rb
ransack-1.0.0 lib/ransack/visitor.rb
ransack-0.7.2 lib/ransack/visitor.rb
ransack-0.7.1 lib/ransack/visitor.rb
ransack_ffcrm-0.7.1 lib/ransack/visitor.rb
ransack-0.7.0 lib/ransack/visitor.rb
ransack_ffcrm-0.6.0 lib/ransack/visitor.rb
ransack-0.6.0 lib/ransack/visitor.rb
ransack-0.5.8 lib/ransack/visitor.rb
ransack-0.5.7 lib/ransack/visitor.rb
ransack-0.5.6 lib/ransack/visitor.rb
ransack-0.5.5 lib/ransack/visitor.rb
ransack-0.5.4 lib/ransack/visitor.rb
ransack-0.5.3 lib/ransack/visitor.rb
ransack-0.5.2 lib/ransack/visitor.rb
ransack-0.5.1 lib/ransack/visitor.rb
ransack-0.5.0 lib/ransack/visitor.rb
ransack-0.4.2 lib/ransack/visitor.rb
ransack-0.4.1 lib/ransack/visitor.rb
ransack-0.4.0 lib/ransack/visitor.rb