Class: Card::Query::Value

Inherits:
Object show all
Includes:
Clause
Defined in:
lib/card/query/value.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Clause

#match_prep, #quote, #safe_sql

Constructor Details

#initialize(rawvalue, query) ⇒ Value

Returns a new instance of Value.



9
10
11
12
13
# File 'lib/card/query/value.rb', line 9

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

Instance Attribute Details

#operatorObject (readonly)

Returns the value of attribute operator.



7
8
9
# File 'lib/card/query/value.rb', line 7

def operator
  @operator
end

#queryObject (readonly)

Returns the value of attribute query.



7
8
9
# File 'lib/card/query/value.rb', line 7

def query
  @query
end

#valueObject (readonly)

Returns the value of attribute value.



7
8
9
# File 'lib/card/query/value.rb', line 7

def value
  @value
end

Instance Method Details

#canonicalize_operatorObject



26
27
28
29
30
31
32
# File 'lib/card/query/value.rb', line 26

def canonicalize_operator
  if target = OPERATORS[@operator.to_s]
    @operator = target
  else
    fail BadQuery, "Invalid Operator #{@operator}"
  end
end

#parse_value(rawvalue) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/card/query/value.rb', line 15

def parse_value rawvalue
  operator =
    case rawvalue
    when Array;     rawvalue.shift
    when String;    '='
    when Integer;   '='
    else raise("Invalid Condition Clause #{rawvalue}.inspect}")
    end
  [operator, rawvalue]
end

#sqlize(v) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/card/query/value.rb', line 35

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

#to_sql(field) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/card/query/value.rb', line 43

def to_sql field
  op,v = @operator, @value
  table = @query.table_alias

  field, v = case field.to_s
    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