Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion server/lib/utils/payload_generator/dynamic_sql.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,26 @@ def self.generate_query(model, harvest_values)

input_config.each do |config|
dynamic_var_name = ":#{config['name']}"
dynamic_var_value = config["value_type"] == "static" ? config["value"] : harvest_values[config["name"]]
raw_value = config["value_type"] == "static" ? config["value"] : harvest_values[config["name"]]
dynamic_var_value = if config["type"] == "string"
if already_quoted?(dynamic_query, dynamic_var_name)
raw_value.gsub("'", "''")
else
"'#{raw_value.gsub("'", "''")}'"
end
else
raw_value.to_s
end

dynamic_query.gsub!(dynamic_var_name, dynamic_var_value)
end

dynamic_query
end

def self.already_quoted?(query, placeholder)
query.match?(/'\s*#{Regexp.escape(placeholder)}\s*'/)
end
end
end
end
27 changes: 27 additions & 0 deletions server/spec/lib/utils/payload_generator/dynamic_sql_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,43 @@
query: "SELECT * FROM public.actor WHERE name=':name' AND age=:age AND gender=':gender'")
end

let!(:dynamic_sql_model_not_quoted) do
create(:model, query_type: :dynamic_sql, connector: dynamic_sql_connector,
configuration: {
json_schema: {
input: [{ "name" => "name",
"type" => "string", "value" => "", "value_type" => "dynamic" },
{ "name" => "age",
"type" => "number", "value" => "22", "value_type" => "static" },
{ "name" => "gender",
"type" => "string", "value" => "", "value_type" => "dynamic" }],
output: []
},
harvesters: []
},
query: "SELECT * FROM public.actor WHERE name=:name AND age=:age AND gender=:gender")
end

let(:harvesters) do
{ "name" => "first_name", "gender" => "female" }
end

let(:harvesters_not_quoted) do
{ "name" => "last_name", "gender" => "male" }
end

context "when correct input and harvest values are provided" do
it "replaces dynamic query values and return raw query" do
expected_query = "SELECT * FROM public.actor WHERE name='first_name' AND age=22 AND gender='female'"
generated_query = described_class.generate_query(dynamic_sql_model, harvesters)
expect(generated_query).to eq(expected_query)
end

it "replaces dynamic query values and return raw query" do
expected_query = "SELECT * FROM public.actor WHERE name='last_name' AND age=22 AND gender='male'"
generated_query = described_class.generate_query(dynamic_sql_model_not_quoted, harvesters_not_quoted)
expect(generated_query).to eq(expected_query)
end
end
end
end