25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
|
# File 'lib/simple_record/sharding.rb', line 25
def find_sharded(*params)
puts 'find_sharded ' + params.inspect
options = params.size > 1 ? params[1] : {}
if options[:shard] shard = options[:shard]
domains = shard.is_a?(Array) ? (shard.collect { |x| prefix_shard_name(x) }) : [prefix_shard_name(shard)]
else
domains = sharded_domains
end
single = false
by_ids = false
case params.first
when nil then
raise "Invalid parameters passed to find: nil."
when :all, :first, :count
else by_ids = true
unless params.first.is_a?(Array)
single = true
end
end
puts 'single? ' + single.inspect
puts 'by_ids? ' + by_ids.inspect
executor = options[:concurrent] ? Concur::Executor.new_multi_threaded_executor : Concur::Executor.new_single_threaded_executor
results = nil
if by_ids
results = []
else
results = ShardedResults.new(params)
end
futures = []
domains.each do |d|
p2 = params.dup
op2 = options.dup
op2[:from] = d
op2[:shard_find] = true
p2[1] = op2
futures << executor.execute do
puts 'executing=' + p2.inspect
rs = find(*p2)
puts 'rs=' + rs.inspect
rs
end
end
futures.each do |f|
puts 'getting future ' + f.inspect
if params.first == :first || single
puts 'f.get=' + f.get.inspect
return f.get if f.get
elsif by_ids
results << f.get if f.get
else
results.add_results f.get
end
end
executor.shutdown
if params.first == :first || single
return nil
elsif params.first == :count
return results.sum_count
end
results
end
|