From b831049ad19793126531868cbd695665e0584482 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 22 Mar 2017 14:58:38 +0100 Subject: [PATCH] SONAR-8867 RuleResultSetIterator supports table RULES_METADATA --- .../sonar/server/rule/index/RuleIndexer.java | 9 +- .../rule/index/RuleResultSetIterator.java | 12 +-- .../server/issue/index/IssueIndexTest.java | 3 +- .../sonar/server/issue/ws/TagsActionTest.java | 3 +- .../ws/ChangeParentActionTest.java | 20 ++--- .../qualityprofile/ws/CreateActionTest.java | 2 +- .../ws/InheritanceActionTest.java | 2 +- .../sonar/server/rule/RegisterRulesTest.java | 4 +- .../server/rule/index/RuleIndexTest.java | 3 +- .../server/rule/index/RuleIndexerTest.java | 3 +- .../rule/index/RuleResultSetIteratorTest.java | 89 ++++++++++--------- 11 files changed, 83 insertions(+), 67 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java index 5a2fd5f6024..de4e248f151 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java @@ -28,6 +28,7 @@ import org.sonar.server.es.BaseIndexer; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.BulkIndexer.Size; import org.sonar.server.es.EsClient; +import org.sonar.server.organization.DefaultOrganizationProvider; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_UPDATED_AT; import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE; @@ -35,10 +36,13 @@ import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE; public class RuleIndexer extends BaseIndexer { private final DbClient dbClient; + private final DefaultOrganizationProvider defaultOrganizationProvider; - public RuleIndexer(System2 system2, DbClient dbClient, EsClient esClient) { + public RuleIndexer(System2 system2, DbClient dbClient, EsClient esClient, + DefaultOrganizationProvider defaultOrganizationProvider) { super(system2, esClient, 300, INDEX_TYPE_RULE, FIELD_RULE_UPDATED_AT); this.dbClient = dbClient; + this.defaultOrganizationProvider = defaultOrganizationProvider; } @Override @@ -53,7 +57,8 @@ public class RuleIndexer extends BaseIndexer { private long doIndex(BulkIndexer bulk, long lastUpdatedAt) { long maxDate; try (DbSession dbSession = dbClient.openSession(false)) { - RuleResultSetIterator rowIt = RuleResultSetIterator.create(dbClient, dbSession, lastUpdatedAt); + String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid(); + RuleResultSetIterator rowIt = RuleResultSetIterator.create(dbClient, dbSession, defaultOrganizationUuid, lastUpdatedAt); maxDate = doIndex(bulk, rowIt); rowIt.close(); return maxDate; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleResultSetIterator.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleResultSetIterator.java index 652ed5bdbda..41c4db56c0a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleResultSetIterator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleResultSetIterator.java @@ -53,7 +53,7 @@ public class RuleResultSetIterator extends ResultSetIterator { "r.priority", "r.status", "r.is_template", - "r.tags", + "rm.tags", "r.system_tags", // column 11 @@ -67,7 +67,8 @@ public class RuleResultSetIterator extends ResultSetIterator { }; private static final String SQL_ALL = "SELECT " + StringUtils.join(FIELDS, ",") + " FROM rules r " + - "LEFT OUTER JOIN rules t ON t.id=r.template_id"; + "LEFT OUTER JOIN rules t ON t.id=r.template_id " + + "LEFT OUTER JOIN rules_metadata rm ON rm.rule_id = r.id and rm.organization_uuid=?"; private static final String SQL_AFTER_DATE = SQL_ALL + " WHERE r.updated_at>?"; @@ -77,12 +78,13 @@ public class RuleResultSetIterator extends ResultSetIterator { super(stmt); } - static RuleResultSetIterator create(DbClient dbClient, DbSession session, long afterDate) { + static RuleResultSetIterator create(DbClient dbClient, DbSession session, String organizationUuid, long afterDate) { try { String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL; PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql); + stmt.setString(1, organizationUuid); if (afterDate > 0L) { - stmt.setLong(1, afterDate); + stmt.setLong(2, afterDate); } return new RuleResultSetIterator(stmt); } catch (SQLException e) { @@ -92,7 +94,7 @@ public class RuleResultSetIterator extends ResultSetIterator { @Override protected RuleDoc read(ResultSet rs) throws SQLException { - RuleDoc doc = new RuleDoc(Maps.newHashMapWithExpectedSize(16)); + RuleDoc doc = new RuleDoc(Maps.newHashMapWithExpectedSize(16)); String ruleKey = rs.getString(1); String repositoryKey = rs.getString(2); diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java index ff0fea5fce3..1aeb9444b22 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java @@ -49,6 +49,7 @@ import org.sonar.server.es.EsTester; import org.sonar.server.es.SearchOptions; import org.sonar.server.es.SearchResult; import org.sonar.server.issue.IssueQuery; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.permission.index.AuthorizationTypeSupport; import org.sonar.server.permission.index.PermissionIndexerDao; import org.sonar.server.permission.index.PermissionIndexerTester; @@ -96,7 +97,7 @@ public class IssueIndexTest { private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null)); private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client()); - private RuleIndexer ruleIndexer = new RuleIndexer(system2, null, tester.client()); + private RuleIndexer ruleIndexer = new RuleIndexer(system2, null, tester.client(), TestDefaultOrganizationProvider.fromUuid("org-1")); private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer); private IssueIndex underTest = new IssueIndex(tester.client(), system2, userSessionRule, new AuthorizationTypeSupport(userSessionRule)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java index f98fd4e122a..b811f9f9861 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java @@ -36,6 +36,7 @@ import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.issue.index.IssueIndexer; import org.sonar.server.issue.index.IssueIteratorFactory; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.permission.index.AuthorizationTypeSupport; import org.sonar.server.rule.index.RuleIndexDefinition; import org.sonar.server.rule.index.RuleIndexer; @@ -60,7 +61,7 @@ public class TagsActionTest { public EsTester es = new EsTester(new IssueIndexDefinition(new MapSettings()), new RuleIndexDefinition(new MapSettings())); private IssueIndexer issueIndexer = new IssueIndexer(es.client(), new IssueIteratorFactory(db.getDbClient())); - private RuleIndexer ruleIndexer = new RuleIndexer(System2.INSTANCE, db.getDbClient(), es.client()); + private RuleIndexer ruleIndexer = new RuleIndexer(System2.INSTANCE, db.getDbClient(), es.client(), TestDefaultOrganizationProvider.from(db)); private IssueIndex issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSession, new AuthorizationTypeSupport(userSession)); private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java index 93b33d0a5c4..0730036a52b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java @@ -100,16 +100,16 @@ public class ChangeParentActionTest { dbSession = dbTester.getSession(); EsClient esClient = esTester.client(); ruleIndex = new RuleIndex(esClient); + TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); ruleIndexer = new RuleIndexer( System2.INSTANCE, dbClient, - esClient - ); + esClient, + defaultOrganizationProvider); activeRuleIndexer = new ActiveRuleIndexer( System2.INSTANCE, dbClient, - esClient - ); + esClient); RuleActivatorContextFactory ruleActivatorContextFactory = new RuleActivatorContextFactory(dbClient); TypeValidations typeValidations = new TypeValidations(Collections.emptyList()); ruleActivator = new RuleActivator( @@ -119,8 +119,7 @@ public class ChangeParentActionTest { ruleActivatorContextFactory, typeValidations, activeRuleIndexer, - userSessionRule - ); + userSessionRule); underTest = new ChangeParentAction( dbClient, new RuleActivator( @@ -130,16 +129,13 @@ public class ChangeParentActionTest { ruleActivatorContextFactory, typeValidations, activeRuleIndexer, - userSessionRule - ), + userSessionRule), new Languages(), new QProfileWsSupport( dbClient, userSessionRule, - TestDefaultOrganizationProvider.from(dbTester) - ), - userSessionRule - ); + TestDefaultOrganizationProvider.from(dbTester)), + userSessionRule); wsActionTester = new WsActionTester(underTest); organization = dbTester.organizations().insert(); userSessionRule.logIn().addPermission(ADMINISTER_QUALITY_PROFILES, organization.getUuid()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java index e04473f4ffb..3bca1af5738 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java @@ -93,7 +93,7 @@ public class CreateActionTest { private DbSession dbSession = dbTester.getSession(); private RuleIndex ruleIndex = new RuleIndex(esTester.client()); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); - private RuleIndexer ruleIndexer = new RuleIndexer(system2, dbClient, esTester.client()); + private RuleIndexer ruleIndexer = new RuleIndexer(system2, dbClient, esTester.client(), defaultOrganizationProvider); private ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(system2, dbClient, esTester.client()); private ProfileImporter[] profileImporters = createImporters(); private QProfileExporters qProfileExporters = new QProfileExporters(dbClient, null, diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java index 03aac6627a9..09917e0d9a9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java @@ -88,7 +88,7 @@ public class InheritanceActionTest { dbClient = dbTester.getDbClient(); dbSession = dbTester.getSession(); esClient = esTester.client(); - ruleIndexer = new RuleIndexer(System2.INSTANCE, dbClient, esClient); + ruleIndexer = new RuleIndexer(System2.INSTANCE, dbClient, esClient, TestDefaultOrganizationProvider.fromUuid("org-1")); activeRuleIndexer = new ActiveRuleIndexer(System2.INSTANCE, dbClient, esClient); TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); underTest = new InheritanceAction( diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index 5d60712d0e0..fe68c12718a 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -42,6 +42,7 @@ import org.sonar.db.rule.RuleParamDto; import org.sonar.db.rule.RuleRepositoryDto; import org.sonar.server.es.EsTester; import org.sonar.server.es.SearchOptions; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.qualityprofile.RuleActivator; import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; import org.sonar.server.rule.index.RuleIndex; @@ -71,7 +72,6 @@ public class RegisterRulesTest { @org.junit.Rule public DbTester dbTester = DbTester.create(system); - @org.junit.Rule public EsTester esTester = new EsTester(new RuleIndexDefinition(new MapSettings())); @@ -84,7 +84,7 @@ public class RegisterRulesTest { @Before public void before() { when(system.now()).thenReturn(DATE1.getTime()); - ruleIndexer = new RuleIndexer(system, dbClient, esTester.client()); + ruleIndexer = new RuleIndexer(system, dbClient, esTester.client(), TestDefaultOrganizationProvider.from(dbTester)); ruleIndex = new RuleIndex(esTester.client()); activeRuleIndexer = new ActiveRuleIndexer(system, dbClient, esTester.client()); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java index 979dce99ef6..d03cdc1bdc7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java @@ -37,6 +37,7 @@ import org.sonar.db.rule.RuleTesting; import org.sonar.server.es.EsTester; import org.sonar.server.es.SearchIdResult; import org.sonar.server.es.SearchOptions; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.qualityprofile.index.ActiveRuleDoc; import org.sonar.server.qualityprofile.index.ActiveRuleDocTesting; import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; @@ -85,7 +86,7 @@ public class RuleIndexTest { @Before public void setUp() { - ruleIndexer = new RuleIndexer(system2, null, tester.client()); + ruleIndexer = new RuleIndexer(system2, null, tester.client(), TestDefaultOrganizationProvider.fromUuid("org-1")); activeRuleIndexer = new ActiveRuleIndexer(system2, null, tester.client()); index = new RuleIndex(tester.client()); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java index b45a9c38399..54cfb497ae8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java @@ -33,6 +33,7 @@ import org.sonar.db.DbTester; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import org.sonar.server.es.EsTester; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import static com.google.common.collect.Sets.newHashSet; import static org.assertj.core.api.Assertions.assertThat; @@ -102,7 +103,7 @@ public class RuleIndexerTest { } private RuleIndexer createIndexer() { - return new RuleIndexer(system2, dbTester.getDbClient(), esTester.client()); + return new RuleIndexer(system2, dbTester.getDbClient(), esTester.client(), TestDefaultOrganizationProvider.from(dbTester)); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java index 9d2ec41fc89..7686a583736 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java @@ -21,6 +21,7 @@ package org.sonar.server.rule.index; import com.google.common.collect.Maps; import java.util.Map; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.sonar.api.rule.RuleKey; @@ -42,48 +43,53 @@ public class RuleResultSetIteratorTest { @Rule public DbTester dbTester = DbTester.create(System2.INSTANCE); - DbClient dbClient = dbTester.getDbClient(); - - DbSession dbSession = dbTester.getSession(); - - RuleDto templateRule = new RuleDto() - .setRuleKey("S001") - .setRepositoryKey("xoo") - .setConfigKey("S1") - .setName("Null Pointer") - .setDescription("S001 desc") - .setDescriptionFormat(RuleDto.Format.HTML) - .setLanguage("xoo") - .setSeverity(Severity.BLOCKER) - .setStatus(RuleStatus.READY) - .setIsTemplate(true) - .setSystemTags(newHashSet("cwe")) - .setType(RuleType.BUG) - .setCreatedAt(1500000000000L) - .setUpdatedAt(1600000000000L) - .setOrganizationUuid("foo-org") - .setTags(newHashSet("performance")); - - RuleDefinitionDto customRule = new RuleDefinitionDto() - .setRuleKey("S002") - .setRepositoryKey("xoo") - .setConfigKey("S2") - .setName("Slow") - .setDescription("*S002 desc*") - .setDescriptionFormat(RuleDto.Format.MARKDOWN) - .setLanguage("xoo") - .setSeverity(Severity.MAJOR) - .setStatus(RuleStatus.BETA) - .setIsTemplate(false) - .setType(RuleType.CODE_SMELL) - .setCreatedAt(2000000000000L) - .setUpdatedAt(2100000000000L); + private DbClient dbClient = dbTester.getDbClient(); + private DbSession dbSession = dbTester.getSession(); + private RuleDto templateRule; + private RuleDefinitionDto customRule; + + @Before + public void setUp() throws Exception { + templateRule = new RuleDto() + .setRuleKey("S001") + .setRepositoryKey("xoo") + .setConfigKey("S1") + .setName("Null Pointer") + .setDescription("S001 desc") + .setDescriptionFormat(RuleDto.Format.HTML) + .setLanguage("xoo") + .setSeverity(Severity.BLOCKER) + .setStatus(RuleStatus.READY) + .setIsTemplate(true) + .setSystemTags(newHashSet("cwe")) + .setType(RuleType.BUG) + .setCreatedAt(1500000000000L) + .setUpdatedAt(1600000000000L) + .setOrganizationUuid(dbTester.getDefaultOrganization().getUuid()) + .setTags(newHashSet("performance")); + + customRule = new RuleDefinitionDto() + .setRuleKey("S002") + .setRepositoryKey("xoo") + .setConfigKey("S2") + .setName("Slow") + .setDescription("*S002 desc*") + .setDescriptionFormat(RuleDto.Format.MARKDOWN) + .setLanguage("xoo") + .setSeverity(Severity.MAJOR) + .setStatus(RuleStatus.BETA) + .setIsTemplate(false) + .setType(RuleType.CODE_SMELL) + .setCreatedAt(2000000000000L) + .setUpdatedAt(2100000000000L); + } @Test public void iterator_over_one_rule() { dbTester.rules().insertRule(templateRule); - RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L); + String organizationUuid = dbTester.getDefaultOrganization().getUuid(); + RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), organizationUuid, 0L); Map rulesByKey = rulesByKey(it); it.close(); @@ -112,7 +118,8 @@ public class RuleResultSetIteratorTest { dbClient.ruleDao().insert(dbSession, customRule); dbSession.commit(); - RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L); + String organizationUuid = dbTester.getDefaultOrganization().getUuid(); + RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), organizationUuid, 0L); Map rulesByKey = rulesByKey(it); it.close(); @@ -155,7 +162,8 @@ public class RuleResultSetIteratorTest { dbClient.ruleDao().insert(dbSession, customRule.setTemplateId(templateRule.getId())); dbSession.commit(); - RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L); + String organizationUuid = dbTester.getDefaultOrganization().getUuid(); + RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), organizationUuid, 0L); Map rulesByKey = rulesByKey(it); it.close(); @@ -175,7 +183,8 @@ public class RuleResultSetIteratorTest { dbTester.rules().insertRule(templateRule.setStatus(RuleStatus.REMOVED)); dbSession.commit(); - RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L); + String organizationUuid = dbTester.getDefaultOrganization().getUuid(); + RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), organizationUuid, 0L); Map rulesByKey = rulesByKey(it); it.close(); -- 2.39.5