0
@@ -104,47 +104,23 @@ module DataMapper
0
require "salesforce_api"
0
@connection = SalesforceAPI::Connection.new(URI.unescape(@uri.user), @uri.password, "#{ENV["HOME"]}/.salesforce/#{basename}").driver
0
- repository = query.repository
0
- properties = query.fields
0
- properties_with_indexes = Hash[*properties.zip((0...properties.size).to_a).flatten]
0
Collection.new(query) do |set|
0
- conditions = query.conditions.map {|c| SQL.from_condition(c, repository)}.compact.join(") AND (")
0
- query_string = "SELECT #{query.fields.map {|f| f.field}.join(", ")} from #{query.model.storage_name(repository.name)}"
0
- query_string << " WHERE (#{conditions})" unless conditions.empty?
0
- query_string << " ORDER BY #{SQL.order(query.order[0])}" unless query.order.empty?
0
- query_string << " LIMIT #{query.limit}" if query.limit
0
- DataMapper.logger.debug query_string
0
- results = @connection.query(:queryString => query_string).result
0
- rescue SOAP::FaultError => e
0
- raise SalesforceAPI::ReadError, e.message
0
- results = results.size > 0 ? results.records : []
0
- results.each do |result|
0
- props = properties_with_indexes.inject([]) do |accum, (prop, idx)|
0
- accum[idx] = result.send(soap_attr(prop, repository))
0
+ read(query, set, true)
0
+ read(query, query.model, false)
0
+ def read(query, set, arr = true)
0
repository = query.repository
0
properties = query.fields
0
properties_with_indexes = Hash[*properties.zip((0...properties.size).to_a).flatten]
0
conditions = query.conditions.map {|c| SQL.from_condition(c, repository)}.compact.join(") AND (")
0
query_string = "SELECT #{query.fields.map {|f| f.field}.join(", ")} from #{query.model.storage_name(repository.name)}"
0
@@ -159,20 +135,25 @@ module DataMapper
0
rescue SOAP::FaultError => e
0
raise SalesforceAPI::ReadError, e.message
0
+ return nil unless results.records
0
- results = results.size > 0 ? results.records : []
0
- result = results.first
0
- return nil unless result
0
+ # This is the core logic that handles the difference between all/first
0
+ (results.records || []).each do |result|
0
+ props = props_from_result(properties_with_indexes, result, repository)
0
+ arr ? set.load(props) : (break set.load(props, query))
0
- props = properties_with_indexes.inject([]) do |accum, (prop, idx)|
0
- accum[idx] = result.send(soap_attr(prop, repository))
0
+ def props_from_result(properties_with_indexes, result, repo)
0
+ properties_with_indexes.inject([]) do |accum, (prop, idx)|
0
+ accum[idx] = result.send(soap_attr(prop, repo))
0
- return query.model.load(props, query)
0
def update(attributes, query)
0
arr = if key_condition = query.conditions.find {|op,prop,val| prop.key?}
0
[ make_sforce_obj(query, attributes, key_condition.last) ]
Comments
YAY! ::claps hands::