ninjudd-model_set 0.10.3 → 0.10.4

Sign up to get free protection for your applications and to get access to all the features.
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