*/
public class RuleIndexDefinition implements IndexDefinition {
- private static final String INDEX = "rules";
+ static final String INDEX = "rules";
public static final IndexType INDEX_TYPE_RULE = new IndexType(INDEX, "rule");
public static final String FIELD_RULE_KEY = "key";
package org.sonar.server.rule.index;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import org.elasticsearch.action.index.IndexRequest;
import org.sonar.api.rule.RuleKey;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.BulkIndexer.Size;
import org.sonar.server.es.EsClient;
+import org.sonar.server.es.IndexType;
+import org.sonar.server.es.StartupIndexer;
+import org.sonar.server.organization.DefaultOrganizationProvider;
import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE;
-public class RuleIndexer {
+public class RuleIndexer implements StartupIndexer {
private final EsClient esClient;
+ private final DbClient dbClient;
private final RuleIteratorFactory ruleIteratorFactory;
+ private final DefaultOrganizationProvider defaultOrganizationProvider;
- public RuleIndexer(EsClient esClient, RuleIteratorFactory ruleIteratorFactory) {
+ public RuleIndexer(EsClient esClient, DbClient dbClient, RuleIteratorFactory ruleIteratorFactory, DefaultOrganizationProvider defaultOrganizationProvider) {
this.esClient = esClient;
+ this.dbClient = dbClient;
this.ruleIteratorFactory = ruleIteratorFactory;
+ this.defaultOrganizationProvider = defaultOrganizationProvider;
+ }
+
+ @Override
+ public Set<IndexType> getIndexTypes() {
+ return ImmutableSet.of(INDEX_TYPE_RULE);
+ }
+
+ @Override
+ public void indexOnStartup(Set<IndexType> uninitializedIndexTypes) {
+ BulkIndexer bulk = new BulkIndexer(esClient, RuleIndexDefinition.INDEX).setSize(Size.LARGE);
+
+ // index all definitions and system extensions
+ if (uninitializedIndexTypes.contains(INDEX_TYPE_RULE)) {
+ try(DbSession dbSession = dbClient.openSession(false)) {
+
+ String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid();
+ OrganizationDto defaultOrganization = dbClient.organizationDao().selectByUuid(dbSession, defaultOrganizationUuid)
+ .orElseThrow(() -> new IllegalStateException(String.format("Cannot load default organization for uuid '%s'", defaultOrganizationUuid)));
+
+ try (RuleIterator rules = new RuleIteratorForSingleChunk(dbClient, defaultOrganization, null)) {
+ doIndex(bulk, rules);
+ }
+ }
+ }
}
public void index(OrganizationDto organization, RuleKey ruleKey) {
private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null));
private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client());
- private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null);
+ private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null, null, null);
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer);
private IssueIndex underTest = new IssueIndex(tester.client(), system2, userSessionRule, new AuthorizationTypeSupport(userSessionRule));
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(es.client(), new RuleIteratorFactory(db.getDbClient()));
+ private RuleIndexer ruleIndexer = new RuleIndexer(es.client(), null, new RuleIteratorFactory(db.getDbClient()), null);
private IssueIndex issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSession, new AuthorizationTypeSupport(userSession));
private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex));
TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
ruleIndexer = new RuleIndexer(
esClient,
- new RuleIteratorFactory(dbClient)
+ null,
+ new RuleIteratorFactory(dbClient),
+ null
);
activeRuleIndexer = new ActiveRuleIndexer(
System2.INSTANCE,
private DbSession dbSession = dbTester.getSession();
private RuleIndex ruleIndex = new RuleIndex(esTester.client());
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
- private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient));
+ private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null);
private ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(system2, dbClient, esTester.client());
private ProfileImporter[] profileImporters = createImporters();
private QProfileExporters qProfileExporters = new QProfileExporters(dbClient, null,
dbClient = dbTester.getDbClient();
dbSession = dbTester.getSession();
esClient = esTester.client();
- ruleIndexer = new RuleIndexer(esClient, new RuleIteratorFactory(dbClient));
+ ruleIndexer = new RuleIndexer(esClient, null, new RuleIteratorFactory(dbClient), null);
activeRuleIndexer = new ActiveRuleIndexer(System2.INSTANCE, dbClient, esClient);
TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
underTest = new InheritanceAction(
@Before
public void before() {
when(system.now()).thenReturn(DATE1.getTime());
- ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient));
+ ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null);
ruleIndex = new RuleIndex(esTester.client());
activeRuleIndexer = new ActiveRuleIndexer(system, dbClient, esTester.client());
}
@Before
public void setUp() {
- ruleIndexer = new RuleIndexer(tester.client(), null);
+ ruleIndexer = new RuleIndexer(tester.client(), null, null, null);
activeRuleIndexer = new ActiveRuleIndexer(system2, null, tester.client());
index = new RuleIndex(tester.client());
}
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;
assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1);
}
+ @Test
+ public void index_on_startup() {
+ RuleIndexer indexer = createIndexer();
+
+ // Create and Index rule
+ dbClient.ruleDao().insert(dbSession, rule.setStatus(RuleStatus.READY));
+ dbSession.commit();
+
+ indexer.indexOnStartup(indexer.getIndexTypes());
+ assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1);
+ }
+
private RuleIndexer createIndexer() {
- return new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbTester.getDbClient()));
+ return new RuleIndexer(esTester.client(), dbClient, new RuleIteratorFactory(dbTester.getDbClient()), TestDefaultOrganizationProvider.from(dbTester));
}
}