Skip to content

Commit 23ac3a3

Browse files
committed
Add Update dataset query endpoint
1 parent e709f47 commit 23ac3a3

File tree

4 files changed

+111
-2
lines changed

4 files changed

+111
-2
lines changed

lib/superset/dataset/duplicate.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class Duplicate < Superset::Request
77

88
attr_reader :source_dataset_id, :new_dataset_name
99

10-
def initialize(source_dataset_id: :source_dataset_id, new_dataset_name: :new_dataset_name)
10+
def initialize(source_dataset_id: , new_dataset_name: )
1111
@source_dataset_id = source_dataset_id
1212
@new_dataset_name = new_dataset_name
1313
end
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
module Superset
2+
module Dataset
3+
class UpdateQuery < Superset::Request
4+
5+
attr_reader :new_query, :dataset_id
6+
7+
def initialize(dataset_id: ,new_query: )
8+
@new_query = new_query
9+
@dataset_id = dataset_id
10+
end
11+
12+
def perform
13+
validate_proposed_changes
14+
15+
response
16+
end
17+
18+
def response
19+
@response ||= client.put(route, params)
20+
end
21+
22+
def params
23+
{ "sql": new_query }
24+
end
25+
26+
# check if the sql query embedds the schema name, if so it can not be duplicated cleanly
27+
def sql_query_includes_hard_coded_schema?
28+
new_query.include?("#{source_dataset['schema']}.")
29+
end
30+
31+
def source_dataset
32+
# will raise an error if the dataset does not exist
33+
@source_dataset ||= begin
34+
dataset = Get.new(dataset_id)
35+
dataset.result
36+
end
37+
end
38+
39+
private
40+
41+
def validate_proposed_changes
42+
logger.info " Validating Dataset ID: #{dataset_id} query update to '#{new_query}'"
43+
raise "Error: dataset_id integer is required" unless dataset_id.present? && dataset_id.is_a?(Integer)
44+
raise "Error: new_query string is required" unless new_query.present? && new_query.is_a?(String)
45+
46+
# does the sql query hard code the current schema name?
47+
raise "Error: >>WARNING<< The Dataset ID #{dataset_id} SQL query is hard coded with the schema value and can not be duplicated cleanly. " +
48+
"Remove all direct embedded schema calls from the Dataset SQL query before continuing." if sql_query_includes_hard_coded_schema?
49+
end
50+
51+
def route
52+
"dataset/#{dataset_id}"
53+
end
54+
end
55+
end
56+
end

lib/superset/dataset/update_schema.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class UpdateSchema < Superset::Request
44

55
attr_reader :source_dataset_id, :target_database_id, :target_schema, :remove_copy_suffix
66

7-
def initialize(source_dataset_id: :source_dataset_id, target_database_id: :target_database_id, target_schema: :target_schema, remove_copy_suffix: false)
7+
def initialize(source_dataset_id: , target_database_id: , target_schema: , remove_copy_suffix: false)
88
@source_dataset_id = source_dataset_id
99
@target_database_id = target_database_id
1010
@target_schema = target_schema
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe Superset::Dataset::UpdateQuery do
4+
subject { described_class.new(
5+
dataset_id: dataset_id,
6+
new_query: new_query) }
7+
8+
let(:dataset_id) { 226 }
9+
let(:new_query) { 'select blah from some_table' }
10+
11+
let(:response) { { "id"=>dataset_id , "result" => { "sql" => new_query } } }
12+
13+
before do
14+
allow(subject).to receive(:response).and_return(response)
15+
allow(subject).to receive(:source_dataset).and_return( { schema: 'client2', sql: 'select fu from dif_table' }.with_indifferent_access)
16+
end
17+
18+
describe '#perform' do
19+
context 'with valid params' do
20+
specify do
21+
expect(subject.perform).to eq response
22+
end
23+
end
24+
25+
context 'with invalid params' do
26+
context 'dataset_id is empty' do
27+
let(:dataset_id) { nil }
28+
29+
specify do
30+
expect { subject.perform }.to raise_error(RuntimeError, "Error: dataset_id integer is required")
31+
end
32+
end
33+
34+
context 'new_query is empty' do
35+
let(:new_query) { nil }
36+
37+
specify do
38+
expect { subject.perform }.to raise_error(RuntimeError, "Error: new_query string is required")
39+
end
40+
end
41+
42+
context 'new_query hard codes schema name' do
43+
let(:new_query) { 'select fu from client2.dif_table' }
44+
45+
specify do
46+
expect { subject.perform }.to raise_error(RuntimeError,
47+
"Error: >>WARNING<< The Dataset ID 226 SQL query is hard coded with the schema value and can not be duplicated cleanly. " \
48+
"Remove all direct embedded schema calls from the Dataset SQL query before continuing.")
49+
end
50+
end
51+
end
52+
end
53+
end

0 commit comments

Comments
 (0)