Skip to content

Commit 51f411b

Browse files
committed
[NEP-18090]: Splitting the class into 2. Dashboard::Warmup class warms up all datasets of the dashboard and Dataset::Warmup class warms_up individual datasets
1 parent aed62ac commit 51f411b

File tree

4 files changed

+115
-72
lines changed

4 files changed

+115
-72
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
module Superset
2+
module Dashboard
3+
class WarmUpCache < Superset::Request
4+
5+
attr_reader :dashboard_id
6+
7+
def initialize(dashboard_id:)
8+
@dashboard_id = dashboard_id
9+
end
10+
11+
def perform
12+
validate_dashboard_id
13+
response
14+
end
15+
16+
def response
17+
dataset_details = fetch_dataset_details(dashboard_id)
18+
dataset_details.each do |dataset|
19+
begin
20+
warm_up_dataset(dataset["datasource_name"], dataset["name"])
21+
rescue => e
22+
Rollbar.error("Warm up cache failed for the dashboard #{dashboard_id.to_s} and for the dataset #{dataset["datasource_name"]} - #{e}")
23+
end
24+
end
25+
end
26+
27+
def warm_up_dataset(dataset_name, db_name)
28+
Superset::Dataset::WarmUpCache.new(dashboard_id: dashboard_id, table_name: dataset_name, db_name: db_name).perform
29+
end
30+
31+
private
32+
33+
def validate_dashboard_id
34+
raise InvalidParameterError, "dashboard_id must be present and must be an integer" unless dashboard_id.present? && dashboard_id.is_a?(Integer)
35+
end
36+
37+
def fetch_dataset_details(dashboard_id)
38+
Superset::Dashboard::Datasets::List.new(dashboard_id).datasets_details.map { |dataset| dataset['database'].slice('name').merge(dataset.slice('datasource_name'))}
39+
end
40+
end
41+
end
42+
end

lib/superset/dataset/warm_up_cache.rb

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,32 @@ module Superset
22
module Dataset
33
class WarmUpCache < Superset::Request
44

5-
attr_reader :dashboard_id
5+
attr_reader :dashboard_id, :table_name, :db_name
66

7-
def initialize(dashboard_id:)
7+
def initialize(dashboard_id:, table_name:, db_name:)
88
@dashboard_id = dashboard_id
9+
@table_name = table_name
10+
@db_name = db_name
911
end
1012

1113
def perform
12-
validate_dashboard_id
1314
response
1415
end
1516

1617
def response
17-
dataset_details = fetch_dataset_details(dashboard_id)
18-
dataset_details.each do |dataset|
19-
begin
20-
logger.info("Hitting #{route} for warming up the cache for the dashboard #{dashboard_id.to_s} and for the dataset #{dataset["datasource_name"]}")
21-
api_response(dataset["datasource_name"], dataset["name"])
22-
rescue => e
23-
Rollbar.error("Warm up cache failed for the dashboard #{dashboard_id.to_s} and for the dataset #{dataset["datasource_name"]} - #{e}")
24-
end
25-
end
18+
logger.info("Hitting #{route} for warming up the cache for the dashboard #{dashboard_id.to_s} and for the dataset #{table_name}")
19+
client.put(route, params(dashboard_id, table_name, db_name))
2620
end
2721

28-
def api_response(dataset_name, db_name)
29-
client.put(route, params(dashboard_id, dataset_name, db_name))
30-
end
31-
32-
def params(dashboard_id, dataset_name, db_name)
22+
def params(dashboard_id, table_name, db_name)
3323
{
3424
"dashboard_id" => dashboard_id,
35-
"table_name" => dataset_name,
25+
"table_name" => table_name,
3626
"db_name" => db_name
3727
}
3828
end
3929

4030
private
41-
42-
def validate_dashboard_id
43-
raise InvalidParameterError, "dashboard_id must be present and must be an integer" unless dashboard_id.present? && dashboard_id.is_a?(Integer)
44-
end
45-
46-
def fetch_dataset_details(dashboard_id)
47-
Superset::Dashboard::Datasets::List.new(dashboard_id).datasets_details.map { |dataset| dataset['database'].slice('name').merge(dataset.slice('datasource_name'))}
48-
end
4931

5032
def route
5133
"dataset/warm_up_cache"
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe Superset::Dashboard::WarmUpCache do
4+
subject { described_class.new(dashboard_id: dashboard_id) }
5+
let(:dashboard_id) { 1 }
6+
7+
describe '.perform' do
8+
context "Dataset count is not considered" do
9+
let(:response) { nil }
10+
before do
11+
allow(subject).to receive(:response).and_return(response)
12+
end
13+
context 'when dashboard_id is not present' do
14+
let(:dashboard_id) { nil }
15+
16+
it 'raises an error' do
17+
expect { subject.perform }.to raise_error(Superset::Request::InvalidParameterError, "dashboard_id must be present and must be an integer")
18+
end
19+
end
20+
21+
context 'when dashboard_id is not an integer' do
22+
let(:dashboard_id) { 'string' }
23+
24+
it 'raises an error' do
25+
expect { subject.perform }.to raise_error(Superset::Request::InvalidParameterError, "dashboard_id must be present and must be an integer")
26+
end
27+
end
28+
29+
context 'when dashboard_id is an integer' do
30+
let(:response) { 'Dashboard warmed up' }
31+
32+
it 'warms up the dashboard' do
33+
expect(subject.perform).to eq response
34+
end
35+
end
36+
end
37+
38+
context 'when dashboard has multiple datasets' do
39+
let(:dataset_details) do
40+
[
41+
{"name"=>"client database 1", "datasource_name"=>"datasource 101"},
42+
{"name"=>"client database 2", "datasource_name"=>"datasource 102"},
43+
]
44+
end
45+
let(:api_response) { "Datasets warmed up" }
46+
before do
47+
allow(subject).to receive(:fetch_dataset_details).with(dashboard_id) { dataset_details }
48+
allow(subject).to receive(:warm_up_dataset).and_return(api_response)
49+
end
50+
it 'warms up all the datasets' do
51+
subject.response
52+
expect(subject).to have_received(:warm_up_dataset).exactly(dataset_details.count).times
53+
end
54+
end
55+
end
56+
end
Lines changed: 9 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,19 @@
11
require 'spec_helper'
22

33
RSpec.describe Superset::Dataset::WarmUpCache do
4-
subject { described_class.new(dashboard_id: dashboard_id) }
4+
subject { described_class.new(dashboard_id: dashboard_id, table_name: table_name, db_name: db_name) }
55
let(:dashboard_id) { 1 }
6+
let(:table_name) { "Dataset 101"}
7+
let(:db_name) { "Client Database 1" }
8+
before do
9+
allow(subject).to receive(:response).and_return(response)
10+
end
611

712
describe '.perform' do
8-
context "Dataset count is not considered" do
9-
let(:response) { nil }
10-
before do
11-
allow(subject).to receive(:response).and_return(response)
12-
end
13-
context 'when dashboard_id is not present' do
14-
let(:dashboard_id) { nil }
15-
16-
it 'raises an error' do
17-
expect { subject.perform }.to raise_error(Superset::Request::InvalidParameterError, "dashboard_id must be present and must be an integer")
18-
end
19-
end
20-
21-
context 'when dashboard_id is not an integer' do
22-
let(:dashboard_id) { 'string' }
23-
24-
it 'raises an error' do
25-
expect { subject.perform }.to raise_error(Superset::Request::InvalidParameterError, "dashboard_id must be present and must be an integer")
26-
end
27-
end
28-
29-
context 'when dashboard_id is an integer' do
30-
let(:response) { 'Dashboard warmed up' }
31-
32-
it 'warms up the dashboard' do
33-
expect(subject.perform).to eq response
34-
end
35-
end
36-
end
13+
let(:response) { 'Dataset warmed up' }
3714

38-
context 'when dashboard has multiple datasets' do
39-
let(:dataset_details) do
40-
[
41-
{"name"=>"client database 1", "datasource_name"=>"datasource 101"},
42-
{"name"=>"client database 2", "datasource_name"=>"datasource 102"},
43-
]
44-
end
45-
let(:api_response) { "Dataset warmed up" }
46-
before do
47-
allow(subject).to receive(:fetch_dataset_details).with(dashboard_id) { dataset_details }
48-
allow(subject).to receive(:api_response).and_return(api_response)
49-
end
50-
it 'warms up all the datasets' do
51-
subject.response
52-
expect(subject).to have_received(:api_response).exactly(dataset_details.count).times
53-
end
15+
it 'warms up the dataset' do
16+
expect(subject.perform).to eq response
5417
end
5518
end
5619
end

0 commit comments

Comments
 (0)