datastax_rails 1.1.0.3 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +13 -13
- data/Rakefile +1 -0
- data/config/schema.xml.erb +0 -1
- data/config/{solrconfig.xml → solrconfig.xml.erb} +1 -1
- data/lib/blankslate.rb +1 -1
- data/lib/datastax_rails/associations/collection_proxy.rb +6 -2
- data/lib/datastax_rails/attribute_assignment.rb +114 -0
- data/lib/datastax_rails/attribute_methods/definition.rb +8 -2
- data/lib/datastax_rails/attribute_methods/typecasting.rb +2 -5
- data/lib/datastax_rails/attribute_methods.rb +9 -7
- data/lib/datastax_rails/base.rb +127 -109
- data/lib/datastax_rails/callbacks.rb +11 -7
- data/lib/datastax_rails/cassandra_only_model.rb +27 -0
- data/lib/datastax_rails/collection.rb +3 -1
- data/lib/datastax_rails/cql/base.rb +4 -0
- data/lib/datastax_rails/cql/select.rb +12 -2
- data/lib/datastax_rails/identity/abstract_key_factory.rb +1 -0
- data/lib/datastax_rails/identity/custom_key_factory.rb +1 -0
- data/lib/datastax_rails/identity/natural_key_factory.rb +1 -0
- data/lib/datastax_rails/identity/uuid_key_factory.rb +4 -0
- data/lib/datastax_rails/identity.rb +2 -1
- data/lib/datastax_rails/inheritance.rb +61 -0
- data/lib/datastax_rails/payload_model.rb +2 -5
- data/lib/datastax_rails/persistence.rb +63 -20
- data/lib/datastax_rails/railtie.rb +5 -1
- data/lib/datastax_rails/relation/batches.rb +2 -2
- data/lib/datastax_rails/relation/facet_methods.rb +56 -5
- data/lib/datastax_rails/relation/finder_methods.rb +55 -1
- data/lib/datastax_rails/relation/search_methods.rb +103 -32
- data/lib/datastax_rails/relation/spawn_methods.rb +3 -1
- data/lib/datastax_rails/relation/stats_methods.rb +1 -1
- data/lib/datastax_rails/relation.rb +166 -30
- data/lib/datastax_rails/schema/cassandra.rb +165 -0
- data/lib/datastax_rails/schema/migrator.rb +85 -193
- data/lib/datastax_rails/schema/solr.rb +158 -0
- data/lib/datastax_rails/schema.rb +2 -30
- data/lib/datastax_rails/scoping/default.rb +142 -0
- data/lib/datastax_rails/scoping/named.rb +200 -0
- data/lib/datastax_rails/scoping.rb +106 -349
- data/lib/datastax_rails/tasks/ds.rake +41 -42
- data/lib/datastax_rails/types/array_type.rb +1 -1
- data/lib/datastax_rails/types/base_type.rb +2 -2
- data/lib/datastax_rails/types/binary_type.rb +1 -1
- data/lib/datastax_rails/types/boolean_type.rb +1 -1
- data/lib/datastax_rails/types/date_type.rb +1 -1
- data/lib/datastax_rails/types/float_type.rb +4 -4
- data/lib/datastax_rails/types/integer_type.rb +3 -3
- data/lib/datastax_rails/types/string_type.rb +1 -1
- data/lib/datastax_rails/types/text_type.rb +1 -1
- data/lib/datastax_rails/types/time_type.rb +3 -3
- data/lib/datastax_rails/validations/uniqueness.rb +1 -1
- data/lib/datastax_rails/version.rb +1 -1
- data/lib/datastax_rails/wide_storage_model.rb +44 -0
- data/lib/datastax_rails.rb +16 -18
- data/spec/datastax_rails/associations_spec.rb +7 -3
- data/spec/datastax_rails/attribute_methods_spec.rb +23 -0
- data/spec/datastax_rails/base_spec.rb +1 -6
- data/spec/datastax_rails/inheritance_spec.rb +41 -0
- data/spec/datastax_rails/persistence_spec.rb +13 -3
- data/spec/datastax_rails/relation/batches_spec.rb +1 -1
- data/spec/datastax_rails/relation/facet_methods_spec.rb +52 -0
- data/spec/datastax_rails/relation/finder_methods_spec.rb +22 -1
- data/spec/datastax_rails/relation/search_methods_spec.rb +51 -1
- data/spec/datastax_rails/relation_spec.rb +14 -3
- data/spec/datastax_rails/schema/migrator_spec.rb +92 -0
- data/spec/datastax_rails/schema/solr_spec.rb +34 -0
- data/spec/datastax_rails/scoping/default_spec.rb +17 -0
- data/spec/datastax_rails/types/float_type_spec.rb +5 -9
- data/spec/datastax_rails/types/integer_type_spec.rb +5 -9
- data/spec/datastax_rails/types/time_type_spec.rb +28 -0
- data/spec/datastax_rails/validations/uniqueness_spec.rb +3 -1
- data/spec/dummy/config/application.rb +1 -4
- data/spec/dummy/config/datastax.yml +1 -1
- data/spec/dummy/config/environments/test.rb +2 -0
- data/spec/dummy/config/solr/articles-schema.xml.erb +1 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +2 -0
- data/spec/dummy/log/production.log +2 -0
- data/spec/dummy/log/test.log +523 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/models.rb +14 -0
- metadata +66 -22
- data/lib/datastax_rails/log_subscriber.rb +0 -37
- data/lib/datastax_rails/migrations/migration.rb +0 -15
- data/lib/datastax_rails/migrations.rb +0 -36
- data/lib/datastax_rails/mocking.rb +0 -15
- data/lib/datastax_rails/schema/migration.rb +0 -106
- data/lib/datastax_rails/schema/migration_proxy.rb +0 -25
- data/lib/datastax_rails/tasks/column_family.rb +0 -329
- data/lib/datastax_rails/tasks/keyspace.rb +0 -57
- data/spec/support/connection_double.rb +0 -6
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DatastaxRails::Schema::Migrator do
|
4
|
+
subject do
|
5
|
+
DatastaxRails::Schema::Migrator.new('datastax_rails_test').tap{|m| m.verbose = false}
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'payload models' do
|
9
|
+
context 'when column family exists' do
|
10
|
+
before(:each) do
|
11
|
+
subject.stub(:column_family_exists?).and_return(false)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "calls #create_payload_column_family" do
|
15
|
+
expect(subject).to receive(:create_payload_column_family).with(CarPayload)
|
16
|
+
subject.migrate_one(CarPayload)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when column family exists' do
|
21
|
+
before(:each) do
|
22
|
+
subject.stub(:column_family_exists?).and_return(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not call #create_payload_column_family" do
|
26
|
+
expect(subject).not_to receive(:create_payload_column_family).with(CarPayload)
|
27
|
+
subject.migrate_one(CarPayload)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'wide storage models' do
|
33
|
+
context 'when column family does not exist' do
|
34
|
+
before(:each) do
|
35
|
+
subject.stub(:column_family_exists?).and_return(false)
|
36
|
+
subject.stub(:create_wide_storage_column_family)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "calls #create_wide_storage_column_family" do
|
40
|
+
expect(subject).to receive(:create_wide_storage_column_family).with(AuditLog)
|
41
|
+
subject.migrate_one(AuditLog)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "calls #check_missing_schema" do
|
45
|
+
expect(subject).to receive(:check_missing_schema).with(AuditLog).and_return(0)
|
46
|
+
subject.migrate_one(AuditLog)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when column family exists' do
|
51
|
+
before(:each) do
|
52
|
+
subject.stub(:column_family_exists?).and_return(true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "does not call #create_wide_storage_column_family" do
|
56
|
+
expect(subject).not_to receive(:create_wide_storage_column_family).with(AuditLog)
|
57
|
+
subject.migrate_one(AuditLog)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "calls #check_missing_schema" do
|
61
|
+
expect(subject).to receive(:check_missing_schema).with(AuditLog).and_return(0)
|
62
|
+
subject.migrate_one(AuditLog)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'normal models' do
|
68
|
+
it "calls #check_key_name" do
|
69
|
+
expect(subject).to receive(:check_key_name).with(Person).and_return(0)
|
70
|
+
subject.migrate_one(Person)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "calls #check_missing_schema" do
|
74
|
+
expect(subject).to receive(:check_missing_schema).with(Person).and_return(0)
|
75
|
+
subject.migrate_one(Person)
|
76
|
+
end
|
77
|
+
|
78
|
+
context "force mode on" do
|
79
|
+
it "calls #upload_solr_configuation with force true" do
|
80
|
+
expect(subject).to receive(:upload_solr_configuration).with(Person, true).and_return(0)
|
81
|
+
subject.migrate_one(Person, true)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "force mode off" do
|
86
|
+
it "calls #upload_solr_configuation with force false" do
|
87
|
+
expect(subject).to receive(:upload_solr_configuration).with(Person, false).and_return(0)
|
88
|
+
subject.migrate_one(Person, false)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DatastaxRails::Schema::Solr do
|
4
|
+
subject do
|
5
|
+
DatastaxRails::Schema::Migrator.new('datastax_rails_test').tap{|m| m.verbose = false}
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#reindex_solr" do
|
9
|
+
it "calls curl to post the reindex command" do
|
10
|
+
url = "#{DatastaxRails::Base.solr_base_url}/admin/cores?action=RELOAD&name=datastax_rails_test.people&reindex=true&deleteAll=false"
|
11
|
+
expect(subject).to receive(:`).with("curl -s -X POST '#{url}'")
|
12
|
+
subject.reindex_solr(Person)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#create_solr_core" do
|
17
|
+
it "calls curl to post the solr create core command" do
|
18
|
+
url = "#{DatastaxRails::Base.solr_base_url}/admin/cores?action=CREATE&name=datastax_rails_test.people"
|
19
|
+
expect(subject).to receive(:`).with("curl -s -X POST '#{url}'")
|
20
|
+
subject.create_solr_core(Person)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#generate_solr_schema" do
|
25
|
+
it "uses a custom config if one is present" do
|
26
|
+
model = mock_model("Article", :column_family => 'articles', :name => 'Article', :attribute_definitions => {})
|
27
|
+
expect(subject.generate_solr_schema(model)).to match(/This is my custom schema/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#upload_solr_configuration" do
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe DatastaxRails::Base do
|
4
|
+
context "Scoping" do
|
5
|
+
context "Default" do
|
6
|
+
it "applies the default scope" do
|
7
|
+
Boat.create(:name => 'WindDancer', :registration => 1)
|
8
|
+
Boat.create(:name => 'Misty', :registration => 2)
|
9
|
+
Boat.create(:name => 'Voyager', :registration => 3)
|
10
|
+
Boat.create(:name => 'Aquacadabra', :registration => 4)
|
11
|
+
Boat.commit_solr
|
12
|
+
|
13
|
+
Boat.where(:registration => [1,2,3,4]).collect(&:name).should == ['Aquacadabra', 'Misty', 'Voyager', 'WindDancer']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -6,12 +6,8 @@ describe DatastaxRails::Types::FloatType do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
describe "#encode" do
|
9
|
-
it "should store decimals as
|
10
|
-
@coder.encode(12.0).should
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should convert properly formatted strings to Floats" do
|
14
|
-
@coder.encode("12.0").should be_a_kind_of(Float)
|
9
|
+
it "should store decimals as strings" do
|
10
|
+
@coder.encode(12.0).should eq("12.0")
|
15
11
|
end
|
16
12
|
|
17
13
|
it "should raise an exception on improperly formatted strings" do
|
@@ -19,17 +15,17 @@ describe DatastaxRails::Types::FloatType do
|
|
19
15
|
end
|
20
16
|
|
21
17
|
it "should store a sentinel value for nils" do
|
22
|
-
@coder.encode(nil).should
|
18
|
+
@coder.encode(nil).should eq('-10191980.0')
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
26
22
|
describe "#decode" do
|
27
23
|
it "should return floats" do
|
28
|
-
@coder.decode(12.0).should be_within(0.1).of(12.0)
|
24
|
+
@coder.decode("12.0").should be_within(0.1).of(12.0)
|
29
25
|
end
|
30
26
|
|
31
27
|
it "should return nil if the sentinel value is found" do
|
32
|
-
@coder.decode(-10191980.0).should be_nil
|
28
|
+
@coder.decode("-10191980.0").should be_nil
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -6,12 +6,8 @@ describe DatastaxRails::Types::IntegerType do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
describe "#encode" do
|
9
|
-
it "should store integers as
|
10
|
-
@coder.encode(12).should
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should convert properly formatted strings to Fixnums" do
|
14
|
-
@coder.encode("12").should be_a_kind_of(Fixnum)
|
9
|
+
it "should store integers as strings" do
|
10
|
+
@coder.encode(12).should eq("12")
|
15
11
|
end
|
16
12
|
|
17
13
|
it "should raise an exception on improperly formatted strings" do
|
@@ -19,17 +15,17 @@ describe DatastaxRails::Types::IntegerType do
|
|
19
15
|
end
|
20
16
|
|
21
17
|
it "should store a sentinel value for nils" do
|
22
|
-
@coder.encode(nil).should
|
18
|
+
@coder.encode(nil).should eq("-10191980")
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
26
22
|
describe "#decode" do
|
27
23
|
it "should return integers" do
|
28
|
-
@coder.decode(12).should
|
24
|
+
@coder.decode("12").should eq(12)
|
29
25
|
end
|
30
26
|
|
31
27
|
it "should return nil if the sentinel value is found" do
|
32
|
-
@coder.decode(-10191980).should be_nil
|
28
|
+
@coder.decode("-10191980").should be_nil
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DatastaxRails::Types::TimeType do
|
4
|
+
let(:coder) { DatastaxRails::Types::TimeType.new }
|
5
|
+
let(:utc_time) { Time.utc(2013, 12, 11, 10, 9, 8) }
|
6
|
+
|
7
|
+
describe "#encode" do
|
8
|
+
let(:local_time) { Time.new(2011, 10, 9, 8, 7, 6, "-05:00") }
|
9
|
+
|
10
|
+
it { expect(coder.encode(nil)).to be_nil }
|
11
|
+
it { expect{coder.encode("bad time")}.to raise_error(ArgumentError) }
|
12
|
+
it { expect(coder.encode(utc_time)).to eq "2013-12-11T10:09:08Z" }
|
13
|
+
it { expect(coder.encode(local_time)).to eq "2011-10-09T13:07:06Z" }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#decode" do
|
17
|
+
let(:time) { "2013-12-11T10:09:08Z" }
|
18
|
+
|
19
|
+
it { expect(coder.decode(time)).to eq utc_time }
|
20
|
+
it { expect(coder.decode(utc_time)).to eq utc_time }
|
21
|
+
|
22
|
+
context "when timezone is not UTC" do
|
23
|
+
before(:each) { Time.zone = "Eastern Time (US & Canada)" }
|
24
|
+
|
25
|
+
it { expect(coder.decode(time)).to eq Time.new(2013, 12, 11, 5, 9, 8, '-05:00') }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe DatastaxRails::Base do
|
4
4
|
describe "uniqueness validation" do
|
5
5
|
it "should validate uniqueness" do
|
6
|
+
Person.commit_solr
|
6
7
|
Person.create!(:name => "Jason")
|
7
8
|
Person.commit_solr
|
8
9
|
Person.commit_solr
|
@@ -13,6 +14,7 @@ describe DatastaxRails::Base do
|
|
13
14
|
end
|
14
15
|
|
15
16
|
it "should allow an update to a model without triggering a uniqueness error" do
|
17
|
+
Person.commit_solr
|
16
18
|
p=Person.create!(:name => "Jason", :birthdate => Date.strptime("10/19/1985", '%m/%d/%Y'))
|
17
19
|
Person.commit_solr
|
18
20
|
p.birthdate = Date.strptime("10/19/1980", '%m/%d/%Y')
|
@@ -31,7 +33,7 @@ describe DatastaxRails::Base do
|
|
31
33
|
j.should be_valid
|
32
34
|
end
|
33
35
|
|
34
|
-
it "should
|
36
|
+
it "should enforce uniqueness of blanks if not instructed otherwise" do
|
35
37
|
Boat.create!(:name => nil)
|
36
38
|
Boat.commit_solr
|
37
39
|
b=Boat.new
|
@@ -7,6 +7,8 @@ Dummy::Application.configure do
|
|
7
7
|
# and recreated between test runs. Don't rely on the data there!
|
8
8
|
config.cache_classes = true
|
9
9
|
|
10
|
+
config.eager_load = false
|
11
|
+
|
10
12
|
# Configure static asset server for tests with Cache-Control for performance
|
11
13
|
config.serve_static_assets = true
|
12
14
|
config.static_cache_control = "public, max-age=3600"
|
@@ -0,0 +1 @@
|
|
1
|
+
This is my custom schema
|
File without changes
|
@@ -24173,3 +24173,5 @@ SELECT updated_at,birthdate,nickname,created_at,name FROM people USING CONSISTEN
|
|
24173
24173
|
cars insert (1600.2ms) ec46e0da-c18e-11e2-8c1e-12c5f0df414b {"last_serviced_at"=>nil, "name"=>"Jeep Wranger", "updated_at"=>"2013-05-20T21:55:09Z"}
|
24174
24174
|
cars insert (30.3ms) ec46e0da-c18e-11e2-8c1e-12c5f0df414b {"last_serviced_at"=>nil, "updated_at"=>"2013-05-20T21:56:46Z"}
|
24175
24175
|
cars insert (11.8ms) ec46e0da-c18e-11e2-8c1e-12c5f0df414b {"updated_at"=>"2013-05-20T21:57:18Z", "last_serviced_at"=>nil}
|
24176
|
+
Connecting to database specified by database.yml
|
24177
|
+
Connecting to database specified by database.yml
|