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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +13 -13
  3. data/Rakefile +1 -0
  4. data/config/schema.xml.erb +0 -1
  5. data/config/{solrconfig.xml → solrconfig.xml.erb} +1 -1
  6. data/lib/blankslate.rb +1 -1
  7. data/lib/datastax_rails/associations/collection_proxy.rb +6 -2
  8. data/lib/datastax_rails/attribute_assignment.rb +114 -0
  9. data/lib/datastax_rails/attribute_methods/definition.rb +8 -2
  10. data/lib/datastax_rails/attribute_methods/typecasting.rb +2 -5
  11. data/lib/datastax_rails/attribute_methods.rb +9 -7
  12. data/lib/datastax_rails/base.rb +127 -109
  13. data/lib/datastax_rails/callbacks.rb +11 -7
  14. data/lib/datastax_rails/cassandra_only_model.rb +27 -0
  15. data/lib/datastax_rails/collection.rb +3 -1
  16. data/lib/datastax_rails/cql/base.rb +4 -0
  17. data/lib/datastax_rails/cql/select.rb +12 -2
  18. data/lib/datastax_rails/identity/abstract_key_factory.rb +1 -0
  19. data/lib/datastax_rails/identity/custom_key_factory.rb +1 -0
  20. data/lib/datastax_rails/identity/natural_key_factory.rb +1 -0
  21. data/lib/datastax_rails/identity/uuid_key_factory.rb +4 -0
  22. data/lib/datastax_rails/identity.rb +2 -1
  23. data/lib/datastax_rails/inheritance.rb +61 -0
  24. data/lib/datastax_rails/payload_model.rb +2 -5
  25. data/lib/datastax_rails/persistence.rb +63 -20
  26. data/lib/datastax_rails/railtie.rb +5 -1
  27. data/lib/datastax_rails/relation/batches.rb +2 -2
  28. data/lib/datastax_rails/relation/facet_methods.rb +56 -5
  29. data/lib/datastax_rails/relation/finder_methods.rb +55 -1
  30. data/lib/datastax_rails/relation/search_methods.rb +103 -32
  31. data/lib/datastax_rails/relation/spawn_methods.rb +3 -1
  32. data/lib/datastax_rails/relation/stats_methods.rb +1 -1
  33. data/lib/datastax_rails/relation.rb +166 -30
  34. data/lib/datastax_rails/schema/cassandra.rb +165 -0
  35. data/lib/datastax_rails/schema/migrator.rb +85 -193
  36. data/lib/datastax_rails/schema/solr.rb +158 -0
  37. data/lib/datastax_rails/schema.rb +2 -30
  38. data/lib/datastax_rails/scoping/default.rb +142 -0
  39. data/lib/datastax_rails/scoping/named.rb +200 -0
  40. data/lib/datastax_rails/scoping.rb +106 -349
  41. data/lib/datastax_rails/tasks/ds.rake +41 -42
  42. data/lib/datastax_rails/types/array_type.rb +1 -1
  43. data/lib/datastax_rails/types/base_type.rb +2 -2
  44. data/lib/datastax_rails/types/binary_type.rb +1 -1
  45. data/lib/datastax_rails/types/boolean_type.rb +1 -1
  46. data/lib/datastax_rails/types/date_type.rb +1 -1
  47. data/lib/datastax_rails/types/float_type.rb +4 -4
  48. data/lib/datastax_rails/types/integer_type.rb +3 -3
  49. data/lib/datastax_rails/types/string_type.rb +1 -1
  50. data/lib/datastax_rails/types/text_type.rb +1 -1
  51. data/lib/datastax_rails/types/time_type.rb +3 -3
  52. data/lib/datastax_rails/validations/uniqueness.rb +1 -1
  53. data/lib/datastax_rails/version.rb +1 -1
  54. data/lib/datastax_rails/wide_storage_model.rb +44 -0
  55. data/lib/datastax_rails.rb +16 -18
  56. data/spec/datastax_rails/associations_spec.rb +7 -3
  57. data/spec/datastax_rails/attribute_methods_spec.rb +23 -0
  58. data/spec/datastax_rails/base_spec.rb +1 -6
  59. data/spec/datastax_rails/inheritance_spec.rb +41 -0
  60. data/spec/datastax_rails/persistence_spec.rb +13 -3
  61. data/spec/datastax_rails/relation/batches_spec.rb +1 -1
  62. data/spec/datastax_rails/relation/facet_methods_spec.rb +52 -0
  63. data/spec/datastax_rails/relation/finder_methods_spec.rb +22 -1
  64. data/spec/datastax_rails/relation/search_methods_spec.rb +51 -1
  65. data/spec/datastax_rails/relation_spec.rb +14 -3
  66. data/spec/datastax_rails/schema/migrator_spec.rb +92 -0
  67. data/spec/datastax_rails/schema/solr_spec.rb +34 -0
  68. data/spec/datastax_rails/scoping/default_spec.rb +17 -0
  69. data/spec/datastax_rails/types/float_type_spec.rb +5 -9
  70. data/spec/datastax_rails/types/integer_type_spec.rb +5 -9
  71. data/spec/datastax_rails/types/time_type_spec.rb +28 -0
  72. data/spec/datastax_rails/validations/uniqueness_spec.rb +3 -1
  73. data/spec/dummy/config/application.rb +1 -4
  74. data/spec/dummy/config/datastax.yml +1 -1
  75. data/spec/dummy/config/environments/test.rb +2 -0
  76. data/spec/dummy/config/solr/articles-schema.xml.erb +1 -0
  77. data/spec/dummy/db/test.sqlite3 +0 -0
  78. data/spec/dummy/log/development.log +2 -0
  79. data/spec/dummy/log/production.log +2 -0
  80. data/spec/dummy/log/test.log +523 -0
  81. data/spec/spec_helper.rb +11 -0
  82. data/spec/support/models.rb +14 -0
  83. metadata +66 -22
  84. data/lib/datastax_rails/log_subscriber.rb +0 -37
  85. data/lib/datastax_rails/migrations/migration.rb +0 -15
  86. data/lib/datastax_rails/migrations.rb +0 -36
  87. data/lib/datastax_rails/mocking.rb +0 -15
  88. data/lib/datastax_rails/schema/migration.rb +0 -106
  89. data/lib/datastax_rails/schema/migration_proxy.rb +0 -25
  90. data/lib/datastax_rails/tasks/column_family.rb +0 -329
  91. data/lib/datastax_rails/tasks/keyspace.rb +0 -57
  92. 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 Floats" do
10
- @coder.encode(12.0).should be_a_kind_of(Float)
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 be_within(0.1).of(-10191980.0)
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 Fixnums" do
10
- @coder.encode(12).should be_a_kind_of(Fixnum)
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 == -10191980
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 == 12
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 enfore uniqueness of blanks if not instructed otherwise" do
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
@@ -1,9 +1,6 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
- require 'action_controller/railtie'
4
- require 'action_mailer/railtie'
5
- require 'active_resource/railtie'
6
-
3
+ require 'rails/all'
7
4
  Bundler.require
8
5
  require "datastax_rails"
9
6
 
@@ -1,5 +1,5 @@
1
1
  productiont:
2
- servers: ["sade-rs-ds1.opensource.gov:9160", "sade-rs-ds2.opensource.gov:9160", "sade-rs-ds3.opensource.gov:9160"]
2
+ servers: ["127.0.0.1:9160"]
3
3
  keyspace: "datastax_rails_development"
4
4
  strategy_options: {"RS": "3"}
5
5
  connection_options:
@@ -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
@@ -0,0 +1,2 @@
1
+ Connecting to database specified by database.yml
2
+ Connecting to database specified by database.yml