Fix wrong layer schema when creating map from shared dataset

pull/16323/head
Alberto Miedes Garcés 3 years ago
parent ed77caf6da
commit 5a37f4ee7d

@ -44,6 +44,7 @@ Development
- Use Google Maps provider if the base layer is Google [#16314](https://github.com/CartoDB/cartodb/pull/16314)
- Allow importing datasets with exhausted map quota [#16320](https://github.com/CartoDB/cartodb/pull/16320)
- Fix empty ArcGIS imports [#16322](https://github.com/CartoDB/cartodb/pull/16322)
- Fix wrong layer schema when creating a map from a shared dataset [#16323](https://github.com/CartoDB/cartodb/pull/16323)
4.45.0 (2021-04-14)
-------------------

@ -39,10 +39,9 @@ class Carto::Analysis < ActiveRecord::Base
user_id = user.id
layer_options = layer.options
username = layer_options[:user_name] || layer.user.username
table_name = layer_options[:table_name]
qualified_table_name = safe_schema_and_table_quoting(layer.user.database_schema, table_name)
table_schema = layer.user_tables.find_by(name: table_name).user.database_schema
qualified_table_name = safe_schema_and_table_quoting(table_schema, table_name)
analysis_definition = {
id: 'abcdefghijklmnopqrstuvwxyz'[index] + '0',

@ -161,53 +161,61 @@ describe Carto::Analysis do
include Carto::Factories::Visualizations
context 'with regular user' do
before do
@user = create(:carto_user, factory_bot_context: { only_db_setup: true })
@map, @table, @table_visualization, @visualization = create_full_visualization(@user)
@layer = @visualization.data_layers.first
end
let(:user) { create(:carto_user, factory_bot_context: { only_db_setup: true }) }
let(:visualization_objects) { create_full_visualization(user) }
let(:layer) { visualization_objects[3].data_layers.first }
let(:table_name) { visualization_objects[1].name }
it 'copies the layer query' do
@layer.options[:query] = 'SELECT * FROM wadus'
analysis = Carto::Analysis.source_analysis_for_layer(@layer, 0)
analysis.analysis_node.params[:query].should eq 'SELECT * FROM wadus'
layer.options[:query] = 'SELECT * FROM wadus'
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.params[:query].should).to eq('SELECT * FROM wadus')
end
it 'copies the layer table_name prepending "public"' do
@layer.options[:table_name] = 'tt11'
analysis = Carto::Analysis.source_analysis_for_layer(@layer, 0)
analysis.analysis_node.options[:table_name].should eq 'public.tt11'
layer.options[:table_name] = table_name
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.options[:table_name]).to eq("public.#{table_name}")
end
it 'prepends "public" to table_name' do
@layer.options.merge!(table_name: 'tt11', user_name: 'juan')
analysis = Carto::Analysis.source_analysis_for_layer(@layer, 0)
analysis.analysis_node.options[:table_name].should eq 'public.tt11'
layer.options.merge!(table_name: table_name, user_name: 'juan')
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.options[:table_name]).to eq("public.#{table_name}")
end
end
context 'with organization user' do
let(:organization_owner) { create(:carto_user, factory_bot_context: { only_db_setup: true }) }
let(:organization) { create(:organization, :with_owner, owner: organization_owner) }
let(:visualization) { create_full_visualization(organization.owner)[3] }
let(:layer) { visualization.data_layers.first }
let(:visualization_objects) { create_full_visualization(organization.owner) }
let(:layer) { visualization_objects[3].data_layers.first }
let(:table_name) { visualization_objects[1].name }
it 'copies the layer query' do
layer.options[:query] = 'SELECT * FROM wadus'
analysis = Carto::Analysis.source_analysis_for_layer(layer, 0)
analysis.analysis_node.params[:query].should eq 'SELECT * FROM wadus'
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.params[:query]).to eq('SELECT * FROM wadus')
end
it 'always qualifies table_name in organizations' do
layer.options.merge!(table_name: 'tt33', user_name: organization.owner.username)
analysis = Carto::Analysis.source_analysis_for_layer(layer, 0)
analysis.analysis_node.options[:table_name].should eq "#{organization.owner.username}.tt33"
layer.options.merge!(table_name: table_name, user_name: organization_owner.username)
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.options[:table_name]).to eq("#{organization_owner.username}.#{table_name}")
end
it 'uses default SQL query if missing' do
layer.options.merge!(table_name: 'tt33', user_name: organization.owner.username, query: '')
analysis = Carto::Analysis.source_analysis_for_layer(layer, 0)
analysis.analysis_node.params[:query].should eq "SELECT * FROM #{organization.owner.username}.tt33"
layer.options.merge!(table_name: table_name, user_name: organization_owner.username, query: '')
analysis = described_class.source_analysis_for_layer(layer, 0)
expect(analysis.analysis_node.params[:query]).to(
eq("SELECT * FROM #{organization_owner.username}.#{table_name}")
)
end
end
end

Loading…
Cancel
Save