diff --git a/VERSION b/VERSION index cecc2b8aa..9c42c051a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.7.33 +3.7.34 diff --git a/lib/gooddata/lcm/actions/synchronize_user_filters.rb b/lib/gooddata/lcm/actions/synchronize_user_filters.rb index 608e89586..975a85680 100644 --- a/lib/gooddata/lcm/actions/synchronize_user_filters.rb +++ b/lib/gooddata/lcm/actions/synchronize_user_filters.rb @@ -186,7 +186,7 @@ def call(params) GoodData.gd_logger.info("Synchronizing in mode=#{mode}, client_id=#{client_id}, data_rows=#{new_filters.size}") partial_results = sync_user_filters(current_project, new_filters, run_params.merge(users_brick_input: users), symbolized_config) - results.concat(partial_results[:results]) unless partial_results.nil? && partial_results[:results].empty? + results.concat(partial_results[:results]) unless partial_results.nil? || partial_results[:results].empty? end unless run_params[:do_not_touch_filters_that_are_not_mentioned] @@ -201,7 +201,7 @@ def call(params) GoodData.gd_logger.info("Delete all filters in project_id=#{current_project.pid}, client_id=#{c.client_id}") current_results = sync_user_filters(current_project, [], run_params.merge(users_brick_input: users), symbolized_config) - results.concat(current_results[:results]) unless current_results[:results].empty? + results.concat(current_results[:results]) unless current_results.nil? || current_results[:results].empty? rescue StandardError => e params.gdc_logger.error "Failed to clear filters of #{c.client_id} due to: #{e.inspect}" end diff --git a/lib/gooddata/mixins/md_object_query.rb b/lib/gooddata/mixins/md_object_query.rb index 443d3610d..e072bcb78 100644 --- a/lib/gooddata/mixins/md_object_query.rb +++ b/lib/gooddata/mixins/md_object_query.rb @@ -47,16 +47,17 @@ def query(query_obj_type, klass, options = { :client => GoodData.connection, :pr offset = 0 page_limit = 50 - Enumerator.new do |y| - loop do - result = client.get(project.md['objects'] + '/query', params: { category: query_obj_type, limit: page_limit, offset: offset }) - result['objects']['items'].each do |item| - y << (klass ? client.create(klass, item, project: project) : item) - end - break if result['objects']['paging']['count'] < page_limit - offset += page_limit + all_objects = [] + loop do + result = client.get(project.md['objects'] + '/query', params: { category: query_obj_type, limit: page_limit, offset: offset }) + result['objects']['items'].each do |item| + all_objects << (klass ? client.create(klass, item, project: project) : item) end + break if result['objects']['paging']['count'] < page_limit + + offset += page_limit end + all_objects end def dependency(uri, key = nil, opts = { :client => GoodData.connection }) diff --git a/lib/gooddata/models/metadata/label.rb b/lib/gooddata/models/metadata/label.rb index ddf9c3e2d..2dd9f8e33 100644 --- a/lib/gooddata/models/metadata/label.rb +++ b/lib/gooddata/models/metadata/label.rb @@ -40,22 +40,20 @@ def find_element_value(element_id) end end - # Gets valid elements using /validElements? API + # Gets valid elements of a label for a specific paging (:offset and :limit) or get validElements of a specific value (:filter). + # In the case filter a specific value, because the API /validElements only filter by partial match, we need to filter again at client side for exact match. # @return [Array] Results def get_valid_elements(*args) - results, params = valid_elements(*args) - # TMA-775 - the validElements API can possibly return more matches than requested (usually 1) - # so we do a preliminary first request to check and then increase the limit if needed - if results['validElements']['paging']['total'].to_i != params[:limit] + if args && !args.empty? && args.first[:filter] + params = args.first params[:limit] = 100_000 results, = valid_elements params - if params[:filter] - results['validElements']['items'] = results['validElements']['items'].reject do |i| - i['element']['title'] != params[:filter] - end + results['validElements']['items'] = results['validElements']['items'].select do |i| + i['element']['title'] == params[:filter] end + else + results, = valid_elements(*args) end - results end @@ -74,24 +72,25 @@ def value?(value) # @option options [Number] :limit limits the number of values to certain number. Default is 100 # @return [Array] def values(options = {}) - Enumerator.new do |y| - offset = options[:offset] || 0 - page_limit = options[:limit] || 100 - loop do - results = get_valid_elements(limit: page_limit, offset: offset) - - elements = results['validElements'] - elements['items'].map do |el| - v = el['element'] - y << { - :value => v['title'], - :uri => v['uri'] - } - end - break if elements['items'].count < page_limit - offset += page_limit + all_values = [] + offset = options[:offset] || 0 + page_limit = options[:limit] || 100 + loop do + results = get_valid_elements(limit: page_limit, offset: offset) + + elements = results['validElements'] + elements['items'].map do |el| + v = el['element'] + all_values << { + :value => v['title'], + :uri => v['uri'] + } end + break if elements['items'].count < page_limit + + offset += page_limit end + all_values end def values_count diff --git a/lib/gooddata/models/user_filters/user_filter_builder.rb b/lib/gooddata/models/user_filters/user_filter_builder.rb index bc4f27a54..9dbb7e9bd 100644 --- a/lib/gooddata/models/user_filters/user_filter_builder.rb +++ b/lib/gooddata/models/user_filters/user_filter_builder.rb @@ -203,7 +203,7 @@ def self.create_attrs_cache(filters, options = {}) # so it precaches the values and still be able to function for larger ones even # though that would mean tons of requests def self.get_small_labels(labels_cache) - labels_cache.values.select { |label| label && label.values_count && label.values_count < 100_000 } + labels_cache.values.select { |label| label &.values_count &. < 100_000 } end # Creates a MAQL expression(s) based on the filter defintion.