ninjudd-model_set 0.10.3 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 3
2
+ :patch: 4
3
3
  :major: 0
4
4
  :minor: 10
data/lib/model_set.rb CHANGED
@@ -50,7 +50,7 @@ class ModelSet
50
50
  ( @missing_ids || [] ).uniq
51
51
  end
52
52
 
53
- [:add!, :unshift!, :subtract!, :intersect!, :reorder!].each do |action|
53
+ [:add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse_reorder!].each do |action|
54
54
  define_method(action) do |models|
55
55
  anchor!(:set)
56
56
  query.send(action, as_ids(models))
@@ -236,9 +236,8 @@ class ModelSet
236
236
 
237
237
  def sort!(&block)
238
238
  block ||= lambda {|a,b| a <=> b}
239
- self.ids = model_ids.sort do |a,b|
240
- block.call(by_id(a), by_id(b))
241
- end
239
+ sorted_ids = to_a.sort(&block).collect {|m| m.id}
240
+ model_ids.reorder!(sorted_ids)
242
241
  self
243
242
  end
244
243
 
@@ -247,10 +246,8 @@ class ModelSet
247
246
  end
248
247
 
249
248
  def sort_by!(&block)
250
- block ||= lambda {|a,b| a <=> b}
251
- self.ids = model_ids.sort_by do |id|
252
- yield by_id(id)
253
- end
249
+ sorted_ids = to_a.sort_by(&block).collect {|m| m.id}
250
+ model_ids.reorder!(sorted_ids)
254
251
  self
255
252
  end
256
253
 
@@ -1,6 +1,6 @@
1
1
  class ModelSet
2
2
  class SetQuery < Query
3
- delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse!, :to => :set
3
+ delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse!, :reverse_reorder!, :to => :set
4
4
 
5
5
  def anchor!(query)
6
6
  @set = query.ids.to_ordered_set
@@ -5,8 +5,6 @@ class ModelSet
5
5
  MAX_SPHINX_RESULTS = 1000
6
6
  MAX_QUERY_TIME = 5000 # milliseconds
7
7
 
8
- class SphinxError < StandardError; end
9
-
10
8
  attr_reader :conditions, :filters
11
9
 
12
10
  def anchor!(query)
@@ -14,8 +12,13 @@ class ModelSet
14
12
  end
15
13
 
16
14
  def add_filters!(filters)
17
- @filters ||= {}
18
- @filters.merge!(filters)
15
+ @filters ||= []
16
+
17
+ filters.each do |key, value|
18
+ next if value.nil?
19
+ @empty = true if value.kind_of?(Array) and value.empty?
20
+ @filters << [key, value]
21
+ end
19
22
  clear_cache!
20
23
  end
21
24
 
@@ -24,6 +27,7 @@ class ModelSet
24
27
  conditions.each do |field, value|
25
28
  next if value.nil?
26
29
  field = field.join(',') if field.kind_of?(Array)
30
+ value = value.collect {|v| '"' + v + '"'}.join('|') if value.kind_of?(Array)
27
31
  add_conditions!("@(#{field}) #{value}")
28
32
  end
29
33
  else
@@ -52,8 +56,12 @@ class ModelSet
52
56
  }
53
57
 
54
58
  def order_by!(field, mode = :ascending)
55
- raise "invalid mode: :#{mode}" unless SORT_MODES[mode]
56
- @sort_order = [SORT_MODES[mode], field.to_s]
59
+ if field == :relevance
60
+ @sort_order = [SORT_MODES[:relevance]]
61
+ else
62
+ raise "invalid mode: :#{mode}" unless SORT_MODES[mode]
63
+ @sort_order = [SORT_MODES[mode], field.to_s]
64
+ end
57
65
  clear_cache!
58
66
  end
59
67
 
@@ -72,10 +80,17 @@ class ModelSet
72
80
  @ids
73
81
  end
74
82
 
83
+ class SphinxError < StandardError
84
+ attr_accessor :opts
85
+ def message
86
+ "#{super}: #{opts.inspect}"
87
+ end
88
+ end
89
+
75
90
  private
76
91
 
77
92
  def fetch_results
78
- if @conditions.nil? or (@filters and @filters[id_field] and @filters[id_field].empty?)
93
+ if @conditions.nil? or @empty
79
94
  @count = 0
80
95
  @size = 0
81
96
  @ids = []
@@ -95,12 +110,11 @@ class ModelSet
95
110
  else
96
111
  search.SetLimits(0, MAX_SPHINX_RESULTS, MAX_SPHINX_RESULTS)
97
112
  end
113
+
98
114
  search.SetSortMode(*@sort_order) if @sort_order
99
115
  search.SetFilter('class_id', model_class.class_id) if model_class.respond_to?(:class_id)
100
116
 
101
117
  @filters and @filters.each do |field, value|
102
- next if value.nil?
103
-
104
118
  exclude = defined?(AntiObject) && value.kind_of?(AntiObject)
105
119
  value = ~value if exclude
106
120
 
@@ -114,15 +128,21 @@ class ModelSet
114
128
 
115
129
  begin
116
130
  response = search.Query(opts[:query], index)
117
- raise SphinxError, search.GetLastError unless response
131
+ unless response
132
+ e = SphinxError.new(search.GetLastError)
133
+ e.opts = opts
134
+ raise e
135
+ end
118
136
  rescue Exception => e
119
- on_exception(e, opts)
137
+ e = SphinxError.new(e) unless e.kind_of?(SphinxError)
138
+ e.opts = opts
139
+ on_exception(e)
120
140
  end
121
141
 
122
142
  @count = response['total_found']
123
143
  @ids = response['matches'].collect {|r| r['id']}.to_ordered_set
124
144
  @size = @ids.size
125
-
145
+
126
146
  after_query(opts)
127
147
  end
128
148
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ninjudd-model_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Balthrop
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-27 00:00:00 -07:00
12
+ date: 2009-07-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15