Class: DataMapper::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/dm-filemaker-adapter/core_patches.rb

Instance Method Summary collapse

Instance Method Details

#fmp_operator(operation) ⇒ Object

Convert operation class to operator string



114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/dm-filemaker-adapter/core_patches.rb', line 114

def fmp_operator(operation)
  case
  when operation[/GreaterThanOrEqualTo/]; '>='
  when operation[/LessThanOrEqualTo/]; '<='
  when operation[/GreaterThan/]; '>'
  when operation[/LessThan/]; '<'
  when operation[/EqualTo/]; '=='
  when operation[/Like/];
  when operation[/Null/];
  else nil
  end
end

#fmp_options(query = self) ⇒ Object

Get fmp options hash from query



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/dm-filemaker-adapter/core_patches.rb', line 128

def fmp_options(query=self)
  fm_options = {}
  fm_options[:skip_records] = query.offset if query.offset
  fm_options[:max_records] = query.limit if query.limit
  if query.order
    fm_options[:sort_field] = query.order.collect do |ord|
      ord.target.field
    end
    fm_options[:sort_order] = query.order.collect do |ord|
      ord.operator.to_s + 'end'
    end
  end
  fm_options
end

#to_fmp_query(input = self.conditions) ⇒ Object

Convert dm query conditions to fmp query params (hash)



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/dm-filemaker-adapter/core_patches.rb', line 63

def to_fmp_query(input=self.conditions)
  #puts "FMP_QUERY input #{input.class.name}"
  rslt = if input.class.name[/OrOperation/]
    #puts "FMP_QUERY OrOperation #{input.class}"
    input.operands.collect do |o|
      r = to_fmp_query o
      #puts "FMP_QUERY or-operation operand #{r}"
      r
    end
  elsif input.class.name[/AndOperation/]
    #puts "FMP_QUERY AndOperation input class #{input.class}"
    #puts "FMP_QUERY AndOperation input value #{input.inspect}"
    out = {}
    input.operands.each do |k,v|
      #puts "FMP_QUERY and-operation pre-process operand key:val #{k}:#{v}"
      r = to_fmp_query(k).to_hash
      #puts "FMP_QUERY and-operation post-process operand #{r}"
      if r.is_a?(Hash)
        #puts "FMP_QUERY and-operation operand is a hash"
        # Filemaker can't have the same field twice in a single find request,
        # but we can mash the two conditions together in a way that FMP can use.
        out.merge!(r){|k, oldv, newv| "#{oldv} #{newv}"}
      else
        #puts "FMP_QUERY and-operation operand is NOT a hash"
        out = r
        break
      end
    end
    out
  elsif input.class.name[/NullOperation/] || input.nil?
    #puts "FMP_QUERY NullOperation #{input.class}"
    {}
  else
    #puts "FMP_QUERY else input class #{input.class}"
    #puts "FMP_QUERY else input value #{input.inspect}"
    #puts "FMP_QUERY else-options #{self.options.inspect}"
    #prepare_fmp_attributes({input.subject=>input.value}, :prepend=>fmp_operator(input.class.name))
    value = (
      self.options[input.keys[0]] ||
      self.options[input.subject.name] ||
      self.options.find{|o,v| o.respond_to?(:target) && o.target.to_s == input.subject.name.to_s}[1] ||
      input.value
    ) rescue input.value   #(puts "ERROR #{$!}"; input.value)
    #puts "FMP_QUERY else-value #{value}"
    repository.adapter.prepare_fmp_attributes({input.subject=>value}, :prepend=>fmp_operator(input.class.name))
  end
  #puts "FMP_QUERY output #{rslt.inspect}"
  rslt
end