Sha256: 13c4819a31c76d63b2d5dfe34d5d8b769caf93b8e376d21df4c179c1fdcd7a95

Contents?: true

Size: 1.89 KB

Versions: 2

Compression:

Stored size: 1.89 KB

Contents

require 'active_support/concern'
require 'sakuramochi/condition'

module Sakuramochi
  module Relation
    extend ActiveSupport::Concern

    included do
      alias :build_where_without_condition :build_where
      alias :build_where :build_where_with_condition
    end

    module InstanceMethods
      def collapse_conditions(node, other)
        case node
        when Sakuramochi::Condition::Nodes::Expression
          case node.operator.to_s
          when 'and'
            left = collapse_conditions(node.left, other)
            right = collapse_conditions(node.right, other)
            left && right ? Arel::Nodes::And.new([left, right]) : left || right

          when 'or'
            left = collapse_conditions(node.left, other)
            right = collapse_conditions(node.right, other)
            left && right ? Arel::Nodes::Or.new(left, right) : left || right
          end

        when Sakuramochi::Condition::Nodes::Term
          case node.operator.to_s
          when 'not'
            right = collapse_conditions(node.value, other)
            Arel::Nodes::Not.new(right) if right
          end

        when Sakuramochi::Condition::Nodes::Factor
          wheres = build_where_without_condition(node.value, other)
          arel = table.from(table)
          collapse_wheres(arel, (wheres - ['']).uniq)
          arel.constraints.inject { |left, right| left.and(right) }

        when Sakuramochi::Condition::Nodes::Group
          expression = collapse_conditions(node.expression, other)
          Arel::Nodes::Grouping.new(expression) if expression
        end
      end

      def build_where_with_condition(opts, other = [])
        if Sakuramochi::Condition.condition?(opts)
          ast = Sakuramochi::Condition::Parser.new(opts.dup).parse
          [collapse_conditions(ast, other)].compact
        else
          build_where_without_condition(opts, other)
        end
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
sakuramochi-0.5.4 lib/sakuramochi/relation.rb
sakuramochi-0.5.3 lib/sakuramochi/relation.rb