Sha256: 060880895473d96181ec6eee6feed0c8209687d9ec858430fd449ccf92fb1f24

Contents?: true

Size: 1.81 KB

Versions: 13

Compression:

Stored size: 1.81 KB

Contents

class Card
  module Query
    class Value
      include Clause
      SQL_FIELD = { name: "key", content: "db_content" }.freeze

      attr_reader :query, :operator, :value

      def initialize rawvalue, query
        @query = query
        @operator, @value = parse_value rawvalue
        canonicalize_operator
      end

      def parse_value rawvalue
        case rawvalue
        when String, Integer then ["=", rawvalue]
        when Symbol          then ["=", rawvalue.to_s]
        when Array           then parse_array_value rawvalue
        else raise Error::BadQuery, "Invalid property value: #{rawvalue.inspect}"
        end
      end

      def parse_array_value array
        operator = operator?(array.first) ? array.shift : :in
        [operator, array]
      end

      def canonicalize_operator
        unless (target = OPERATORS[@operator.to_s])
          raise Error::BadQuery, "Invalid operator: #{@operator}"
        end

        @operator = target
      end

      def operator? key
        OPERATORS.key? key.to_s
      end

      def sqlize v
        case v
        when Query then  v.to_sql
        when Array then  "(" + v.flatten.map { |x| sqlize(x) }.join(",") + ")"
        else quote(v.to_s)
        end
      end

      def to_sql field
        value = value_sql field, @value
        "#{field_sql field} #{operational_sql value}"
      end

      def operational_sql value
        if @operator == "~"
          connection.match value
        else
          "#{@operator} #{value}"
        end
      end

      def field_sql field
        db_field = SQL_FIELD[field.to_sym] || safe_sql(field.to_s)
        "#{@query.table_alias}.#{db_field}"
      end

      def value_sql field, value
        value = [value].flatten.map(&:to_name).map(&:key) if field.to_sym == :name
        sqlize value
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
card-1.99.6 lib/card/query/value.rb
card-1.99.5 lib/card/query/value.rb
card-1.99.4 lib/card/query/value.rb
card-1.99.3 lib/card/query/value.rb
card-1.99.2 lib/card/query/value.rb
card-1.99.1 lib/card/query/value.rb
card-1.99.0 lib/card/query/value.rb
card-1.98.3 lib/card/query/value.rb
card-1.98.2 lib/card/query/value.rb
card-1.98.1 lib/card/query/value.rb
card-1.98.0 lib/card/query/value.rb
card-1.97.0.1 lib/card/query/value.rb
card-1.97.0 lib/card/query/value.rb