ninjudd-model_set 0.10.0 → 0.10.1

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: 0
2
+ :patch: 1
3
3
  :major: 0
4
4
  :minor: 10
@@ -1,6 +1,6 @@
1
1
  class ModelSet
2
2
  class SetQuery < Query
3
- delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :to => :set
3
+ delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse!, :to => :set
4
4
 
5
5
  def anchor!(query)
6
6
  @set = query.ids.to_ordered_set
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/../../vendor/sphinx_client/lib/sphinx'
3
3
  class ModelSet
4
4
  class SphinxQuery < Query
5
5
  MAX_SPHINX_RESULTS = 1000
6
+ MAX_QUERY_TIME = 5000 # milliseconds
6
7
 
7
8
  class SphinxError < StandardError; end
8
9
 
@@ -86,6 +87,7 @@ class ModelSet
86
87
  before_query(opts)
87
88
 
88
89
  search = Sphinx::Client.new
90
+ search.SetMaxQueryTime(MAX_QUERY_TIME)
89
91
  search.SetServer(self.class.server_host, self.class.server_port)
90
92
  search.SetMatchMode(Sphinx::Client::SPH_MATCH_EXTENDED2)
91
93
  if limit
@@ -40,6 +40,21 @@ class ModelSet
40
40
  clear_cache!
41
41
  end
42
42
 
43
+ def reverse!
44
+ if @sort_order
45
+ @sort_order = @sort_order.split(/\s*,\s*/).collect do |sub_order|
46
+ if sub_order =~ / DESC$/i
47
+ sub_order.slice(0..-6)
48
+ else
49
+ "#{sub_order} DESC"
50
+ end
51
+ end.join(', ')
52
+ else
53
+ @sort_order = "#{id_field_with_prefix} DESC"
54
+ end
55
+ clear_cache!
56
+ end
57
+
43
58
  def sql
44
59
  "#{select_clause} #{from_clause} #{order_clause} #{limit_clause}"
45
60
  end
data/lib/model_set.rb CHANGED
@@ -24,6 +24,8 @@ class ModelSet
24
24
 
25
25
  MAX_CACHE_SIZE = 1000 if not defined?(MAX_CACHE_SIZE)
26
26
 
27
+ attr_reader :created_at
28
+
27
29
  def initialize(query_or_models)
28
30
  if query_or_models.kind_of?(Query)
29
31
  @query = query_or_models
@@ -33,6 +35,11 @@ class ModelSet
33
35
  elsif query_or_models
34
36
  self.ids = as_ids(query_or_models)
35
37
  end
38
+ @created_at = Time.now
39
+ end
40
+
41
+ def older_than?(duration)
42
+ created_at.nil? or created_at < Time.now - duration
36
43
  end
37
44
 
38
45
  def ids
@@ -352,12 +359,15 @@ class ModelSet
352
359
  end
353
360
  end
354
361
 
355
- [:unsorted!, :limit!, :page!, :unlimited!].each do |method_name|
362
+ [:unsorted!, :limit!, :page!, :unlimited!, :reverse!].each do |method_name|
356
363
  clone_method method_name
357
364
  define_method(method_name) do |*args|
358
365
  # Don't change the query engine by default
359
366
  anchor!( extract_opt(:query_type, args) )
360
367
 
368
+ # Use the default query engine if the the current engine doesn't respond to the method.
369
+ anchor!(default_query_type) unless query.respond_to?(method_name)
370
+
361
371
  query.send(method_name, *args)
362
372
  self
363
373
  end
@@ -529,11 +539,11 @@ class ModelSet
529
539
  end
530
540
 
531
541
  def marshal_dump
532
- [ @query, @add_fields, @included_models ]
542
+ [ @query, @add_fields, @included_models, @created_at ]
533
543
  end
534
544
 
535
545
  def marshal_load(fields)
536
- @query, @add_fields, @included_models = fields
546
+ @query, @add_fields, @included_models, @created_at = fields
537
547
  end
538
548
 
539
549
  protected
@@ -105,6 +105,29 @@ class ModelSetTest < Test::Unit::TestCase
105
105
  set = HeroSet.with_universe('Marvel')
106
106
  assert_equal [captain.id, spidey.id, ironman.id], set.ids
107
107
  end
108
+
109
+ should "order and reverse set" do
110
+ captain = Hero.create(:name => 'Captain America', :universe => 'Marvel')
111
+ spidey = Hero.create(:name => 'Spider Man', :universe => 'Marvel')
112
+ wolverine = Hero.create(:name => 'Wolverine', :universe => 'Marvel' )
113
+ phoenix = Hero.create(:name => 'Phoenix', :universe => 'Marvel' )
114
+ ironman = Hero.create(:name => 'Iron Man', :universe => 'Marvel')
115
+
116
+ ids = [captain.id, ironman.id, phoenix.id, spidey.id, wolverine.id]
117
+ set = HeroSet.with_universe('Marvel')
118
+
119
+ set.order_by!('name')
120
+ assert_equal ids, set.ids
121
+
122
+ set.reverse!
123
+ assert_equal ids.reverse, set.ids
124
+
125
+ set.order_by!('name DESC')
126
+ assert_equal ids.reverse, set.ids
127
+
128
+ set.reverse!
129
+ assert_equal ids, set.ids
130
+ end
108
131
 
109
132
  should "have missing ids" do
110
133
  missing_id = 5555
@@ -231,6 +254,9 @@ class ModelSetTest < Test::Unit::TestCase
231
254
 
232
255
  @bot_set.sort! {|a,b| b.name <=> a.name}
233
256
  assert_equal [@bender,@c3po,@johnny5,@r2d2,@rosie,@t1000,@small_wonder].reverse, @bot_set.to_a
257
+
258
+ @bot_set.reverse!
259
+ assert_equal [@bender,@c3po,@johnny5,@r2d2,@rosie,@t1000,@small_wonder], @bot_set.to_a
234
260
  end
235
261
 
236
262
  should "sort a set by name" do
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.0
4
+ version: 0.10.1
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-17 00:00:00 -07:00
12
+ date: 2009-04-24 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15