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 +1 -1
- data/lib/model_set.rb +5 -8
- data/lib/model_set/set_query.rb +1 -1
- data/lib/model_set/sphinx_query.rb +32 -12
- metadata +2 -2
data/VERSION.yml
CHANGED
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
|
-
|
240
|
-
|
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
|
-
|
251
|
-
|
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
|
|
data/lib/model_set/set_query.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
56
|
-
|
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
|
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
|
-
|
131
|
+
unless response
|
132
|
+
e = SphinxError.new(search.GetLastError)
|
133
|
+
e.opts = opts
|
134
|
+
raise e
|
135
|
+
end
|
118
136
|
rescue Exception => e
|
119
|
-
|
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.
|
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-
|
12
|
+
date: 2009-07-01 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|