Sha256: a50eef3a35c73be249b0c31ce10ecda99965351f0226866b6669bba96b428c13

Contents?: true

Size: 1.89 KB

Versions: 22

Compression:

Stored size: 1.89 KB

Contents

class Card::Query
  class ValueClause < Clause
    def initialize clause, cardclause
      @cardclause = cardclause

      # bare value shortcut
      @clause = case clause
        when ValueClause; clause.instance_variable_get('@clause')  # FIXME what a hack (what's this for?)
        when Array;     clause
        when String;    ['=', clause]
        when Integer;   ['=', clause]
        else raise("Invalid Condition Clause #{clause.inspect}")
      end

      # operator aliases
      @clause[0] = @clause[0].to_s
      if target = OPERATORS[@clause[0]]
        @clause[0] = target
      end

      # check valid operator
      raise("Invalid Operator #{@clause[0]}") unless OPERATORS.has_key?(@clause[0])

      # handle IN  #FIXME -- shouldn't this handle "not in", too?
      if @clause[0]=='in' and !@clause[1].is_a?(CardClause) and !@clause[1].is_a?(RefClause)
        @clause = [@clause[0], @clause[1..-1]]
      end
    end

    def op
      @clause[0]
    end

    def sqlize(v)
      case v
        when CardClause, RefClause, SqlCond; v.to_sql
        when Array;    "(" + v.flatten.collect {|x| sqlize(x)}.join(',') + ")"
        else quote(v.to_s)
      end
    end

    def to_sql field
      op,v = @clause
      #warn "to_sql(#{field}), #{op}, #{v}, #{@cardclause.inspect}"
      v=@cardclause.selfname if v=='_self'
      table = @cardclause.table_alias

      #warn "to_sql #{field}, #{v} (#{op})"
      field, v = case field
        when "cond";     return "(#{sqlize(v)})"
        when "name";     ["#{table}.key",      [v].flatten.map(&:to_name).map(&:key)]
        when "content";  ["#{table}.db_content", v]
        else;            ["#{table}.#{safe_sql(field)}", v]
        end

      v = v[0] if Array===v && v.length==1 && op != 'in'
      if op=='~'
        cxn, v = match_prep(v)
        %{#{field} #{cxn.match(sqlize(v))}}
      else
        "#{field} #{op} #{sqlize(v)}"
      end
    end
  end
end

Version data entries

22 entries across 22 versions & 2 rubygems

Version Path
card-1.16.6 lib/card/query/value_clause.rb
card-1.16.5 lib/card/query/value_clause.rb
card-1.16.4 lib/card/query/value_clause.rb
card-1.16.3 lib/card/query/value_clause.rb
card-1.16.2 lib/card/query/value_clause.rb
card-1.16.1 lib/card/query/value_clause.rb
card-1.16.0 lib/card/query/value_clause.rb
card-1.15.7 lib/card/query/value_clause.rb
card-1.15.6 lib/card/query/value_clause.rb
card-1.15.5 lib/card/query/value_clause.rb
card-1.15.4 lib/card/query/value_clause.rb
card-1.15.3 lib/card/query/value_clause.rb
card-1.15.2 lib/card/query/value_clause.rb
card-1.15.1 lib/card/query/value_clause.rb
card-1.15.0 lib/card/query/value_clause.rb
card-1.15.pre2 lib/card/query/value_clause.rb
card-1.15.pre lib/card/query/value_clause.rb
wagn-1.14.9 lib/card/query/value_clause.rb
wagn-1.14.8 lib/card/query/value_clause.rb
wagn-1.14.7 lib/card/query/value_clause.rb