From 848d7f525e6904dc014c86e9b71c3feaedfb92a3 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Wed, 18 Sep 2013 16:11:48 +0200 Subject: [PATCH] SONAR-4195 In the Measures filter form, make sure the "Key contains" criteria works the same way as the "Name contains" criteria --- .../resources/org/sonar/l10n/core.properties | 3 +- .../org/sonar/core/measure/MeasureFilter.java | 10 ++--- .../core/measure/MeasureFilterFactory.java | 2 +- .../sonar/core/measure/MeasureFilterSql.java | 13 +++---- .../core/persistence/DatabaseVersion.java | 2 +- .../org/sonar/core/persistence/rows-h2.sql | 1 + .../measure/MeasureFilterExecutorTest.java | 15 ++------ .../startup/RegisterNewMeasureFilters.java | 2 +- .../WEB-INF/app/helpers/measures_helper.rb | 2 +- .../app/views/measures/_sidebar.html.erb | 7 ++-- ...p_by_key_search_in_measure_filters_data.rb | 38 +++++++++++++++++++ 11 files changed, 60 insertions(+), 35 deletions(-) create mode 100644 sonar-server/src/main/webapp/WEB-INF/db/migrate/440_replace_key_regexp_by_key_search_in_measure_filters_data.rb diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties index 80059e7f618..ebb4dd0bf3d 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -406,7 +406,6 @@ measure_filter.criteria.age=Age measure_filter.criteria.date=Date measure_filter.criteria.only_favourites=Favourites only measure_filter.criteria.key=Key -measure.filter.criteria.key_note=Use * to match zero or more characters and ? to match any single character measure_filter.criteria.name=Name measure_filter.criteria.language=Language measure_filter.criteria.metric=Metric @@ -453,7 +452,7 @@ measure_filter.sharing=Sharing measure_filter.delete_confirm_title=Delete Filter measure_filter.are_you_sure_want_delete_filter_x=Are you sure that you want to delete the filter "{0}"? measure_filter.title_shared_filters=Shared Filters -measure_filter.key_like=Key contains +measure_filter.key_contains=Key contains measure_filter.name_contains=Name contains measure_filter.manage_filters=Manage Filters measure_filter.display.list=List diff --git a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilter.java b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilter.java index 67108a4eb31..0e84c50e090 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilter.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilter.java @@ -45,7 +45,7 @@ public class MeasureFilter { private List resourceScopes = Collections.emptyList(); private List resourceQualifiers = Collections.emptyList(); private List resourceLanguages = Collections.emptyList(); - private String resourceKeyRegexp = null; + private String resourceKey = null; private String resourceName = null; private Date fromDate = null, toDate = null; private boolean userFavourites = false; @@ -122,12 +122,12 @@ public class MeasureFilter { return this; } - public String getResourceKeyRegexp() { - return resourceKeyRegexp; + public String getResourceKey() { + return resourceKey; } - public MeasureFilter setResourceKeyRegexp(String s) { - this.resourceKeyRegexp = s; + public MeasureFilter setResourceKey(String s) { + this.resourceKey = s; return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterFactory.java b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterFactory.java index f8737af80e0..b1a10230726 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterFactory.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterFactory.java @@ -62,7 +62,7 @@ public class MeasureFilterFactory implements ServerComponent { filter.setOnBaseResourceChildren(Boolean.valueOf((String) properties.get(onBaseComponents))); } filter.setResourceName((String) properties.get("nameSearch")); - filter.setResourceKeyRegexp((String) properties.get("keyRegexp")); + filter.setResourceKey((String) properties.get("keySearch")); String onFavourites = "onFavourites"; if (properties.containsKey(onFavourites)) { filter.setUserFavourites(Boolean.valueOf((String) properties.get(onFavourites))); diff --git a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java index 25204064111..d48a7d66ac9 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java @@ -162,19 +162,16 @@ class MeasureFilterSql { } private void appendResourceKeyCondition(StringBuilder sb) { - if (StringUtils.isNotBlank(filter.getResourceKeyRegexp())) { - sb.append(" AND UPPER(p.kee) LIKE '"); - // limitation : special characters _ and % are not escaped - String regexp = StringEscapeUtils.escapeSql(filter.getResourceKeyRegexp()); - regexp = StringUtils.replaceChars(regexp, '*', '%'); - regexp = StringUtils.replaceChars(regexp, '?', '_'); - sb.append(StringUtils.upperCase(regexp)).append("'"); + if (StringUtils.isNotBlank(filter.getResourceKey())) { + sb.append(" AND p.kee LIKE '%"); + sb.append(StringEscapeUtils.escapeSql(StringUtils.lowerCase(filter.getResourceKey()))); + sb.append("%'"); } } private void appendResourceNameCondition(StringBuilder sb) { if (StringUtils.isNotBlank(filter.getResourceName())) { - sb.append(" AND s.project_id IN (SELECT rindex.resource_id FROM resource_index rindex WHERE rindex.kee like '"); + sb.append(" AND s.project_id IN (SELECT rindex.resource_id FROM resource_index rindex WHERE rindex.kee LIKE '"); sb.append(StringEscapeUtils.escapeSql(StringUtils.lowerCase(filter.getResourceName()))); sb.append("%'"); if (!filter.getResourceQualifiers().isEmpty()) { diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java index 3e4b2bb227b..4e02ccede27 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java @@ -33,7 +33,7 @@ import java.util.List; */ public class DatabaseVersion implements BatchComponent, ServerComponent { - public static final int LAST_VERSION = 433; + public static final int LAST_VERSION = 440; public static enum Status { UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index f4d2b9031be..512a3f6ed21 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -176,6 +176,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('430'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('431'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('432'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('433'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('440'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '2011-09-26 22:27:48.0', '2011-09-26 22:27:48.0', null, null); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; diff --git a/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java b/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java index 71e39f7e897..e39b957dd77 100644 --- a/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java +++ b/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java @@ -133,7 +133,7 @@ public class MeasureFilterExecutorTest { .setResourceQualifiers(Arrays.asList("'")) .setResourceLanguages(Arrays.asList("'")) .setBaseResourceKey("'") - .setResourceKeyRegexp("'") + .setResourceKey("'") .setResourceName("'") .setResourceName("'") .setResourceScopes(Arrays.asList("'")); @@ -472,24 +472,15 @@ public class MeasureFilterExecutorTest { } @Test - public void filter_by_resource_key_star_regexp() throws SQLException { + public void filter_by_resource_key() throws SQLException { db.prepareDbUnit(getClass(), "shared.xml"); - MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK")).setResourceKeyRegexp("java*"); + MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK")).setResourceKey("Va_proje"); List rows = executor.execute(filter, new MeasureFilterContext()); assertThat(rows).hasSize(1); verifyJavaProject(rows.get(0)); } - @Test - public void filter_by_resource_key_exclamation_mark() throws SQLException { - db.prepareDbUnit(getClass(), "shared.xml"); - MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK")).setResourceKeyRegexp("JaV?_proje*"); - List rows = executor.execute(filter, new MeasureFilterContext()); - assertThat(rows).hasSize(1); - verifyJavaProject(rows.get(0)); - } - @Test public void filter_by_base_resource() throws SQLException { db.prepareDbUnit(getClass(), "shared.xml"); diff --git a/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java b/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java index 9f11c98fdc2..27e59daac27 100644 --- a/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java +++ b/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java @@ -118,7 +118,7 @@ public final class RegisterNewMeasureFilters { } else if ("name".equals(criterion.getFamily())) { fields.add("nameSearch=" + criterion.getTextValue()); } else if ("key".equals(criterion.getFamily())) { - fields.add("keyRegexp=" + criterion.getTextValue()); + fields.add("keySearch=" + criterion.getTextValue()); } else if ("language".equals(criterion.getFamily())) { fields.add("languages=" + criterion.getTextValue()); } else if ("date".equals(criterion.getFamily())) { diff --git a/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb b/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb index 1e163184622..3ff2578508c 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb @@ -109,7 +109,7 @@ module MeasuresHelper more_criteria_options << [message('measure_filter.criteria.age'), 'age'] unless filter.criteria('ageMinDays') || filter.criteria('ageMaxDays') more_criteria_options << [message('measure_filter.criteria.date'), 'date'] unless filter.criteria('fromDate') || filter.criteria('toDate') more_criteria_options << [message('measure_filter.criteria.only_favourites'), 'fav'] unless filter.criteria('onFavourites') - more_criteria_options << [message('measure_filter.criteria.key'), 'key'] unless filter.criteria('keyRegexp') + more_criteria_options << [message('measure_filter.criteria.key'), 'key'] unless filter.criteria('keySearch') more_criteria_options << [message('measure_filter.criteria.language'), 'lang'] unless filter.criteria('languages') more_criteria_options << [message('measure_filter.criteria.name'), 'name'] unless filter.criteria('nameSearch') more_criteria_options << [message('measure_filter.criteria.components_of_project'), 'project'] unless filter.base_resource diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_sidebar.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_sidebar.html.erb index c45af01a6fb..ce64f69521d 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_sidebar.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_sidebar.html.erb @@ -134,10 +134,9 @@ > -
  • class="marginbottom5"> - <%= message('measure_filter.key_like') -%>:
    - >
    - <%= message 'measure.filter.criteria.key_note' -%> +
  • class="marginbottom5"> + <%= message('measure_filter.key_contains') -%>:
    + >
  • class="marginbottom5"> diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/440_replace_key_regexp_by_key_search_in_measure_filters_data.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/440_replace_key_regexp_by_key_search_in_measure_filters_data.rb new file mode 100644 index 00000000000..0b345b136f6 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/440_replace_key_regexp_by_key_search_in_measure_filters_data.rb @@ -0,0 +1,38 @@ +# +# Sonar, entreprise quality control tool. +# Copyright (C) 2008-2013 SonarSource +# mailto:contact AT sonarsource DOT com +# +# SonarQube is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# SonarQube is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +# +# Sonar 4.0 +# SONAR-4195 +# +class ReplaceKeyRegexpByKeySearchInMeasureFiltersData < ActiveRecord::Migration + + class MeasureFilter < ActiveRecord::Base + end + + def self.up + filters = MeasureFilter.all(:conditions => "data like '%keyRegexp%'") + filters.each do |filter| + filter.data = filter.data.sub('keyRegexp', 'keySearch') + filter.save + end + end +end + -- 2.39.5