zermelo 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc193e2da0a7a65f2a3643520bd99663172a3d2e
4
- data.tar.gz: ee336568cf9e99aae87ac54bbe6ce0db00500e42
3
+ metadata.gz: c8442ff692747d2d56fc983ec85bc6665656748a
4
+ data.tar.gz: a2ef423d8095fb2d9e7f12f5cf84ca2dadc9c528
5
5
  SHA512:
6
- metadata.gz: 46fea7c0eee8e85846323a42ce4a83caee6761e48ad672c7ba70fa0a2ddd862b5d5aac849a8ce7d7d0b9c4c7deebec9bf90d1c918878c9ec73fe8b08a130cb9d
7
- data.tar.gz: 0257355f3e92135da783b321db21850adb806758ba1089bf6a3837bf661b93925a66771ad760ad6796914fbeb269a3495720f604dad5977c1d103144143d5756
6
+ metadata.gz: 5364e3f2a9ea70de9f7ec5142909736952d4ab3d3167823877ed40c49759ddbffa002756cbe730d60357776768707f92f0557120b1fe3877439d30a56833ef45
7
+ data.tar.gz: d15a22b19592f45711c46b684d0fe0d943c971c87a21843a2d291692c5af51756cb8542545e55e7a88042429c45c5021158e35034bf9b98916ecf3dca006072c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Zermelo Changelog
2
2
 
3
+ # 1.2.1 - 2015-08-07
4
+
5
+ * 'empty' filter method (637d0c9c)
6
+ * bugfix; temp redis set not deleted when matching against multiple values for a field (9df5241d)
7
+ * use Redis .scan instead of .keys for regex index lookup if available (de75802c)
8
+
3
9
  # 1.2.0 - 2015-06-24
4
10
 
5
11
  * spec cleanup, apply to multiple backends if not backend-specific
data/Gemfile CHANGED
@@ -1,20 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- if RUBY_VERSION.split('.')[0] == '1' && RUBY_VERSION.split('.')[1] == '8'
4
- gemspec :name => 'zermelo-ruby1.8'
5
- else
6
- gemspec :name => 'zermelo'
7
- end
3
+ gemspec :name => 'zermelo'
8
4
 
9
5
  group :test do
10
- gem 'influxdb'
6
+ gem 'influxdb', '0.1.9'
11
7
  gem 'redis'
12
8
  gem 'rspec', '>= 3.0.0'
13
9
  gem 'simplecov', :require => false
14
-
15
- if RUBY_VERSION.split('.')[0] == '1' && RUBY_VERSION.split('.')[1] == '8'
16
- gem 'timecop', '0.6.1'
17
- else
18
- gem 'timecop'
19
- end
10
+ gem 'timecop'
20
11
  end
@@ -6,12 +6,13 @@ module Zermelo
6
6
 
7
7
  extend Forwardable
8
8
 
9
- def_delegators :filter, :intersect, :union, :diff, :sort,
10
- :find_by_id, :find_by_ids, :find_by_id!, :find_by_ids!,
11
- :page, :all, :each, :collect, :map,
12
- :select, :find_all, :reject, :destroy_all,
13
- :ids, :count, :empty?, :exists?,
14
- :associated_ids_for
9
+ def_delegators :filter,
10
+ :intersect, :union, :diff, :sort, :offset, :page, :empty,
11
+ :find_by_id, :find_by_ids, :find_by_id!, :find_by_ids!,
12
+ :all, :each, :collect, :map,
13
+ :select, :find_all, :reject, :destroy_all,
14
+ :ids, :count, :empty?, :exists?,
15
+ :associated_ids_for
15
16
 
16
17
  def initialize(type, parent_klass, parent_id, name)
17
18
  @type = type
@@ -15,10 +15,6 @@ module Zermelo
15
15
  # :timestamp
16
16
  # end
17
17
 
18
- def generate_lock
19
- Zermelo::Locks::RedisLock.new
20
- end
21
-
22
18
  def filter(ids_key, associated_class, callback_target_class = nil,
23
19
  callback_target_id = nil, callbacks = nil, sort_order = nil)
24
20
 
@@ -194,10 +190,22 @@ module Zermelo
194
190
  :object => :index
195
191
  ))
196
192
 
197
- matching_sets = Zermelo.redis.keys(key_root + ":*").inject([]) do |memo, k|
193
+ key_pat = "#{key_root}:?*"
194
+
195
+ matching_sets = if (Zermelo.redis_version.split('.') <=> ['2', '8', '0']) == 1
196
+ # lock will be subsumed by outer lock if present -- required to
197
+ # know that scan is getting consistent results
198
+ associated_class.lock do
199
+ Zermelo.redis.scan_each(:match => key_pat).to_a
200
+ end
201
+ else
202
+ # SCAN is only supported in Redis >= 2.8.0
203
+ Zermelo.redis.keys(key_pat)
204
+ end
205
+
206
+ matching_sets.select! do |k|
198
207
  k =~ /^#{key_root}:(.+)$/
199
- memo << k if value === $1
200
- memo
208
+ value === $1
201
209
  end
202
210
 
203
211
  Zermelo.redis.sunionstore(idx_result, matching_sets) unless matching_sets.empty?
@@ -4,6 +4,7 @@ require 'zermelo/records/errors'
4
4
 
5
5
  require 'zermelo/filters/steps/list_step'
6
6
  require 'zermelo/filters/steps/set_step'
7
+ require 'zermelo/filters/steps/empty_step'
7
8
  require 'zermelo/filters/steps/sort_step'
8
9
 
9
10
  module Zermelo
@@ -76,6 +77,12 @@ module Zermelo
76
77
  :limit => per_page}, {}))
77
78
  end
78
79
 
80
+ def empty
81
+ self.class.new(@backend, @initial_key, @associated_class,
82
+ @callback_target_class, @callback_target_id, @callbacks, @sort_order,
83
+ self, ::Zermelo::Filters::Steps::EmptyStep.new({}, {}))
84
+ end
85
+
79
86
  # step users
80
87
  def exists?(e_id)
81
88
  lock(false) { _exists?(e_id) }
@@ -0,0 +1,45 @@
1
+ require 'zermelo/filters/steps/base_step'
2
+
3
+ # NB: temp keys for now are bare redis keys, should be full Key objects
4
+ module Zermelo
5
+ module Filters
6
+ class Steps
7
+ class EmptyStep < Zermelo::Filters::Steps::BaseStep
8
+ def self.accepted_types
9
+ [:set, :sorted_set, :list]
10
+ end
11
+
12
+ def self.returns_type
13
+ nil # same as the source type
14
+ end
15
+
16
+ def resolve(backend, associated_class, opts = {})
17
+ case backend
18
+ when Zermelo::Backends::Redis
19
+ source = opts[:source]
20
+ temp_keys = opts[:temp_keys]
21
+ shortcut = opts[:shortcut]
22
+
23
+ dest_set = associated_class.send(:temp_key, source.type)
24
+ r_dest_set = backend.key_to_redis_key(dest_set)
25
+ temp_keys << dest_set
26
+
27
+ return dest_set if shortcut.nil?
28
+
29
+ shortcut_params = case source.type
30
+ when :sorted_set
31
+ [r_dest_set, order] + opts[:shortcut_args]
32
+ else
33
+ [r_dest_set] + opts[:shortcut_args]
34
+ end
35
+
36
+ Zermelo::Filters::Redis::SHORTCUTS[source.type][shortcut].
37
+ call(*shortcut_params)
38
+ when Zermelo::Backends::InfluxDB
39
+ # FIXME
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -39,6 +39,7 @@ module Zermelo
39
39
 
40
40
  if val.is_a?(Enumerable)
41
41
  conditions_set = associated_class.send(:temp_key, source.type)
42
+ temp_keys << conditions_set
42
43
  r_conditions_set = backend.key_to_redis_key(conditions_set)
43
44
 
44
45
  backend.temp_key_wrap do |conditions_temp_keys|
@@ -130,7 +131,8 @@ module Zermelo
130
131
 
131
132
  return dest_set if shortcut.nil?
132
133
 
133
- shortcut_params = if source.type == :sorted_set
134
+ shortcut_params = case source.type
135
+ when :sorted_set
134
136
  [r_dest_set, order] + opts[:shortcut_args]
135
137
  else
136
138
  [r_dest_set] + opts[:shortcut_args]
@@ -20,12 +20,13 @@ module Zermelo
20
20
 
21
21
  extend Forwardable
22
22
 
23
- def_delegators :filter, :intersect, :union, :diff, :sort,
24
- :find_by_id, :find_by_ids, :find_by_id!, :find_by_ids!,
25
- :page, :all, :each, :collect, :map,
26
- :select, :find_all, :reject, :destroy_all,
27
- :ids, :count, :empty?, :exists?,
28
- :associated_ids_for
23
+ def_delegators :filter,
24
+ :intersect, :union, :diff, :sort, :offset, :page, :empty,
25
+ :find_by_id, :find_by_ids, :find_by_id!, :find_by_ids!,
26
+ :all, :each, :collect, :map,
27
+ :select, :find_all, :reject, :destroy_all,
28
+ :ids, :count, :empty?, :exists?,
29
+ :associated_ids_for
29
30
 
30
31
  def generate_id
31
32
  return SecureRandom.uuid if SecureRandom.respond_to?(:uuid)
@@ -1,3 +1,3 @@
1
1
  module Zermelo
2
- VERSION = '1.2.0'
2
+ VERSION = '1.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zermelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Graham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-28 00:00:00.000000000 Z
11
+ date: 2015-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -85,6 +85,7 @@ files:
85
85
  - lib/zermelo/filters/influxdb.rb
86
86
  - lib/zermelo/filters/redis.rb
87
87
  - lib/zermelo/filters/steps/base_step.rb
88
+ - lib/zermelo/filters/steps/empty_step.rb
88
89
  - lib/zermelo/filters/steps/list_step.rb
89
90
  - lib/zermelo/filters/steps/set_step.rb
90
91
  - lib/zermelo/filters/steps/sort_step.rb