datastax_rails 1.0.6 → 1.0.8
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/README.rdoc +7 -2
- data/Rakefile +1 -0
- data/config/schema.xml.erb +1 -0
- data/lib/datastax_rails/base.rb +34 -2
- data/lib/datastax_rails/callbacks.rb +1 -1
- data/lib/datastax_rails/cql/base.rb +11 -2
- data/lib/datastax_rails/cql/consistency.rb +2 -1
- data/lib/datastax_rails/cql/delete.rb +1 -1
- data/lib/datastax_rails/cql/insert.rb +1 -1
- data/lib/datastax_rails/cql/select.rb +1 -1
- data/lib/datastax_rails/cql/truncate.rb +1 -0
- data/lib/datastax_rails/cql/update.rb +15 -12
- data/lib/datastax_rails/errors.rb +5 -5
- data/lib/datastax_rails/persistence.rb +29 -7
- data/lib/datastax_rails/reflection.rb +1 -1
- data/lib/datastax_rails/relation/search_methods.rb +25 -0
- data/lib/datastax_rails/relation.rb +14 -4
- data/lib/datastax_rails/version.rb +2 -1
- data/lib/datastax_rails.rb +3 -4
- data/spec/datastax_rails/base_spec.rb +6 -0
- data/spec/datastax_rails/cql/select_spec.rb +3 -0
- data/spec/datastax_rails/cql/update_spec.rb +15 -0
- data/spec/datastax_rails/persistence_spec.rb +31 -0
- data/spec/datastax_rails/relation/search_methods_spec.rb +18 -0
- data/spec/dummy/log/development.log +80 -0
- data/spec/dummy/log/test.log +7179 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/default_consistency_shared_examples.rb +14 -0
- metadata +11 -11
- data/lib/datastax_rails/consistency.rb +0 -33
- data/lib/solr_no_escape.rb +0 -28
data/README.rdoc
CHANGED
@@ -67,5 +67,10 @@ attributes on any model. DSR will only upload schema files if they have changed
|
|
67
67
|
|
68
68
|
=== Known issues
|
69
69
|
|
70
|
-
Calling
|
71
|
-
in DSE that is supposedly fixed in the upcoming 2.2 release.
|
70
|
+
Calling +find+ on a model with a bogus ID returns an empty model instead of RecordNotFound. This is due to a bug
|
71
|
+
in DSE that is supposedly fixed in the upcoming 2.2 release.
|
72
|
+
|
73
|
+
=== More information
|
74
|
+
|
75
|
+
The documentation for DatastaxRails::Base and DatastaxRails::SearchMethods will give you quite a few examples
|
76
|
+
of things you can do. You can find a copy of the latest documentation on line at http://rdoc.info/github/jasonmk/datastax_rails/master/frames.
|
data/Rakefile
CHANGED
data/config/schema.xml.erb
CHANGED
data/lib/datastax_rails/base.rb
CHANGED
@@ -133,6 +133,32 @@ module DatastaxRails #:nodoc:
|
|
133
133
|
# user.name = "David"
|
134
134
|
# user.occupation = "Code Artist"
|
135
135
|
#
|
136
|
+
# == Consistency
|
137
|
+
#
|
138
|
+
# Cassandra has a concept of consistency levels when it comes to saving records. For a
|
139
|
+
# detailed discussion on Cassandra data consistency, see:
|
140
|
+
# http://www.datastax.com/docs/1.0/dml/data_consistency
|
141
|
+
#
|
142
|
+
# DatastaxRails allows you to specify the consistency when you save and retrieve objects.
|
143
|
+
#
|
144
|
+
# user = User.new(:name => 'David')
|
145
|
+
# user.save(:consistency => 'ALL')
|
146
|
+
#
|
147
|
+
# User.create(params[:user], {:consistency => :local_quorum})
|
148
|
+
#
|
149
|
+
# User.consistency(:local_quorum).where(:name => 'David')
|
150
|
+
#
|
151
|
+
# The default consistency level in DatastaxRails is QUORUM for writes and for retrieval
|
152
|
+
# by ID. SOLR only supports a consistency level of ONE. See the documentation for
|
153
|
+
# SearchMethods#consistency for a more detailed explanation.
|
154
|
+
#
|
155
|
+
# The overall default consistency for a given model can be overridden by adding a method
|
156
|
+
# to the model like so:
|
157
|
+
#
|
158
|
+
# def default_consistency
|
159
|
+
# :local_quorum
|
160
|
+
# end
|
161
|
+
#
|
136
162
|
# == Conditions
|
137
163
|
#
|
138
164
|
# Conditions are specified as a hash representing key/value pairs that will eventually be passed to SOLR or as
|
@@ -265,7 +291,6 @@ module DatastaxRails #:nodoc:
|
|
265
291
|
include ActiveModel::MassAssignmentSecurity
|
266
292
|
|
267
293
|
include Connection
|
268
|
-
include Consistency
|
269
294
|
include Identity
|
270
295
|
include FinderMethods
|
271
296
|
include Batches
|
@@ -281,7 +306,6 @@ module DatastaxRails #:nodoc:
|
|
281
306
|
include Timestamps
|
282
307
|
include Serialization
|
283
308
|
include Migrations
|
284
|
-
# include Mocking
|
285
309
|
|
286
310
|
# Stores the default scope for the class
|
287
311
|
class_attribute :default_scopes, :instance_writer => false
|
@@ -403,6 +427,10 @@ module DatastaxRails #:nodoc:
|
|
403
427
|
self.class.attribute_names
|
404
428
|
end
|
405
429
|
|
430
|
+
def valid_consistency?(level) #:nodoc:
|
431
|
+
self.class.validate_consistency(level.to_s.upcase)
|
432
|
+
end
|
433
|
+
|
406
434
|
private
|
407
435
|
def populate_with_current_scope_attributes
|
408
436
|
return unless self.class.scope_attributes?
|
@@ -486,6 +514,10 @@ module DatastaxRails #:nodoc:
|
|
486
514
|
search.raw_results.map { |result| result.primary_key }
|
487
515
|
end
|
488
516
|
|
517
|
+
def valid_consistency?(level) #:nodoc:
|
518
|
+
DatastaxRails::Cql::Consistency::VALID_CONSISTENCY_LEVELS.include?(level)
|
519
|
+
end
|
520
|
+
|
489
521
|
protected
|
490
522
|
|
491
523
|
|
@@ -1,10 +1,19 @@
|
|
1
1
|
module DatastaxRails
|
2
2
|
module Cql
|
3
3
|
class Base
|
4
|
-
|
5
|
-
|
4
|
+
# Base initialize that sets the default consistency.
|
5
|
+
def initialize(klass, *args)
|
6
|
+
@consistency = klass.respond_to?(:default_consistency) ? klass.default_consistency.to_s.upcase : DatastaxRails::Cql::Consistency::QUORUM
|
7
|
+
end
|
8
|
+
|
9
|
+
# Abstract. Should be overridden by subclasses
|
10
|
+
def to_cql
|
11
|
+
raise NotImplementedError
|
6
12
|
end
|
7
13
|
|
14
|
+
# Generates the CQL and calls Cassandra to execute it.
|
15
|
+
# If you are using this outside of Rails, then DatastaxRails::Base.connection must have
|
16
|
+
# already been set up (Rails does this for you).
|
8
17
|
def execute
|
9
18
|
cql = self.to_cql
|
10
19
|
Rails.logger.debug(cql)
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module DatastaxRails
|
2
2
|
module Cql
|
3
3
|
module Consistency
|
4
|
+
ANY = 'ANY'
|
4
5
|
ONE = 'ONE'
|
5
6
|
QUORUM = 'QUORUM'
|
6
7
|
LOCAL_QUORUM = 'LOCAL_QUORUM'
|
7
8
|
EACH_QUORUM = 'EACH_QUORUM'
|
8
9
|
ALL = 'ALL'
|
9
10
|
|
10
|
-
VALID_CONSISTENCY_LEVELS = [ONE, QUORUM, LOCAL_QUORUM, EACH_QUORUM, ALL]
|
11
|
+
VALID_CONSISTENCY_LEVELS = [ANY, ONE, QUORUM, LOCAL_QUORUM, EACH_QUORUM, ALL]
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -4,8 +4,8 @@ module DatastaxRails
|
|
4
4
|
def initialize(klass, key)
|
5
5
|
@klass = klass
|
6
6
|
@key = key
|
7
|
-
@consistency = DatastaxRails::Cql::Consistency::QUORUM
|
8
7
|
@columns = {}
|
8
|
+
super
|
9
9
|
end
|
10
10
|
|
11
11
|
def using(consistency)
|
@@ -34,6 +34,7 @@ module DatastaxRails
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def to_cql
|
37
|
+
columns = @columns.dup
|
37
38
|
values = []
|
38
39
|
|
39
40
|
stmt = "update #{@klass.column_family} using consistency #{@consistency} "
|
@@ -46,19 +47,21 @@ module DatastaxRails
|
|
46
47
|
stmt << "AND TIMESTAMP #{@timestamp}"
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
50
|
+
unless columns.empty?
|
51
|
+
stmt << "SET "
|
52
|
+
|
53
|
+
first_entry = columns.shift
|
54
|
+
|
55
|
+
stmt << "#{first_entry.first.to_s} = ?"
|
56
|
+
values << first_entry.last
|
57
|
+
|
58
|
+
columns.each do |k,v|
|
59
|
+
stmt << ", #{k.to_s} = ?"
|
60
|
+
values << v
|
61
|
+
end
|
59
62
|
end
|
60
63
|
|
61
|
-
stmt << "WHERE KEY IN (?)"
|
64
|
+
stmt << " WHERE KEY IN (?)"
|
62
65
|
values << @key
|
63
66
|
|
64
67
|
CassandraCQL::Statement.sanitize(stmt, values)
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module DatastaxRails
|
2
|
-
class DatastaxRailsError < StandardError
|
2
|
+
class DatastaxRailsError < StandardError #:nodoc:
|
3
3
|
end
|
4
4
|
|
5
|
-
class AssociationTypeMismatch < DatastaxRailsError
|
5
|
+
class AssociationTypeMismatch < DatastaxRailsError #:nodoc:
|
6
6
|
end
|
7
7
|
|
8
|
-
class RecordNotSaved < DatastaxRailsError
|
8
|
+
class RecordNotSaved < DatastaxRailsError #:nodoc:
|
9
9
|
end
|
10
10
|
|
11
|
-
class DeleteRestrictionError < DatastaxRailsError
|
11
|
+
class DeleteRestrictionError < DatastaxRailsError #:nodoc:
|
12
12
|
end
|
13
13
|
|
14
|
-
class RecordNotFound < DatastaxRailsError
|
14
|
+
class RecordNotFound < DatastaxRailsError #:nodoc:
|
15
15
|
end
|
16
16
|
end
|
@@ -9,8 +9,21 @@ module DatastaxRails
|
|
9
9
|
module ClassMethods
|
10
10
|
# Removes one or more records with corresponding keys
|
11
11
|
def remove(*keys)
|
12
|
+
options = {}
|
13
|
+
if keys.last.is_a?(Hash)
|
14
|
+
options = keys.pop
|
15
|
+
end
|
12
16
|
ActiveSupport::Notifications.instrument("remove.datastax_rails", :column_family => column_family, :key => key) do
|
13
|
-
cql.delete(keys)
|
17
|
+
c = cql.delete(keys)
|
18
|
+
if(options[:consistency])
|
19
|
+
level = options[:consistency].to_s.upcase
|
20
|
+
if(valid_consistency?(level))
|
21
|
+
c.using(level)
|
22
|
+
else
|
23
|
+
raise ArgumentError, "'#{level}' is not a valid Cassandra consistency level"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
c.execute
|
14
27
|
end
|
15
28
|
end
|
16
29
|
|
@@ -28,11 +41,20 @@ module DatastaxRails
|
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
31
|
-
def write(key, attributes,
|
44
|
+
def write(key, attributes, options = {})
|
32
45
|
key.tap do |key|
|
33
|
-
attributes = encode_attributes(attributes, schema_version)
|
46
|
+
attributes = encode_attributes(attributes, options[:schema_version])
|
34
47
|
ActiveSupport::Notifications.instrument("insert.datastax_rails", :column_family => column_family, :key => key, :attributes => attributes) do
|
35
|
-
cql.update(key.to_s).columns(attributes)
|
48
|
+
c = cql.update(key.to_s).columns(attributes)
|
49
|
+
if(options[:consistency])
|
50
|
+
level = options[:consistency].to_s.upcase
|
51
|
+
if(valid_consistency?(level))
|
52
|
+
c.using(options[:consistency])
|
53
|
+
else
|
54
|
+
raise ArgumentError, "'#{level}' is not a valid Cassandra consistency level"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
c.execute
|
36
58
|
end
|
37
59
|
end
|
38
60
|
end
|
@@ -89,8 +111,8 @@ module DatastaxRails
|
|
89
111
|
create_or_update(options) || raise(RecordNotSaved)
|
90
112
|
end
|
91
113
|
|
92
|
-
def destroy
|
93
|
-
self.class.remove(key)
|
114
|
+
def destroy(options = {})
|
115
|
+
self.class.remove(key, options)
|
94
116
|
@destroyed = true
|
95
117
|
freeze
|
96
118
|
end
|
@@ -134,7 +156,7 @@ module DatastaxRails
|
|
134
156
|
|
135
157
|
def write(options) #:nodoc:
|
136
158
|
changed_attributes = changed.inject({}) { |h, n| h[n] = read_attribute(n); h }
|
137
|
-
self.class.write(key, changed_attributes, schema_version)
|
159
|
+
self.class.write(key, changed_attributes, options.merge(:schema_version => schema_version))
|
138
160
|
end
|
139
161
|
end
|
140
162
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'active_support/core_ext/class/attribute'
|
2
2
|
require 'active_support/core_ext/object/inclusion'
|
3
3
|
|
4
|
-
# This is shamelessly ripped from Active Record 3.1
|
5
4
|
module DatastaxRails
|
5
|
+
# This is shamelessly ripped from Active Record 3.1
|
6
6
|
# = DatastaxRails Reflection
|
7
7
|
module Reflection # :nodoc:
|
8
8
|
extend ActiveSupport::Concern
|
@@ -1,6 +1,31 @@
|
|
1
1
|
module DatastaxRails
|
2
2
|
module SearchMethods
|
3
3
|
|
4
|
+
# The default consistency level for DSR is QUORUM when searching by ID.
|
5
|
+
# For all searches using SOLR, the default consistency is ONE. Use this
|
6
|
+
# to override it in either case.
|
7
|
+
#
|
8
|
+
# Model.consistency(:local_quorum).find("12345")
|
9
|
+
#
|
10
|
+
# Note that Solr searches (basically anything but find by id) don't allow you
|
11
|
+
# to specify the consistency level. DSR sort of gets around this by taking the
|
12
|
+
# search results and then going to Cassandra to retrieve the objects by ID using
|
13
|
+
# the consistency you specified. However, it is possible that you might not get
|
14
|
+
# all of the records you are expecting if the SOLR node you were talking to hasn't
|
15
|
+
# been updated yet with the results. In practice, this should not happen for
|
16
|
+
# records that were created over your connection, but it is possible for other
|
17
|
+
# connections to create records that you can't see yet.
|
18
|
+
def consistency(level)
|
19
|
+
level = level.to_s.upcase
|
20
|
+
unless self.valid_consistency?(level)
|
21
|
+
raise ArgumentError, "'#{level}' is not a valid Cassandra consistency level"
|
22
|
+
end
|
23
|
+
|
24
|
+
clone.tap do |r|
|
25
|
+
r.consistency_value = level
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
4
29
|
# Normally special characters (other than wild cards) are escaped before the search
|
5
30
|
# is submitted. If you want to handle escaping yourself because you need to use
|
6
31
|
# those special characters, then just include this in your chain.
|
@@ -36,7 +36,6 @@ module DatastaxRails
|
|
36
36
|
@per_page_value = @klass.default_page_size
|
37
37
|
@page_value = 1
|
38
38
|
@use_solr_value = true
|
39
|
-
@consistency_value = "QUORUM"
|
40
39
|
@extensions = []
|
41
40
|
@create_with_value = {}
|
42
41
|
@escape_value = true
|
@@ -241,6 +240,9 @@ module DatastaxRails
|
|
241
240
|
limit(1).select(:id).to_a.total_entries
|
242
241
|
end
|
243
242
|
|
243
|
+
# Escapes values that might otherwise mess up the URL or confuse SOLR.
|
244
|
+
# If you want to handle escaping yourself for a particular query then
|
245
|
+
# SearchMethods#dont_escape is what you're looking for.
|
244
246
|
def solr_escape(str)
|
245
247
|
if str.is_a?(String) && escape_value
|
246
248
|
str.gsub(SOLR_CHAR_RX, '\\\\\1')
|
@@ -317,9 +319,17 @@ module DatastaxRails
|
|
317
319
|
response = rsolr.paginate(@page_value, @per_page_value, 'select', :params => params)["response"]
|
318
320
|
results = DatastaxRails::Collection.new
|
319
321
|
results.total_entries = response['numFound'].to_i
|
320
|
-
|
321
|
-
|
322
|
-
|
322
|
+
if @consistency_value
|
323
|
+
response['docs'].each do |doc|
|
324
|
+
id = doc['id']
|
325
|
+
obj = @klass.with_cassandra.consistency(@consistency_value).find_by_id(id)
|
326
|
+
results << obj if obj
|
327
|
+
end
|
328
|
+
else
|
329
|
+
response['docs'].each do |doc|
|
330
|
+
key = doc.delete('id')
|
331
|
+
results << @klass.instantiate(key,doc)
|
332
|
+
end
|
323
333
|
end
|
324
334
|
results
|
325
335
|
end
|
data/lib/datastax_rails.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'active_support/all'
|
2
2
|
require 'cassandra-cql/1.0'
|
3
3
|
|
4
|
+
# Welcome to DatastaxRails. DatastaxRails::Base is probably a good place to start.
|
4
5
|
module DatastaxRails
|
5
6
|
extend ActiveSupport::Autoload
|
6
7
|
|
@@ -11,12 +12,10 @@ module DatastaxRails
|
|
11
12
|
autoload :Callbacks
|
12
13
|
autoload :Collection
|
13
14
|
autoload :Connection
|
14
|
-
autoload :Consistency
|
15
15
|
autoload :Cql
|
16
16
|
autoload :Cursor
|
17
17
|
autoload :Identity
|
18
18
|
autoload :Migrations
|
19
|
-
#autoload :Mocking
|
20
19
|
autoload :Persistence
|
21
20
|
autoload :Reflection
|
22
21
|
autoload :Relation
|
@@ -69,8 +68,9 @@ module DatastaxRails
|
|
69
68
|
end
|
70
69
|
end
|
71
70
|
|
72
|
-
# Fixup the thrift library
|
73
71
|
require "thrift"
|
72
|
+
# Thrift is how we communicate with Cassandra. We need to do a little fixup
|
73
|
+
# work to handle UTF-8 properly in Ruby 1.8.6.
|
74
74
|
module Thrift
|
75
75
|
class BinaryProtocol
|
76
76
|
def write_string(str)
|
@@ -82,6 +82,5 @@ end
|
|
82
82
|
|
83
83
|
require 'datastax_rails/railtie' if defined?(Rails)
|
84
84
|
require 'datastax_rails/errors'
|
85
|
-
# require 'solr_no_escape'
|
86
85
|
|
87
86
|
ActiveSupport.run_load_hooks(:datastax_rails, DatastaxRails::Base)
|
@@ -12,4 +12,10 @@ describe DatastaxRails::Base do
|
|
12
12
|
p.save!
|
13
13
|
p.instance_variable_get(:@after_save_ran).should == "yup"
|
14
14
|
end
|
15
|
+
|
16
|
+
it "should raise RecordNotFound when finding a bogus ID" do
|
17
|
+
pending "Datastax Enterprise 2.2 should fix this" do
|
18
|
+
lambda { Person.find("xyzzy") }.should raise_exception(DatastaxRails::RecordNotFound)
|
19
|
+
end
|
20
|
+
end
|
15
21
|
end
|
@@ -4,9 +4,12 @@ describe DatastaxRails::Cql::Select do
|
|
4
4
|
before(:each) do
|
5
5
|
@model_class = mock("Model Class", :column_family => 'users')
|
6
6
|
end
|
7
|
+
|
7
8
|
it "should generate valid CQL" do
|
8
9
|
cql = DatastaxRails::Cql::Select.new(@model_class, ["*"])
|
9
10
|
cql.using(DatastaxRails::Cql::Consistency::QUORUM).conditions(:key => '12345').limit(1)
|
10
11
|
cql.to_cql.should == "SELECT * FROM users USING CONSISTENCY QUORUM WHERE key = '12345' LIMIT 1"
|
11
12
|
end
|
13
|
+
|
14
|
+
it_has_behavior "default_consistency"
|
12
15
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DatastaxRails::Cql::Update do
|
4
|
+
before(:each) do
|
5
|
+
@model_class = mock("Model Class", :column_family => 'users')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should generate valid CQL" do
|
9
|
+
cql = DatastaxRails::Cql::Update.new(@model_class, "12345")
|
10
|
+
cql.using(DatastaxRails::Cql::Consistency::QUORUM).columns(:name => 'John', :age => '23')
|
11
|
+
cql.to_cql.should == "update users using consistency QUORUM SET age = '23', name = 'John' WHERE KEY IN ('12345')"
|
12
|
+
end
|
13
|
+
|
14
|
+
it_has_behavior "default_consistency"
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "DatastaxRails::Base" do
|
4
|
+
describe "persistence" do
|
5
|
+
describe "#create" do
|
6
|
+
it "should persist at the given consistency level" do
|
7
|
+
DatastaxRails::Base.connection.stub(:execute_cql_query)
|
8
|
+
DatastaxRails::Base.connection.should_receive(:execute_cql_query).with(/USING CONSISTENCY LOCAL_QUORUM/i).and_return(true)
|
9
|
+
Person.create({:name => 'Steven'},{:consistency => 'LOCAL_QUORUM'})
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#save" do
|
14
|
+
it "should persist at the given consistency level" do
|
15
|
+
DatastaxRails::Base.connection.stub(:execute_cql_query)
|
16
|
+
DatastaxRails::Base.connection.should_receive(:execute_cql_query).with(/USING CONSISTENCY LOCAL_QUORUM/i).and_return(true)
|
17
|
+
p=Person.new(:name => 'Steven')
|
18
|
+
p.save(:consistency => 'LOCAL_QUORUM')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#remove" do
|
23
|
+
it "should remove at the given consistency level" do
|
24
|
+
p=Person.create(:name => 'Steven')
|
25
|
+
DatastaxRails::Base.connection.stub(:execute_cql_query)
|
26
|
+
DatastaxRails::Base.connection.should_receive(:execute_cql_query).with(/USING CONSISTENCY LOCAL_QUORUM/i).and_return(true)
|
27
|
+
p.destroy(:consistency => :local_quorum)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -5,6 +5,24 @@ describe DatastaxRails::Relation do
|
|
5
5
|
@relation = DatastaxRails::Relation.new(Hobby, "hobbies")
|
6
6
|
end
|
7
7
|
|
8
|
+
describe "#consistency" do
|
9
|
+
it "should throw an ArgumentError for invalid consistency levels" do
|
10
|
+
lambda { @relation.consistency(:foo) }.should raise_exception(ArgumentError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not raise an exception for a valid consistency level" do
|
14
|
+
lambda { @relation.consistency(:local_quorum) }.should_not raise_exception
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should call cassandra to enforce consistency" do
|
18
|
+
h=Hobby.create(:name => 'swimming')
|
19
|
+
Hobby.commit_solr
|
20
|
+
Hobby.stub_chain(:with_cassandra,:consistency).and_return(@relation)
|
21
|
+
@relation.should_receive(:find_by_id).with(h.id)
|
22
|
+
@relation.consistency(:all).where(:name => 'swimming').all
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
8
26
|
describe "#limit" do
|
9
27
|
it "should limit the page size" do
|
10
28
|
"a".upto("l") do |letter|
|