Commit 7426318a authored by David Fernandez's avatar David Fernandez Committed by James Lopez

Properly apply the prerelease filtering

In particular, for packages that have release and pre release versions.
parent 0dbb8ea4
......@@ -8,6 +8,7 @@ module Packages
MAX_PER_PAGE = 30
MAX_VERSIONS_PER_PACKAGE = 10
PRE_RELEASE_VERSION_MATCHING_TERM = '%-%'
DEFAULT_OPTIONS = {
include_prerelease_versions: true,
......@@ -38,18 +39,20 @@ module Packages
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24182#technical-notes
# and https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource
subquery_name = :partition_subquery
arel_table = Arel::Table.new(:partition_subquery)
column_names = Packages::Package.column_names.map do |cn|
"#{subquery_name}.#{quote_column_name(cn)}"
end
# rubocop: disable CodeReuse/ActiveRecord
Packages::Package.select(column_names.join(','))
.from(package_names_partition, subquery_name)
.where(
"#{subquery_name}.row_number <= :max_versions_count",
max_versions_count: MAX_VERSIONS_PER_PACKAGE
)
# rubocop: enable CodeReuse/ActiveRecord
pkgs = Packages::Package.select(column_names.join(','))
.from(package_names_partition, subquery_name)
.where(arel_table[:row_number].lteq(MAX_VERSIONS_PER_PACKAGE))
return pkgs if include_prerelease_versions?
# we can't use pkgs.without_version_like since we have a custom from
pkgs.where.not(arel_table[:version].matches(PRE_RELEASE_VERSION_MATCHING_TERM))
end
def package_names_partition
......@@ -74,7 +77,7 @@ module Packages
.without_nuget_temporary_name
.order_name
.select_distinct_name
pkgs = pkgs.without_version_like('%-%') unless include_prerelease_versions?
pkgs = pkgs.without_version_like(PRE_RELEASE_VERSION_MATCHING_TERM) unless include_prerelease_versions?
pkgs = pkgs.search_by_name(@search_term) if @search_term.present?
pkgs.page(0) # we're using a padding
.per(per_page)
......
---
title: 'Nuget search: fix the prerelease filtering'
merge_request: 29482
author:
type: fixed
......@@ -97,6 +97,12 @@ describe Packages::Nuget::SearchService do
let(:include_prerelease_versions) { false }
it { expect_search_results 3, package_a, packages_b, packages_c }
context 'when mixed with release versions' do
let_it_be(:package_e_release) { create(:nuget_package, project: project, name: 'DummyPackageE', version: '3.2.1') }
it { expect_search_results 4, package_a, packages_b, packages_c, package_e_release }
end
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment