superstore 1.2.0 → 2.0.0

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -13
  3. data/CHANGELOG.md +16 -0
  4. data/Gemfile +0 -5
  5. data/README.md +15 -33
  6. data/lib/superstore/adapters/jsonb_adapter.rb +245 -0
  7. data/lib/superstore/associations/association.rb +38 -0
  8. data/lib/superstore/associations/belongs_to.rb +35 -0
  9. data/lib/superstore/associations/builder/association.rb +38 -0
  10. data/lib/superstore/associations/builder/belongs_to.rb +7 -0
  11. data/lib/superstore/associations/builder/has_many.rb +7 -0
  12. data/lib/superstore/associations/builder/has_one.rb +7 -0
  13. data/lib/superstore/associations/has_many.rb +26 -0
  14. data/lib/superstore/associations/has_one.rb +24 -0
  15. data/lib/superstore/associations/reflection.rb +65 -0
  16. data/lib/superstore/associations.rb +72 -0
  17. data/lib/superstore/attribute_methods/definition.rb +5 -10
  18. data/lib/superstore/attribute_methods/dirty.rb +12 -2
  19. data/lib/superstore/attribute_methods/typecasting.rb +6 -12
  20. data/lib/superstore/base.rb +3 -4
  21. data/lib/superstore/connection.rb +3 -5
  22. data/lib/superstore/core.rb +0 -5
  23. data/lib/superstore/model.rb +32 -33
  24. data/lib/superstore/persistence.rb +4 -10
  25. data/lib/superstore/railtie.rb +2 -20
  26. data/lib/superstore/scope/batches.rb +17 -22
  27. data/lib/superstore/scope/finder_methods.rb +33 -35
  28. data/lib/superstore/scope/query_methods.rb +38 -44
  29. data/lib/superstore/scope.rb +24 -0
  30. data/lib/superstore/type.rb +3 -3
  31. data/lib/superstore/types/array_type.rb +2 -9
  32. data/lib/superstore/types/base_type.rb +4 -7
  33. data/lib/superstore/types/boolean_type.rb +2 -1
  34. data/lib/superstore/types/float_type.rb +6 -5
  35. data/lib/superstore/types/integer_type.rb +3 -3
  36. data/lib/superstore/types/json_type.rb +0 -21
  37. data/lib/superstore.rb +16 -5
  38. data/superstore.gemspec +2 -1
  39. data/test/support/jsonb.rb +8 -0
  40. data/test/support/{issue.rb → models.rb} +9 -0
  41. data/test/support/pg.rb +11 -15
  42. data/test/test_helper.rb +7 -6
  43. data/test/unit/{belongs_to_test.rb → associations/belongs_to_test.rb} +1 -10
  44. data/test/unit/associations/has_many_test.rb +13 -0
  45. data/test/unit/associations/has_one_test.rb +14 -0
  46. data/test/unit/{belongs_to → associations}/reflection_test.rb +2 -2
  47. data/test/unit/attribute_methods/definition_test.rb +6 -3
  48. data/test/unit/attribute_methods/dirty_test.rb +17 -14
  49. data/test/unit/attribute_methods/typecasting_test.rb +0 -14
  50. data/test/unit/base_test.rb +3 -3
  51. data/test/unit/connection_test.rb +0 -4
  52. data/test/unit/persistence_test.rb +4 -4
  53. data/test/unit/schema_test.rb +9 -17
  54. data/test/unit/scope/query_methods_test.rb +10 -1
  55. data/test/unit/types/array_type_test.rb +12 -10
  56. data/test/unit/types/base_type_test.rb +2 -10
  57. data/test/unit/types/boolean_type_test.rb +15 -13
  58. data/test/unit/types/date_type_test.rb +3 -3
  59. data/test/unit/types/float_type_test.rb +14 -7
  60. data/test/unit/types/integer_type_test.rb +11 -9
  61. data/test/unit/types/json_type_test.rb +0 -23
  62. data/test/unit/types/string_type_test.rb +6 -6
  63. data/test/unit/types/time_type_test.rb +7 -7
  64. metadata +35 -26
  65. data/CHANGELOG +0 -0
  66. data/lib/superstore/adapters/cassandra_adapter.rb +0 -203
  67. data/lib/superstore/adapters/hstore_adapter.rb +0 -170
  68. data/lib/superstore/belongs_to/association.rb +0 -65
  69. data/lib/superstore/belongs_to/builder.rb +0 -40
  70. data/lib/superstore/belongs_to/reflection.rb +0 -38
  71. data/lib/superstore/belongs_to.rb +0 -63
  72. data/lib/superstore/cassandra_schema/statements.rb +0 -52
  73. data/lib/superstore/cassandra_schema/tasks.rb +0 -47
  74. data/lib/superstore/cassandra_schema.rb +0 -9
  75. data/lib/superstore/log_subscriber.rb +0 -44
  76. data/lib/superstore/railties/controller_runtime.rb +0 -45
  77. data/lib/superstore/tasks/ks.rake +0 -59
  78. data/test/support/cassandra.rb +0 -46
  79. data/test/support/hstore.rb +0 -24
  80. data/test/support/user.rb +0 -2
  81. data/test/unit/cassandra_schema/statements_test.rb +0 -47
  82. data/test/unit/cassandra_schema/tasks_test.rb +0 -31
  83. data/test/unit/log_subscriber_test.rb +0 -26
  84. data/test/unit/railties/controller_runtime_test.rb +0 -48
@@ -1,170 +0,0 @@
1
- gem 'pg'
2
- require 'pg'
3
-
4
- module Superstore
5
- module Adapters
6
- class HstoreAdapter < AbstractAdapter
7
- class QueryBuilder
8
- def initialize(adapter, scope)
9
- @adapter = adapter
10
- @scope = scope
11
- end
12
-
13
- def to_query
14
- [
15
- "SELECT #{select_string} FROM #{@scope.klass.table_name}",
16
- where_string,
17
- order_string,
18
- limit_string
19
- ].delete_if(&:blank?) * ' '
20
- end
21
-
22
- def select_string
23
- if @scope.select_values.any?
24
- "id, slice(attribute_store, #{@adapter.fields_to_postgres_array(@scope.select_values)}) as attribute_store"
25
- else
26
- '*'
27
- end
28
- end
29
-
30
- def where_string
31
- wheres = @scope.where_values.dup
32
- if @scope.id_values.any?
33
- wheres << @adapter.create_ids_where_clause(@scope.id_values)
34
- end
35
-
36
- if wheres.any?
37
- "WHERE #{wheres * ' AND '}"
38
- end
39
- end
40
-
41
- def order_string
42
- if @scope.order_values.any?
43
- orders = @scope.order_values.join(', ')
44
- "ORDER BY #{orders}"
45
- elsif @scope.id_values.many?
46
- id_orders = @scope.id_values.map { |id| "ID=#{@adapter.quote(id)} DESC" }.join(',')
47
- "ORDER BY #{id_orders}"
48
- end
49
- end
50
-
51
- def limit_string
52
- if @scope.limit_value
53
- "LIMIT #{@scope.limit_value}"
54
- end
55
- end
56
- end
57
-
58
- def primary_key_column
59
- 'id'
60
- end
61
-
62
- def connection
63
- # conf = {:adapter=>"postgresql", :encoding=>"unicode", :database=>"axle_place_test", :pool=>5, :username=>"postgres"}
64
- # @connection ||= ActiveRecord::Base.postgresql_connection(conf)
65
- ActiveRecord::Base.connection
66
- end
67
-
68
- def execute(statement)
69
- ActiveSupport::Notifications.instrument("cql.cassandra_object", cql: statement) do
70
- connection.execute statement
71
- end
72
- end
73
-
74
- def select(scope)
75
- statement = QueryBuilder.new(self, scope).to_query
76
-
77
- connection.execute(statement).each do |attributes|
78
- yield attributes[primary_key_column], hstore_to_attributes(attributes['attribute_store'])
79
- end
80
- end
81
-
82
- def insert(table, id, attributes)
83
- not_nil_attributes = attributes.reject { |key, value| value.nil? }
84
- statement = "INSERT INTO #{table} (#{primary_key_column}, attribute_store) VALUES (#{quote(id)}, #{attributes_to_hstore(not_nil_attributes)})"
85
- execute_batchable statement
86
- end
87
-
88
- def update(table, id, attributes)
89
- return if attributes.empty?
90
-
91
- not_nil_attributes = attributes.reject { |key, value| value.nil? }
92
- nil_attributes = attributes.select { |key, value| value.nil? }
93
-
94
- if not_nil_attributes.any? && nil_attributes.any?
95
- value_update = "(attribute_store - #{fields_to_postgres_array(nil_attributes.keys)}) || #{attributes_to_hstore(not_nil_attributes)}"
96
- elsif not_nil_attributes.any?
97
- value_update = "attribute_store || #{attributes_to_hstore(not_nil_attributes)}"
98
- elsif nil_attributes.any?
99
- value_update = "attribute_store - #{fields_to_postgres_array(nil_attributes.keys)}"
100
- end
101
-
102
- statement = "UPDATE #{table} SET attribute_store = #{value_update} WHERE #{primary_key_column} = #{quote(id)}"
103
- execute_batchable statement
104
- end
105
-
106
- def delete(table, ids)
107
- statement = "DELETE FROM #{table} WHERE #{create_ids_where_clause(ids)}"
108
-
109
- execute_batchable statement
110
- end
111
-
112
- def execute_batch(statements)
113
- stmt = [
114
- "BEGIN",
115
- statements * ";\n",
116
- 'COMMIT'
117
- ] * ";\n"
118
-
119
- execute stmt
120
- end
121
-
122
- def create_table(table_name, options = {})
123
- connection.execute 'CREATE EXTENSION IF NOT EXISTS hstore'
124
- ActiveRecord::Migration.create_table table_name, id: false do |t|
125
- t.string :id, null: false
126
- t.hstore :attribute_store, null: false
127
- end
128
- connection.execute "ALTER TABLE \"#{table_name}\" ADD CONSTRAINT #{table_name}_pkey PRIMARY KEY (id)"
129
- end
130
-
131
- def drop_table(table_name)
132
- ActiveRecord::Migration.drop_table table_name
133
- end
134
-
135
- def create_ids_where_clause(ids)
136
- ids = ids.first if ids.is_a?(Array) && ids.one?
137
-
138
- if ids.is_a?(Array)
139
- id_list = ids.map { |id| quote(id) }.join(',')
140
- "#{primary_key_column} IN (#{id_list})"
141
- else
142
- "#{primary_key_column} = #{quote(ids)}"
143
- end
144
- end
145
-
146
- def quote(value)
147
- connection.quote(value)
148
- end
149
-
150
- def fields_to_postgres_array(fields)
151
- quoted_fields = fields.map { |field| "'#{field}'" }.join(',')
152
- "ARRAY[#{quoted_fields}]"
153
- end
154
-
155
- private
156
-
157
- def hstore_type
158
- @hstore_type ||= ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Hstore.new
159
- end
160
-
161
- def attributes_to_hstore(attributes)
162
- quote hstore_type.type_cast_for_database(attributes)
163
- end
164
-
165
- def hstore_to_attributes(string)
166
- hstore_type.type_cast_from_database(string)
167
- end
168
- end
169
- end
170
- end
@@ -1,65 +0,0 @@
1
- module Superstore
2
- module BelongsTo
3
- class Association
4
- attr_reader :owner, :reflection
5
- attr_accessor :record_variable
6
- delegate :options, to: :reflection
7
-
8
- def initialize(owner, reflection)
9
- @owner = owner
10
- @reflection = reflection
11
- end
12
-
13
- def reader
14
- unless loaded?
15
- check_appropriate_primary_key!
16
- self.record_variable = get_record
17
- @loaded = true
18
- end
19
-
20
- record_variable
21
- end
22
-
23
- def writer(record)
24
- check_appropriate_primary_key!
25
- self.record_variable = record
26
- @loaded = true
27
- owner.send("#{reflection.foreign_key}=", record.try(reflection.primary_key))
28
- if reflection.polymorphic?
29
- owner.send("#{reflection.polymorphic_column}=", record.class.name)
30
- end
31
- end
32
-
33
- def association_class
34
- association_class_name.constantize
35
- end
36
-
37
- def association_class_name
38
- reflection.polymorphic? ? owner.send(reflection.polymorphic_column) : reflection.class_name
39
- end
40
-
41
- def loaded?
42
- @loaded
43
- end
44
-
45
- private
46
-
47
- def get_record
48
- record_id = owner.send(reflection.foreign_key).presence
49
- return unless record_id
50
-
51
- if reflection.default_primary_key?
52
- association_class.find_by_id(record_id)
53
- else
54
- association_class.find_by(reflection.primary_key => record_id)
55
- end
56
- end
57
-
58
- def check_appropriate_primary_key!
59
- if !reflection.default_primary_key? && !(association_class <= ActiveRecord::Base)
60
- raise ArgumentError, "Association must inherit from ActiveRecord::Base to use custom primary key"
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,40 +0,0 @@
1
- module Superstore
2
- module BelongsTo
3
- class Builder
4
- def self.build(model, name, options)
5
- new(model, name, options).build
6
- end
7
-
8
- attr_reader :model, :name, :options
9
- def initialize(model, name, options)
10
- @model, @name, @options = model, name, options
11
- end
12
-
13
- def build
14
- define_writer
15
- define_reader
16
-
17
- reflection = Superstore::BelongsTo::Reflection.new(model, name, options)
18
- model.belongs_to_reflections = model.belongs_to_reflections.merge(name => reflection)
19
- end
20
-
21
- def mixin
22
- model.generated_belongs_to_methods
23
- end
24
-
25
- def define_writer
26
- name = self.name
27
- mixin.redefine_method("#{name}=") do |records|
28
- belongs_to_association(name).writer(records)
29
- end
30
- end
31
-
32
- def define_reader
33
- name = self.name
34
- mixin.redefine_method(name) do
35
- belongs_to_association(name).reader
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,38 +0,0 @@
1
- module Superstore
2
- module BelongsTo
3
- class Reflection
4
- attr_reader :model, :name, :options
5
- def initialize(model, name, options)
6
- @model, @name, @options = model, name, options
7
- end
8
-
9
- def instance_variable_name
10
- "@#{name}"
11
- end
12
-
13
- def foreign_key
14
- options[:foreign_key] || "#{name}_id"
15
- end
16
-
17
- def primary_key
18
- options[:primary_key] || "id"
19
- end
20
-
21
- def default_primary_key?
22
- primary_key == "id"
23
- end
24
-
25
- def polymorphic_column
26
- "#{name}_type"
27
- end
28
-
29
- def polymorphic?
30
- options[:polymorphic]
31
- end
32
-
33
- def class_name
34
- options[:class_name] || name.to_s.camelize
35
- end
36
- end
37
- end
38
- end
@@ -1,63 +0,0 @@
1
- module Superstore
2
- module BelongsTo
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- class_attribute :belongs_to_reflections
7
- self.belongs_to_reflections = {}
8
- end
9
-
10
- module ClassMethods
11
- # === Options
12
- # [:class_name]
13
- # Use if the class cannot be inferred from the association
14
- # [:polymorphic]
15
- # Specify if the association is polymorphic
16
- # Example:
17
- # class Driver < Superstore::Base
18
- # end
19
- # class Truck < Superstore::Base
20
- # end
21
- def belongs_to(name, options = {})
22
- Superstore::BelongsTo::Builder.build(self, name, options)
23
- end
24
-
25
- def generated_belongs_to_methods
26
- @generated_belongs_to_methods ||= begin
27
- mod = const_set(:GeneratedBelongsToMethods, Module.new)
28
- include mod
29
- mod
30
- end
31
- end
32
- end
33
-
34
- # Returns the belongs_to instance for the given name, instantiating it if it doesn't already exist
35
- def belongs_to_association(name)
36
- association = belongs_to_instance_get(name)
37
-
38
- if association.nil?
39
- association = Superstore::BelongsTo::Association.new(self, belongs_to_reflections[name])
40
- belongs_to_instance_set(name, association)
41
- end
42
-
43
- association
44
- end
45
-
46
- private
47
- def clear_belongs_to_cache
48
- belongs_to_cache.clear if persisted?
49
- end
50
-
51
- def belongs_to_cache
52
- @belongs_to_cache ||= {}
53
- end
54
-
55
- def belongs_to_instance_get(name)
56
- belongs_to_cache[name.to_sym]
57
- end
58
-
59
- def belongs_to_instance_set(name, association)
60
- belongs_to_cache[name.to_sym] = association
61
- end
62
- end
63
- end
@@ -1,52 +0,0 @@
1
- module Superstore
2
- module Statements
3
- DEFAULT_CREATE_KEYSPACE = {
4
- 'strategy_class' => 'SimpleStrategy',
5
- 'strategy_options:replication_factor' => 1
6
- }
7
-
8
- def create_keyspace(keyspace, options = nil)
9
- stmt = "CREATE KEYSPACE #{keyspace}"
10
-
11
- options ||= DEFAULT_CREATE_KEYSPACE
12
-
13
- system_execute adapter.statement_with_options(stmt, options)
14
- end
15
-
16
- def drop_keyspace(keyspace)
17
- system_execute "DROP KEYSPACE #{keyspace}"
18
- end
19
-
20
- def create_column_family(column_family, options = {})
21
- create_table column_family, options
22
- end
23
-
24
- def alter_column_family(column_family, instruction, options = {})
25
- stmt = "ALTER TABLE #{column_family} #{instruction}"
26
- keyspace_execute adapter.statement_with_options(stmt, options)
27
- end
28
-
29
- def drop_column_family(column_family)
30
- drop_table column_family
31
- end
32
-
33
- def add_index(column_family, column, index_name = nil)
34
- stmt = "CREATE INDEX #{index_name.nil? ? '' : index_name} ON #{column_family} (#{column})"
35
- keyspace_execute stmt
36
- end
37
-
38
- # If the index was not given a name during creation, the index name is <columnfamily_name>_<column_name>_idx.
39
- def drop_index(index_name)
40
- keyspace_execute "DROP INDEX #{index_name}"
41
- end
42
-
43
-
44
- def keyspace_execute(cql)
45
- adapter.schema_execute cql, Superstore::Base.config[:keyspace]
46
- end
47
-
48
- def system_execute(cql)
49
- adapter.schema_execute cql, 'system'
50
- end
51
- end
52
- end
@@ -1,47 +0,0 @@
1
- module Superstore
2
- module Tasks
3
- def dump(io)
4
- table_names.each do |column_family|
5
- io.puts run_command("DESCRIBE COLUMNFAMILY #{column_family}")
6
- io.puts
7
- end
8
- end
9
-
10
- def load(io)
11
- current_cql = ''
12
-
13
- io.each_line do |line|
14
- next if line.blank?
15
-
16
- current_cql << line.rstrip
17
-
18
- if current_cql =~ /;$/
19
- keyspace_execute current_cql
20
- current_cql = ''
21
- end
22
- end
23
- end
24
-
25
- def table_names
26
- run_command('DESCRIBE COLUMNFAMILIES').split.sort
27
- end
28
-
29
- private
30
-
31
- def run_command(command)
32
- `echo "#{command};" | #{cqlsh} -2 -k #{keyspace} #{server}`.sub(/^(.*)$/, '').strip
33
- end
34
-
35
- def cqlsh
36
- ENV['CQLSH'] || 'cqlsh'
37
- end
38
-
39
- def keyspace
40
- Superstore::Base.config[:keyspace]
41
- end
42
-
43
- def server
44
- Superstore::Base.adapter.servers.first.gsub(/:.*/, '')
45
- end
46
- end
47
- end
@@ -1,9 +0,0 @@
1
- require 'superstore/cassandra_schema/statements'
2
- require 'superstore/cassandra_schema/tasks'
3
-
4
- module Superstore
5
- class CassandraSchema < Schema
6
- extend Superstore::Statements
7
- extend Superstore::Tasks
8
- end
9
- end
@@ -1,44 +0,0 @@
1
- module Superstore
2
- class LogSubscriber < ActiveSupport::LogSubscriber
3
- def self.runtime=(value)
4
- Thread.current["cassandra_object_request_runtime"] = value
5
- end
6
-
7
- def self.runtime
8
- Thread.current["cassandra_object_request_runtime"] ||= 0
9
- end
10
-
11
- def self.reset_runtime
12
- rt, self.runtime = runtime, 0
13
- rt
14
- end
15
-
16
- def initialize
17
- super
18
- @odd_or_even = false
19
- end
20
-
21
- def cql(event)
22
- self.class.runtime += event.duration
23
-
24
- payload = event.payload
25
- name = '%s (%.1fms)' % [payload[:name], event.duration]
26
- cql = payload[:cql].squeeze(' ')
27
-
28
- if odd?
29
- name = color(name, CYAN, true)
30
- cql = color(cql, nil, true)
31
- else
32
- name = color(name, MAGENTA, true)
33
- end
34
-
35
- debug " #{name} #{cql}"
36
- end
37
-
38
- def odd?
39
- @odd_or_even = !@odd_or_even
40
- end
41
- end
42
- end
43
-
44
- Superstore::LogSubscriber.attach_to :cassandra_object
@@ -1,45 +0,0 @@
1
- require 'active_support/core_ext/module/attr_internal'
2
- require 'superstore/log_subscriber'
3
-
4
- module Superstore
5
- module Railties # :nodoc:
6
- module ControllerRuntime #:nodoc:
7
- extend ActiveSupport::Concern
8
-
9
- module ClassMethods # :nodoc:
10
- def log_process_action(payload)
11
- messages, cassandra_object_runtime = super, payload[:cassandra_object_runtime]
12
- if cassandra_object_runtime.to_i > 0
13
- messages << ("Superstore: %.1fms" % cassandra_object_runtime.to_f)
14
- end
15
- messages
16
- end
17
- end
18
-
19
- #private
20
-
21
- attr_internal :cassandra_object_runtime
22
-
23
- def process_action(action, *args)
24
- # We also need to reset the runtime before each action
25
- # because of queries in middleware or in cases we are streaming
26
- # and it won't be cleaned up by the method below.
27
- Superstore::LogSubscriber.reset_runtime
28
- super
29
- end
30
-
31
- def cleanup_view_runtime
32
- runtime_before_render = Superstore::LogSubscriber.reset_runtime
33
- runtime = super
34
- runtime_after_render = Superstore::LogSubscriber.reset_runtime
35
- self.cassandra_object_runtime = runtime_before_render + runtime_after_render
36
- runtime - runtime_after_render
37
- end
38
-
39
- def append_info_to_payload(payload)
40
- super
41
- payload[:cassandra_object_runtime] = (cassandra_object_runtime || 0) + Superstore::LogSubscriber.reset_runtime
42
- end
43
- end
44
- end
45
- end
@@ -1,59 +0,0 @@
1
- ks_namespace = namespace :ks do
2
- desc 'Create the keyspace in config/superstore.yml for the current environment'
3
- task create: :environment do
4
- begin
5
- Superstore::CassandraSchema.create_keyspace Superstore::Base.config[:keyspace], Superstore::Base.config[:keyspace_options]
6
- rescue Exception => e
7
- if e.message =~ /conflicts/
8
- p "Keyspace #{Superstore::Base.config[:keyspace]} already exists"
9
- else
10
- raise e
11
- end
12
- end
13
- end
14
-
15
- desc 'Remove the keyspace in config/superstore.yml for the current environment'
16
- task drop: :environment do
17
- begin
18
- Superstore::CassandraSchema.drop_keyspace Superstore::Base.config[:keyspace]
19
- rescue Exception => e
20
- if e.message =~ /non existing keyspace/
21
- p "Keyspace #{Superstore::Base.config[:keyspace]} does not exist"
22
- else
23
- raise e
24
- end
25
- end
26
- end
27
-
28
- desc 'Alias for ks:drop and ks:setup'
29
- task reset: [:drop, :setup]
30
-
31
- desc 'Alias for ks:create and ks:structure:load'
32
- task setup: [:create, :_load]
33
-
34
- namespace :structure do
35
- desc 'Serialize the current structure for the keyspace in config/superstore.yml to the SCHEMA environment variable (defaults to "$RAILS_ROOT/ks/structure.cql")'
36
- task dump: :environment do
37
- filename = ENV['SCHEMA'] || "#{Rails.root}/ks/structure.cql"
38
- File.open(filename, "w:utf-8") do |file|
39
- Superstore::CassandraSchema.dump(file)
40
- end
41
- end
42
-
43
- desc 'Load the structure for the keyspace in config/superstore.yml from the SCHEMA environment variable (defaults to "$RAILS_ROOT/ks/structure.cql")'
44
- task load: :environment do
45
- filename = ENV['SCHEMA'] || "#{Rails.root}/ks/structure.cql"
46
- File.open(filename) do |file|
47
- Superstore::CassandraSchema.load(file)
48
- end
49
- end
50
- end
51
-
52
- task :_dump do
53
- ks_namespace["structure:dump"].invoke
54
- end
55
-
56
- task :_load do
57
- ks_namespace["structure:load"].invoke
58
- end
59
- end
@@ -1,46 +0,0 @@
1
- Bundler.require :cassandra
2
-
3
- Superstore::Base.config = {
4
- keyspace: 'superstore_test',
5
- servers: '127.0.0.1:9160',
6
- consistency: 'QUORUM',
7
- thrift: {
8
- timeout: 5
9
- }
10
- }
11
-
12
- begin
13
- Superstore::CassandraSchema.drop_keyspace 'superstore_test'
14
- rescue Exception => e
15
- end
16
-
17
- sleep 1
18
- Superstore::CassandraSchema.create_keyspace 'superstore_test'
19
- Superstore::CassandraSchema.create_column_family 'Issues'
20
- Superstore::CassandraSchema.alter_column_family 'Issues', "ADD title varchar"
21
- Superstore::CassandraSchema.add_index 'Issues', 'title', "issues_title_idx"
22
-
23
- Superstore::Base.class_eval do
24
- class_attribute :created_records
25
- self.created_records = []
26
-
27
- after_create do
28
- created_records << self
29
- end
30
-
31
- def self.delete_after_test
32
- # created_records.reject(&:destroyed?).each(&:destroy)
33
- Issue.delete_all
34
- created_records.clear
35
- end
36
- end
37
-
38
- module ActiveSupport
39
- class TestCase
40
- teardown do
41
- if Superstore::Base.created_records.any?
42
- Superstore::Base.delete_after_test
43
- end
44
- end
45
- end
46
- end