datastax_rails 1.0.5
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/MIT-LICENSE +20 -0
- data/README.rdoc +62 -0
- data/Rakefile +34 -0
- data/config/schema.xml +266 -0
- data/config/schema.xml.erb +70 -0
- data/config/solrconfig.xml +1564 -0
- data/config/stopwords.txt +58 -0
- data/lib/datastax_rails/associations/association.rb +224 -0
- data/lib/datastax_rails/associations/association_scope.rb +25 -0
- data/lib/datastax_rails/associations/belongs_to_association.rb +64 -0
- data/lib/datastax_rails/associations/builder/association.rb +56 -0
- data/lib/datastax_rails/associations/builder/belongs_to.rb +30 -0
- data/lib/datastax_rails/associations/builder/collection_association.rb +48 -0
- data/lib/datastax_rails/associations/builder/has_and_belongs_to_many.rb +36 -0
- data/lib/datastax_rails/associations/builder/has_many.rb +54 -0
- data/lib/datastax_rails/associations/builder/has_one.rb +52 -0
- data/lib/datastax_rails/associations/builder/singular_association.rb +56 -0
- data/lib/datastax_rails/associations/collection_association.rb +274 -0
- data/lib/datastax_rails/associations/collection_proxy.rb +118 -0
- data/lib/datastax_rails/associations/has_and_belongs_to_many_association.rb +44 -0
- data/lib/datastax_rails/associations/has_many_association.rb +58 -0
- data/lib/datastax_rails/associations/has_one_association.rb +68 -0
- data/lib/datastax_rails/associations/singular_association.rb +58 -0
- data/lib/datastax_rails/associations.rb +86 -0
- data/lib/datastax_rails/attribute_methods/definition.rb +20 -0
- data/lib/datastax_rails/attribute_methods/dirty.rb +43 -0
- data/lib/datastax_rails/attribute_methods/typecasting.rb +50 -0
- data/lib/datastax_rails/attribute_methods.rb +104 -0
- data/lib/datastax_rails/base.rb +587 -0
- data/lib/datastax_rails/batches.rb +35 -0
- data/lib/datastax_rails/callbacks.rb +37 -0
- data/lib/datastax_rails/collection.rb +9 -0
- data/lib/datastax_rails/connection.rb +21 -0
- data/lib/datastax_rails/consistency.rb +33 -0
- data/lib/datastax_rails/cql/base.rb +15 -0
- data/lib/datastax_rails/cql/column_family.rb +38 -0
- data/lib/datastax_rails/cql/consistency.rb +13 -0
- data/lib/datastax_rails/cql/create_column_family.rb +63 -0
- data/lib/datastax_rails/cql/create_keyspace.rb +30 -0
- data/lib/datastax_rails/cql/delete.rb +41 -0
- data/lib/datastax_rails/cql/drop_column_family.rb +13 -0
- data/lib/datastax_rails/cql/drop_keyspace.rb +13 -0
- data/lib/datastax_rails/cql/insert.rb +53 -0
- data/lib/datastax_rails/cql/select.rb +51 -0
- data/lib/datastax_rails/cql/truncate.rb +13 -0
- data/lib/datastax_rails/cql/update.rb +68 -0
- data/lib/datastax_rails/cql/use_keyspace.rb +13 -0
- data/lib/datastax_rails/cql.rb +25 -0
- data/lib/datastax_rails/cursor.rb +90 -0
- data/lib/datastax_rails/errors.rb +16 -0
- data/lib/datastax_rails/identity/abstract_key_factory.rb +26 -0
- data/lib/datastax_rails/identity/custom_key_factory.rb +36 -0
- data/lib/datastax_rails/identity/hashed_natural_key_factory.rb +10 -0
- data/lib/datastax_rails/identity/natural_key_factory.rb +37 -0
- data/lib/datastax_rails/identity/uuid_key_factory.rb +23 -0
- data/lib/datastax_rails/identity.rb +53 -0
- data/lib/datastax_rails/log_subscriber.rb +37 -0
- data/lib/datastax_rails/migrations/migration.rb +15 -0
- data/lib/datastax_rails/migrations.rb +36 -0
- data/lib/datastax_rails/mocking.rb +15 -0
- data/lib/datastax_rails/persistence.rb +133 -0
- data/lib/datastax_rails/railtie.rb +20 -0
- data/lib/datastax_rails/reflection.rb +472 -0
- data/lib/datastax_rails/relation/finder_methods.rb +184 -0
- data/lib/datastax_rails/relation/modification_methods.rb +80 -0
- data/lib/datastax_rails/relation/search_methods.rb +349 -0
- data/lib/datastax_rails/relation/spawn_methods.rb +107 -0
- data/lib/datastax_rails/relation.rb +393 -0
- data/lib/datastax_rails/schema/migration.rb +106 -0
- data/lib/datastax_rails/schema/migration_proxy.rb +25 -0
- data/lib/datastax_rails/schema/migrator.rb +212 -0
- data/lib/datastax_rails/schema.rb +37 -0
- data/lib/datastax_rails/scoping.rb +394 -0
- data/lib/datastax_rails/serialization.rb +6 -0
- data/lib/datastax_rails/tasks/column_family.rb +162 -0
- data/lib/datastax_rails/tasks/ds.rake +63 -0
- data/lib/datastax_rails/tasks/keyspace.rb +57 -0
- data/lib/datastax_rails/timestamps.rb +19 -0
- data/lib/datastax_rails/type.rb +16 -0
- data/lib/datastax_rails/types/array_type.rb +77 -0
- data/lib/datastax_rails/types/base_type.rb +26 -0
- data/lib/datastax_rails/types/binary_type.rb +15 -0
- data/lib/datastax_rails/types/boolean_type.rb +22 -0
- data/lib/datastax_rails/types/date_type.rb +17 -0
- data/lib/datastax_rails/types/float_type.rb +18 -0
- data/lib/datastax_rails/types/integer_type.rb +18 -0
- data/lib/datastax_rails/types/string_type.rb +16 -0
- data/lib/datastax_rails/types/text_type.rb +16 -0
- data/lib/datastax_rails/types/time_type.rb +17 -0
- data/lib/datastax_rails/types.rb +9 -0
- data/lib/datastax_rails/validations/uniqueness.rb +119 -0
- data/lib/datastax_rails/validations.rb +48 -0
- data/lib/datastax_rails/version.rb +3 -0
- data/lib/datastax_rails.rb +87 -0
- data/lib/solr_no_escape.rb +28 -0
- data/spec/datastax_rails/associations/belongs_to_association_spec.rb +7 -0
- data/spec/datastax_rails/associations/has_many_association_spec.rb +37 -0
- data/spec/datastax_rails/associations_spec.rb +22 -0
- data/spec/datastax_rails/attribute_methods_spec.rb +23 -0
- data/spec/datastax_rails/base_spec.rb +15 -0
- data/spec/datastax_rails/cql/select_spec.rb +12 -0
- data/spec/datastax_rails/cql/update_spec.rb +0 -0
- data/spec/datastax_rails/relation/finder_methods_spec.rb +54 -0
- data/spec/datastax_rails/relation/modification_methods_spec.rb +41 -0
- data/spec/datastax_rails/relation/search_methods_spec.rb +117 -0
- data/spec/datastax_rails/relation/spawn_methods_spec.rb +28 -0
- data/spec/datastax_rails/relation_spec.rb +130 -0
- data/spec/datastax_rails/validations/uniqueness_spec.rb +41 -0
- data/spec/datastax_rails_spec.rb +5 -0
- data/spec/dummy/Rakefile +8 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +47 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/datastax.yml +18 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config/sunspot.yml +17 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/ks/migrate/20111117224534_models.rb +20 -0
- data/spec/dummy/ks/schema.json +180 -0
- data/spec/dummy/log/development.log +298 -0
- data/spec/dummy/log/production.log +0 -0
- data/spec/dummy/log/test.log +20307 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/datastax_test_hook.rb +14 -0
- data/spec/support/models.rb +72 -0
- metadata +353 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module DatastaxRails
|
|
2
|
+
module Associations
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
extend ActiveSupport::Autoload
|
|
5
|
+
|
|
6
|
+
autoload :Association
|
|
7
|
+
autoload :AssociationScope
|
|
8
|
+
autoload :SingularAssociation
|
|
9
|
+
autoload :CollectionAssociation
|
|
10
|
+
autoload :CollectionProxy
|
|
11
|
+
autoload :BelongsToAssociation
|
|
12
|
+
autoload :HasOneAssociation
|
|
13
|
+
autoload :HasManyAssociation
|
|
14
|
+
|
|
15
|
+
module Builder
|
|
16
|
+
extend ActiveSupport::Autoload
|
|
17
|
+
|
|
18
|
+
autoload :Association
|
|
19
|
+
autoload :SingularAssociation
|
|
20
|
+
autoload :CollectionAssociation
|
|
21
|
+
|
|
22
|
+
autoload :BelongsTo
|
|
23
|
+
autoload :HasOne
|
|
24
|
+
autoload :HasMany
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Clears out the association cache.
|
|
28
|
+
def clear_association_cache #:nodoc:
|
|
29
|
+
@association_cache.clear if persisted?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# :nodoc:
|
|
33
|
+
attr_reader :association_cache
|
|
34
|
+
|
|
35
|
+
# Returns the association instance for the given name, instantiating it if it doesn't already exist
|
|
36
|
+
def association(name) #:nodoc:
|
|
37
|
+
association = association_instance_get(name)
|
|
38
|
+
|
|
39
|
+
if association.nil?
|
|
40
|
+
reflection = self.class.reflect_on_association(name)
|
|
41
|
+
association = reflection.association_class.new(self, reflection)
|
|
42
|
+
association_instance_set(name, association)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
association
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
# Returns the specified association instance if it responds to :loaded?, nil otherwise.
|
|
50
|
+
def association_instance_get(name)
|
|
51
|
+
@association_cache ||= {}
|
|
52
|
+
@association_cache[name.to_sym]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Set the specified association instance.
|
|
56
|
+
def association_instance_set(name, association)
|
|
57
|
+
@association_cache ||= {}
|
|
58
|
+
@association_cache[name] = association
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
module ClassMethods
|
|
62
|
+
def belongs_to(name, options = {})
|
|
63
|
+
Builder::BelongsTo.build(self, name, options)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def has_many(name, options = {})
|
|
67
|
+
Builder::HasMany.build(self, name, options)
|
|
68
|
+
# klass = options[:class_name]
|
|
69
|
+
# klass ||= name.to_s.singularize
|
|
70
|
+
# foreign_key = options[:foreign_key]
|
|
71
|
+
# foreign_key ||= self.name.foreign_key
|
|
72
|
+
# define_method name do
|
|
73
|
+
# klass.where(foreign_key)
|
|
74
|
+
# end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def has_and_belongs_to_many(name, options = {})
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def has_one(name, options = {})
|
|
82
|
+
Builder::HasOne.build(self, name, options)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module DatastaxRails
|
|
2
|
+
module AttributeMethods
|
|
3
|
+
class Definition
|
|
4
|
+
attr_reader :name, :coder, :lazy
|
|
5
|
+
def initialize(name, coder, options)
|
|
6
|
+
@name = name.to_s
|
|
7
|
+
@lazy = options.delete(:lazy)
|
|
8
|
+
@coder = coder.new(options)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def instantiate(record, value)
|
|
12
|
+
value ||= coder.default
|
|
13
|
+
return unless value
|
|
14
|
+
|
|
15
|
+
value = value.kind_of?(String) ? coder.decode(value) : value
|
|
16
|
+
coder.wrap(record, name, value)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module DatastaxRails
|
|
2
|
+
module AttributeMethods
|
|
3
|
+
module Dirty
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
include ActiveModel::Dirty
|
|
6
|
+
|
|
7
|
+
# Attempts to +save+ the record and clears changed attributes if successful.
|
|
8
|
+
def save(*) #:nodoc:
|
|
9
|
+
if status = super
|
|
10
|
+
@previously_changed = changes
|
|
11
|
+
@changed_attributes.clear
|
|
12
|
+
end
|
|
13
|
+
status
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
|
|
17
|
+
def save!(*) #:nodoc:
|
|
18
|
+
super.tap do
|
|
19
|
+
@previously_changed = changes
|
|
20
|
+
@changed_attributes.clear
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# <tt>reload</tt> the record and clears changed attributes.
|
|
25
|
+
def reload
|
|
26
|
+
super.tap do
|
|
27
|
+
@previously_changed.try :clear
|
|
28
|
+
@changed_attributes.try :clear
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def write_attribute(name, value)
|
|
33
|
+
name = name.to_s
|
|
34
|
+
old = read_attribute(name)
|
|
35
|
+
super
|
|
36
|
+
|
|
37
|
+
unless attribute_changed?(name) || old == read_attribute(name)
|
|
38
|
+
changed_attributes[name] = old
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module DatastaxRails
|
|
2
|
+
module AttributeMethods
|
|
3
|
+
module Typecasting
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
class_attribute :attribute_definitions
|
|
8
|
+
class_attribute :lazy_attributes
|
|
9
|
+
class_attribute :readonly_attributes
|
|
10
|
+
self.attribute_definitions = {}
|
|
11
|
+
self.lazy_attributes = []
|
|
12
|
+
self.readonly_attributes = []
|
|
13
|
+
|
|
14
|
+
%w(array boolean date float integer json string text time time_with_zone).each do |type|
|
|
15
|
+
instance_eval <<-EOV, __FILE__, __LINE__ + 1
|
|
16
|
+
def #{type}(name, options = {}) # def string(name, options = {})
|
|
17
|
+
attribute(name, options.update(:type => :#{type})) # attribute(name, options.update(type: :string))
|
|
18
|
+
end # end
|
|
19
|
+
EOV
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.binary(name, options = {})
|
|
23
|
+
options.reverse_merge!(:lazy => true)
|
|
24
|
+
attribute(name, options.update(:type => :binary))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.timestamps(options = {})
|
|
28
|
+
attribute(:created_at, options.update(:type => :time))
|
|
29
|
+
attribute(:updated_at, options.update(:type => :time))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module ClassMethods
|
|
34
|
+
def inherited(child)
|
|
35
|
+
super
|
|
36
|
+
child.attribute_definitions = attribute_definitions.dup
|
|
37
|
+
self.models << child
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def typecast_attribute(record, name, value)
|
|
41
|
+
if attribute_definition = attribute_definitions[name.to_sym]
|
|
42
|
+
attribute_definition.instantiate(record, value)
|
|
43
|
+
else
|
|
44
|
+
raise NoMethodError, "Unknown attribute #{name.inspect}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module DatastaxRails
|
|
2
|
+
module AttributeMethods
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
include ActiveModel::AttributeMethods
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
alias :[] :read_attribute
|
|
8
|
+
alias :[]= :write_attribute
|
|
9
|
+
|
|
10
|
+
attribute_method_suffix("=")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module ClassMethods
|
|
14
|
+
def define_attribute_methods
|
|
15
|
+
return if attribute_methods_generated?
|
|
16
|
+
super(attribute_definitions.keys)
|
|
17
|
+
# Remove setter methods from readonly attributes
|
|
18
|
+
readonly_attributes.each do |attr|
|
|
19
|
+
remove_method("#{attr}=".to_sym) if method_defined?("#{attr}=".to_sym)
|
|
20
|
+
end
|
|
21
|
+
@attribute_methods_generated = true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def attribute_methods_generated?
|
|
25
|
+
@attribute_methods_generated ||= false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# attribute :name, :type => :string
|
|
30
|
+
# attribute :ammo, :type => Ammo, :coder => AmmoCodec
|
|
31
|
+
#
|
|
32
|
+
def attribute(name, options)
|
|
33
|
+
type = options.delete :type
|
|
34
|
+
coder = options.delete :coder
|
|
35
|
+
|
|
36
|
+
if type.is_a?(Symbol)
|
|
37
|
+
coder = DatastaxRails::Type.get_coder(type) || (raise "Unknown type #{type}")
|
|
38
|
+
elsif coder.nil?
|
|
39
|
+
raise "Must supply a :coder for #{name}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if(options[:lazy])
|
|
43
|
+
lazy_attributes << name.to_sym
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if(options[:readonly])
|
|
47
|
+
readonly_attributes << name.to_sym
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
attribute_definitions[name.to_sym] = AttributeMethods::Definition.new(name, coder, options)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def write_attribute(name, value)
|
|
55
|
+
@attributes[name.to_s] = self.class.typecast_attribute(self, name, value)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def read_attribute(name)
|
|
59
|
+
if(lazy_attributes.include?(name.to_sym) && @attributes[name.to_s].nil? && persisted?)
|
|
60
|
+
@attributes[name.to_s] = self.class.select(name).with_cassandra.find(self.id).read_attribute(name)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
@attributes[name.to_s]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def attribute_exists?(name)
|
|
67
|
+
@attributes.key?(name.to_s)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def attributes=(attributes)
|
|
71
|
+
attributes.each do |(name, value)|
|
|
72
|
+
send("#{name}=", value)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def method_missing(method_id, *args, &block)
|
|
77
|
+
if !self.class.attribute_methods_generated?
|
|
78
|
+
self.class.define_attribute_methods
|
|
79
|
+
send(method_id, *args, &block)
|
|
80
|
+
else
|
|
81
|
+
super
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def respond_to?(*args)
|
|
86
|
+
self.class.define_attribute_methods unless self.class.attribute_methods_generated?
|
|
87
|
+
super
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
protected
|
|
91
|
+
def attribute_method?(name)
|
|
92
|
+
!!attribute_definitions[name.to_sym]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
def attribute(name)
|
|
97
|
+
read_attribute(name)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def attribute=(name, value)
|
|
101
|
+
write_attribute(name, value)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|