ninjudd-model_set 0.10.0 → 0.10.1

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: 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