eprothro/cassie

View on GitHub
lib/cassie/statements/statement/conditions.rb

Summary

Maintainability
A
35 mins
Test Coverage
module Cassie::Statements::Statement
  module Conditions
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def if_not_exists(opts={})
        condition = "NOT EXISTS"
        opts.delete(:value)
        opts[:if] = true unless opts.has_key?(:if)

        conditions[condition] = opts
      end

      def if_exists(opts={})
        condition = "EXISTS"
        opts.delete(:value)
        opts[:if] = true unless opts.has_key?(:if)

        conditions[condition] = opts
      end

      def conditions
        @conditions ||= {}
      end
    end

    def conditions
      self.class.conditions
    end

    def build_condition_and_params
      condition_strings = []
      bindings = []

      conditions.each do |condition, opts|
        if !!source_eval(opts[:if])
          condition_strings << condition.to_s
          bindings << source_eval(opts[:value]) if opts.has_key?(:value)
        end
      end

      cql = "IF #{condition_strings.join(' AND ')}" unless condition_strings.empty?

      [cql , bindings]
    end
  end
end