quandl_cassandra_models 0.3.12 → 0.3.13
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.
- checksums.yaml +4 -4
- data/UPGRADE.md +8 -0
- data/lib/quandl/cassandra/models/column/write/insert_column_attributes.rb +1 -1
- data/lib/quandl/cassandra/models/column/write/insert_columns.rb +1 -1
- data/lib/quandl/cassandra/models/column/write/validate.rb +10 -0
- data/lib/quandl/cassandra/models/column/write.rb +4 -1
- data/lib/quandl/cassandra/models/data/search.rb +56 -5
- data/lib/quandl/cassandra/models/version.rb +1 -1
- data/spec/lib/quandl/cassandra/models/data/search_spec.rb +47 -0
- metadata +4 -2
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4259f1381c30f2b0931bd4972551d33c70286c71
|
4
|
+
data.tar.gz: 6bb2d31d9a58d24f89ee3379185e2c0af713d420
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f789664acaf5f8afae282a7fcc42147735af37bedcb1661b2aa76f6c13081393d2cdbd441a9b76deb3ab5f65485a44a956877df03bd9e3cd25b50caa5b020cb6
|
7
|
+
data.tar.gz: 773b3492342adc6372329848736fbfb0c376b7724407416ebbf64e20ba02d814e23fde5592c1f9681fcc304282de3e6ff0f2360a2a79c0e9580262e74d7c602a
|
data/UPGRADE.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 0.3.13
|
2
|
+
|
3
|
+
* dataset.data.delete_rows_by_time(*times) passes
|
4
|
+
* add write validation that asserts required keys
|
5
|
+
* dataset.data.delete_collapses pass specs
|
6
|
+
* remove travis.yml
|
7
|
+
|
8
|
+
|
1
9
|
## 0.3.12
|
2
10
|
|
3
11
|
* refactor read to use define_attributes for trim_start, trim_end, collapse WIKI-28 passes
|
@@ -13,7 +13,7 @@ class Quandl::Cassandra::Models::Column::Write::InsertColumnAttributes < Quandl:
|
|
13
13
|
# insert dataset_attribute
|
14
14
|
Quandl::Cassandra::Base.execute("INSERT INTO dataset_attributes (id, updated_at, frequency) VALUES (#{id}, #{(Time.now.to_f * 1000).to_i}, '#{frequency}')")
|
15
15
|
# insert data
|
16
|
-
Quandl::Cassandra::Batch.
|
16
|
+
Quandl::Cassandra::Batch.execute(rows_values) do |id, column_id, position, frequency|
|
17
17
|
%Q{INSERT INTO datasets (id, column_id, position) VALUES (#{id}, #{column_id}, #{position})
|
18
18
|
INSERT INTO column_attributes ( id, frequency ) VALUES ( #{column_id}, '#{frequency}' )}
|
19
19
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Quandl::Cassandra::Models::Column::Write::InsertColumns < Quandl::Cassandra::Models::Column::Write
|
2
2
|
|
3
3
|
def perform
|
4
|
-
Quandl::Cassandra::Batch.
|
4
|
+
Quandl::Cassandra::Batch.execute(statement_values) do |id, type, time, value|
|
5
5
|
"INSERT INTO columns (id, type, time, value) VALUES (#{id}, '#{type}', #{time}, #{value})"
|
6
6
|
end
|
7
7
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Quandl::Cassandra::Models::Column::Write::Validate < Quandl::Cassandra::Models::Column::Write
|
2
|
+
|
3
|
+
def perform
|
4
|
+
# ensure args are present
|
5
|
+
if attributes[:id].blank? || attributes[:data].blank?
|
6
|
+
raise ArgumentError, "attributes require keys [:id, :data], you passed #{attributes.keys} "
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -3,6 +3,7 @@ class Quandl::Cassandra::Models::Column::Write < Quandl::Strategy::Strategize
|
|
3
3
|
# strategy attributes
|
4
4
|
define_attributes :id, :data, :frequency, :column_ids, :frequency_data, :frequency_column_data, :statement_values
|
5
5
|
|
6
|
+
require_relative 'write/validate'
|
6
7
|
require_relative 'write/insert_columns'
|
7
8
|
require_relative 'write/insert_column_attributes'
|
8
9
|
require_relative 'write/group_data_by_column'
|
@@ -10,7 +11,9 @@ class Quandl::Cassandra::Models::Column::Write < Quandl::Strategy::Strategize
|
|
10
11
|
|
11
12
|
# execute strategy
|
12
13
|
def self.perform(attributes)
|
14
|
+
# perform strategy
|
13
15
|
strategy = Quandl::Strategy.new( attributes ) do |c|
|
16
|
+
c.use Quandl::Cassandra::Models::Column::Write::Validate
|
14
17
|
c.use Quandl::Cassandra::Models::Column::Write::GroupDataByFrequency
|
15
18
|
c.use Quandl::Cassandra::Models::Column::Write::GroupDataByColumn
|
16
19
|
c.use Quandl::Cassandra::Models::Column::Write::InsertColumns
|
@@ -18,7 +21,7 @@ class Quandl::Cassandra::Models::Column::Write < Quandl::Strategy::Strategize
|
|
18
21
|
end
|
19
22
|
strategy.perform
|
20
23
|
rescue => e
|
21
|
-
Quandl::Logger.error("#{e} #{
|
24
|
+
Quandl::Logger.error("#{e} #{attributes}")
|
22
25
|
raise
|
23
26
|
end
|
24
27
|
|
@@ -44,6 +44,7 @@ module Quandl::Cassandra::Models::Data::Search
|
|
44
44
|
date = Date.jd(value) if value.is_a?(Integer)
|
45
45
|
date = Date.parse(value) if value.is_a?(String) && value =~ /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/
|
46
46
|
date = value if value.is_a?(Date)
|
47
|
+
date = value.to_date if value.respond_to?(:to_date)
|
47
48
|
date.jd
|
48
49
|
rescue
|
49
50
|
nil
|
@@ -55,13 +56,34 @@ module Quandl::Cassandra::Models::Data::Search
|
|
55
56
|
delegate :to_a, :==, :inspect, :first, :flatten, :[], :collect, :<=>, :each, :each_with_index, :to_date, :to_h, to: :all, allow_nil: true
|
56
57
|
|
57
58
|
def delete_all(*args)
|
58
|
-
if
|
59
|
-
result = Quandl::Cassandra::Models::Column.where( id:
|
59
|
+
if dataset_column_ids.present?
|
60
|
+
result = Quandl::Cassandra::Models::Column.where( id: dataset_column_ids ).delete_all
|
60
61
|
return result.nil? ? true : result
|
61
62
|
end
|
62
63
|
false
|
63
64
|
end
|
64
|
-
|
65
|
+
|
66
|
+
def delete_rows_by_time(*times)
|
67
|
+
times = Array(times).flatten
|
68
|
+
# dataset_column_ids are required
|
69
|
+
return false unless dataset_column_ids
|
70
|
+
statement_values = []
|
71
|
+
# for each column_id
|
72
|
+
dataset_column_ids.each do |column_id|
|
73
|
+
# for each time
|
74
|
+
times.each do |time|
|
75
|
+
# delete the requested column_id_time
|
76
|
+
statement_values << [column_id, time]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# execute deletion of rquested rows
|
80
|
+
Quandl::Cassandra::Batch.execute(statement_values) do |id, time|
|
81
|
+
"DELETE FROM columns WHERE id = #{id} AND type = 'source' AND time = #{time}"
|
82
|
+
end
|
83
|
+
# delete collapse data and regenerate
|
84
|
+
regenerate_collapses_from_source
|
85
|
+
end
|
86
|
+
|
65
87
|
def count(*args)
|
66
88
|
attributes[:count] = true
|
67
89
|
result = dataset? ? fetch.to_i : 0
|
@@ -74,7 +96,7 @@ module Quandl::Cassandra::Models::Data::Search
|
|
74
96
|
end
|
75
97
|
|
76
98
|
def dataset?
|
77
|
-
self.id.present? ||
|
99
|
+
self.id.present? || dataset_column_ids.present?
|
78
100
|
end
|
79
101
|
|
80
102
|
def fetched?
|
@@ -84,11 +106,15 @@ module Quandl::Cassandra::Models::Data::Search
|
|
84
106
|
def scoped
|
85
107
|
s = self.class.new
|
86
108
|
s.id( self.id ) if id.present?
|
87
|
-
s.column_ids(
|
109
|
+
s.column_ids( dataset_column_ids ) if dataset_column_ids.present?
|
88
110
|
s.column_frequencies(attributes[:column_frequencies]) if attributes[:column_frequencies].present?
|
89
111
|
s
|
90
112
|
end
|
91
113
|
|
114
|
+
def dataset_column_ids
|
115
|
+
attributes[:column_ids]
|
116
|
+
end
|
117
|
+
|
92
118
|
protected
|
93
119
|
|
94
120
|
def fetch
|
@@ -98,6 +124,31 @@ module Quandl::Cassandra::Models::Data::Search
|
|
98
124
|
Quandl::Cassandra::Models::Column.read( attributes.merge(scope_attributes) )
|
99
125
|
end
|
100
126
|
|
127
|
+
private
|
128
|
+
|
129
|
+
def regenerate_collapses_from_source
|
130
|
+
# delete collapse data
|
131
|
+
delete_collapses
|
132
|
+
# get existing data
|
133
|
+
data = Quandl::Cassandra::Models::Column.read( column_ids: dataset_column_ids )
|
134
|
+
# rewrite data
|
135
|
+
Quandl::Cassandra::Models::Column.write( id: id, data: data, column_ids: dataset_column_ids )
|
136
|
+
end
|
137
|
+
|
138
|
+
def delete_collapses
|
139
|
+
statement_values = []
|
140
|
+
# for each column
|
141
|
+
dataset_column_ids.each do |column_id|
|
142
|
+
# for each collapse
|
143
|
+
Quandl::Operation::Collapse.collapses_greater_than(:daily).each do |collapse|
|
144
|
+
statement_values << [ column_id, collapse ]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
# execute deletion
|
148
|
+
Quandl::Cassandra::Batch.execute(statement_values) do |id, type|
|
149
|
+
"DELETE FROM columns WHERE id = #{id} AND type = '#{type}'"
|
150
|
+
end
|
151
|
+
end
|
101
152
|
|
102
153
|
end
|
103
154
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Quandl::Cassandra::Models::Data::Search do
|
4
|
+
|
5
|
+
let(:dataset){ create(:dataset) }
|
6
|
+
|
7
|
+
describe "#delete_collapses" do
|
8
|
+
before(:each){ dataset.data.send(:delete_collapses) }
|
9
|
+
|
10
|
+
it "dataset.data.to_a should be_present" do
|
11
|
+
dataset.data.scoped.to_a.should be_present
|
12
|
+
end
|
13
|
+
|
14
|
+
[:weekly, :monthly, :quarterly, :annual].each do |collapse|
|
15
|
+
it "data.collapse(#{collapse}).to_a should be_blank" do
|
16
|
+
dataset.data.scoped.collapse(collapse).to_a.should be_blank
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#regenerate_collapses_from_source" do
|
20
|
+
before(:each){ dataset.data.send(:regenerate_collapses_from_source) }
|
21
|
+
|
22
|
+
it "data.collapse(#{collapse}).to_a should be_present" do
|
23
|
+
dataset.data.scoped.collapse(collapse).to_a.should be_present
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#delete_rows_by_time" do
|
31
|
+
|
32
|
+
let(:dates){ dataset.data.scoped.to_table.to_h.keys }
|
33
|
+
|
34
|
+
let(:times){ [ dates[1], dates[5], dates[7], dates[10] ] }
|
35
|
+
|
36
|
+
before(:each){ dataset.data.delete_rows_by_time(times) }
|
37
|
+
|
38
|
+
it "times should be removed from data" do
|
39
|
+
data = dataset.data.scoped.to_table.to_h
|
40
|
+
times.each do |time|
|
41
|
+
data[time].should be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quandl_cassandra_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Hilscher
|
@@ -130,7 +130,6 @@ extensions: []
|
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
132
|
- .gitignore
|
133
|
-
- .travis.yml
|
134
133
|
- Gemfile
|
135
134
|
- Guardfile
|
136
135
|
- LICENSE
|
@@ -157,6 +156,7 @@ files:
|
|
157
156
|
- lib/quandl/cassandra/models/column/write/group_data_by_frequency.rb
|
158
157
|
- lib/quandl/cassandra/models/column/write/insert_column_attributes.rb
|
159
158
|
- lib/quandl/cassandra/models/column/write/insert_columns.rb
|
159
|
+
- lib/quandl/cassandra/models/column/write/validate.rb
|
160
160
|
- lib/quandl/cassandra/models/column_attribute.rb
|
161
161
|
- lib/quandl/cassandra/models/data.rb
|
162
162
|
- lib/quandl/cassandra/models/data/search.rb
|
@@ -181,6 +181,7 @@ files:
|
|
181
181
|
- spec/lib/quandl/cassandra/models/column/write_spec.rb
|
182
182
|
- spec/lib/quandl/cassandra/models/column_attribute_spec.rb
|
183
183
|
- spec/lib/quandl/cassandra/models/column_spec.rb
|
184
|
+
- spec/lib/quandl/cassandra/models/data/search_spec.rb
|
184
185
|
- spec/lib/quandl/cassandra/models/data_spec.rb
|
185
186
|
- spec/lib/quandl/cassandra/models/dataset/collapse_spec.rb
|
186
187
|
- spec/lib/quandl/cassandra/models/dataset/columns_spec.rb
|
@@ -233,6 +234,7 @@ test_files:
|
|
233
234
|
- spec/lib/quandl/cassandra/models/column/write_spec.rb
|
234
235
|
- spec/lib/quandl/cassandra/models/column_attribute_spec.rb
|
235
236
|
- spec/lib/quandl/cassandra/models/column_spec.rb
|
237
|
+
- spec/lib/quandl/cassandra/models/data/search_spec.rb
|
236
238
|
- spec/lib/quandl/cassandra/models/data_spec.rb
|
237
239
|
- spec/lib/quandl/cassandra/models/dataset/collapse_spec.rb
|
238
240
|
- spec/lib/quandl/cassandra/models/dataset/columns_spec.rb
|
data/.travis.yml
DELETED
@@ -1,5 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- "1.9.3"
|
4
|
-
script: bundle exec rspec
|
5
|
-
source_key: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBNGFHWmVzQk00V0V2TWtyVzNJODNwS2VmN3B0c3k5ZGRaNW1mT01zYm5PQnZBZ1NvClpPdHprdmw2ellYYU9Tazc4UmlYamozQVJhTG9VMU5ORWNEbVcxbHpEQlFWdjFLbmVEUGduZkoyNlNmZGJoYjAKV1ZXdWlSRldLV0I0c0Rabk0yWm42TTQ3MUpodVhFVGU5a3BiSjFIOEFSbll5LzBtSGJZQjVhcm9qNzBTZ1ZLVQpxcFNGZkZjT24vUjRxUTlrWGZrL0VmblgyYWhaUTdZYjV6Z2kxa2xRZVpHRG5ReThyZWZEM1BPYjlxeXlxV1lJCmtsT3N1SVowTVcyY244Z280dWFqNE5ZVXdvU0ltbmJyMXNldWNzRTZLTkVXV2pNMnJrNFlIQ1gvM2RKa1hpWmYKSHJMSlhRNmpReFlOaHZtUzJtOFZpRHEzcWVZVi9DQmt1MnExZXdJREFRQUJBb0gvT1VuT3Jsd2xLUlNENTBFWgpUT2NRT2I1VjNUK1pZQ2hPanY5eWJma2tDYkR5ZnBDd01PK1hhTG52ZEQrSUtQdFBQT2dCa3h3YXRaT25hWUM5CkVNVHB1RWY5N2hNcmNtaUtIUHNQRFF1REphLzVpUHBMRUdPdzdSeDV4QWU2blFNek1OblBpRXpVNUNYUDM1MmMKL3V2aU9SbVg0cSt0WEIzcWo2Q20ycW1LWXZRa3NCRWFZeVFEWWJqN1JQcUltTHlKSWI0S3JNbmlQb1p0NHdiMwprNElpdEZ3RWdicldoNFNHOFJLN1ZTTllkY1FZQ1BiaHJ1aWpXUTJxcWJ6QmFtNS9OTXl1dG52cFRKaEZGMlpGClBVSXVleW5BYU95aUFSOWdaQVRPQVNRUWxYNkJHNjUrbHJmMnd6dGduR2RLREhkMFM2ZXAxU2pxbXhMUWRqWTkKSkFweEFvR0JBUE9ncGJEeUVHaVhIR1c1MHBIV1lXOG54bzhMQzZ4SjdTQ0p5RUNYT1F6bkZVSDhNbVY0eG9PdgpaTmFXNzM2V0pQSHQ2TVhoOVRvSjVBN2FpbldPSHZWOWFlSmh6cEdXUkVjenA4OEdwQUExd2FuT2NKME82ZlhBClI2Mlk5bWc4Nmw3SE4xTmJqbVMyMzRxRTM3MUxXZGJzSUE3UHR5ZmhuaDlTUVlMMzNDRjVBb0dCQU8wVy9IdUkKUzJXck1Wb3BQajhrVXRvcFNhS1JjZUNaNzdVaWVFYzJma0JyU05mZzArbnJ2Q2R1WE5RTGM2ak9YaS9MQTM4bgpXVDU0dGdmdTVYRk1BRERpV2I5NmIyU0UxNTA0MllDeWZKdVNTWHBuZCsrNmhzVFE1aU9IVnJSSUR3OElhclFOCklqZHVSaTBOMkM3eHdUTUZnbU5TejJGeHJMV0tRb1hLVlNXVEFvR0FZZWJNcnE2WHFYQVFHVkR6TFdmWS83SWMKT0o5WHNZU0RwZSs0YVR4YjBMT0w5MWhCYUVXQWdLcWEreURzWFJJNUJuOTBheERDV3ZCZWxSbDlTb0F5TUxTVgpPRVBWbnV1anhIa2RsalEwODJDbTBuWURDeHBUS2s1NmYyaFluTXJkNC9ocVl6VUhvN0ZaWTNEQitHK3ZTbzdZCjB4cmxuMEVyS2FzRWFIenlHUUVDZ1lFQW8rMHR1emY4Y1pwUk1EYXQvRGhnTk1reFNYN296dE9BZ3F3SG42MVUKMDdPYUZQRTFkRnB5cUl6TkVDdXUxM3VBY2VrYlROSm5DU09yTUljRUN6YnlOdHA2RlVOUk81NEIrb254RU9QWAo5alRLS3lEWk0xNnppZWVxQjh5dXJVM1pZNXA5TkdxVVN1RXJFa0d0UktBUTVmY2NOUkp2b3I5WEc5b3hycEc4CkY1TUNnWUVBM1ZzeFNvNWpPQzBTcnVHaUZyZjFFZDByZVkyODBNMERwRUYvNHMwM0RFL00xdGRDWFFoM1VKZGwKTjVtUC9kUUl0QzNUTzNaMDNTK3dGckp2MGk0TGJkZHhZUDlXZVZQU2RYeUN3OFBCYjRwV3JSRGptbFh6K2F3eApyczE0WWk1WnlQUDNzWHpqTE43TWhYcGJMSUE0S3BCZ0lSVTd1SXR1SzJRMm1RSEplcW89Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg=="
|