@@ -205,11 +205,11 @@ public class EsClient implements Closeable { | |||
/** | |||
* Checks whether there is any document in any mentioned type. | |||
*/ | |||
public boolean isEmpty(IndexTypeId... indexType) { | |||
public boolean isEmpty(IndexTypeId indexType) { | |||
return count(indexType) <= 0; | |||
} | |||
private long count(IndexTypeId... indexType) { | |||
private long count(IndexTypeId indexType) { | |||
return prepareSearch(indexType).setSize(0).get().getHits().getTotalHits(); | |||
} | |||
@@ -85,10 +85,10 @@ public abstract class IssueStorage { | |||
long now = system2.now(); | |||
List<DefaultIssue> toBeUpdated = batchInsertAndReturnIssuesToUpdate(session, issues, now); | |||
update(toBeUpdated, now); | |||
doAfterSave(); | |||
doAfterSave(issues); | |||
} | |||
protected void doAfterSave() { | |||
protected void doAfterSave(Iterable<DefaultIssue> issues) { | |||
// overridden on server-side to index ES | |||
} | |||
@@ -60,8 +60,8 @@ public class ServerIssueStorage extends IssueStorage { | |||
} | |||
@Override | |||
protected void doAfterSave() { | |||
indexer.index(); | |||
protected void doAfterSave(Iterable<DefaultIssue> issues) { | |||
indexer.index(issues); | |||
} | |||
protected ComponentDto component(DbSession session, DefaultIssue issue) { |
@@ -28,10 +28,8 @@ import org.elasticsearch.action.bulk.BulkRequestBuilder; | |||
import org.elasticsearch.action.index.IndexRequest; | |||
import org.elasticsearch.action.search.SearchRequestBuilder; | |||
import org.sonar.api.resources.Qualifiers; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.server.es.BaseIndexer; | |||
import org.sonar.server.es.BulkIndexer; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.EsUtils; | |||
@@ -44,20 +42,20 @@ import org.sonar.server.permission.index.NeedAuthorizationIndexer; | |||
import static org.elasticsearch.index.query.QueryBuilders.boolQuery; | |||
import static org.elasticsearch.index.query.QueryBuilders.termQuery; | |||
import static org.sonar.server.issue.index.IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID; | |||
import static org.sonar.server.issue.index.IssueIndexDefinition.FIELD_ISSUE_TECHNICAL_UPDATED_AT; | |||
import static org.sonar.server.issue.index.IssueIndexDefinition.INDEX_TYPE_ISSUE; | |||
public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer { | |||
public class IssueIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer { | |||
private static final String DELETE_ERROR_MESSAGE = "Fail to delete some issues of project [%s]"; | |||
private static final int MAX_BATCH_SIZE = 1000; | |||
private static final AuthorizationScope AUTHORIZATION_SCOPE = new AuthorizationScope(INDEX_TYPE_ISSUE, project -> Qualifiers.PROJECT.equals(project.getQualifier())); | |||
private final DbClient dbClient; | |||
private final EsClient esClient; | |||
public IssueIndexer(System2 system2, DbClient dbClient, EsClient esClient) { | |||
super(system2, esClient, 300, INDEX_TYPE_ISSUE, FIELD_ISSUE_TECHNICAL_UPDATED_AT); | |||
public IssueIndexer(DbClient dbClient, EsClient esClient) { | |||
this.dbClient = dbClient; | |||
this.esClient = esClient; | |||
} | |||
@Override | |||
@@ -65,11 +63,6 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut | |||
return AUTHORIZATION_SCOPE; | |||
} | |||
@Override | |||
protected long doIndex(long lastUpdatedAt) { | |||
return doIndex(createBulkIndexer(false), lastUpdatedAt, null); | |||
} | |||
@Override | |||
public Set<IndexTypeId> getIndexTypes() { | |||
return ImmutableSet.of(INDEX_TYPE_ISSUE); | |||
@@ -77,11 +70,11 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut | |||
@Override | |||
public void indexOnStartup() { | |||
index(); | |||
doIndex(createBulkIndexer(true), (String) null); | |||
} | |||
public void indexAll() { | |||
doIndex(createBulkIndexer(true), 0L, null); | |||
doIndex(createBulkIndexer(false), (String) null); | |||
} | |||
@Override | |||
@@ -93,7 +86,7 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut | |||
// nothing to do, project key is not used in this index | |||
break; | |||
case NEW_ANALYSIS: | |||
super.index(lastUpdatedAt -> doIndex(createBulkIndexer(false), lastUpdatedAt, projectUuid)); | |||
doIndex(createBulkIndexer(false), projectUuid); | |||
break; | |||
default: | |||
// defensive case | |||
@@ -108,27 +101,21 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut | |||
doIndex(createBulkIndexer(false), issues); | |||
} | |||
private long doIndex(BulkIndexer bulk, long lastUpdatedAt, @Nullable String projectUuid) { | |||
private void doIndex(BulkIndexer bulk, @Nullable String projectUuid) { | |||
try (DbSession dbSession = dbClient.openSession(false)) { | |||
IssueResultSetIterator rowIt = IssueResultSetIterator.create(dbClient, dbSession, lastUpdatedAt, projectUuid); | |||
long maxDate = doIndex(bulk, rowIt); | |||
IssueResultSetIterator rowIt = IssueResultSetIterator.create(dbClient, dbSession, projectUuid); | |||
doIndex(bulk, rowIt); | |||
rowIt.close(); | |||
return maxDate; | |||
} | |||
} | |||
private static long doIndex(BulkIndexer bulk, Iterator<IssueDoc> issues) { | |||
private static void doIndex(BulkIndexer bulk, Iterator<IssueDoc> issues) { | |||
bulk.start(); | |||
long maxDate = 0L; | |||
while (issues.hasNext()) { | |||
IssueDoc issue = issues.next(); | |||
bulk.add(newIndexRequest(issue)); | |||
// it's more efficient to sort programmatically than in SQL on some databases (MySQL for instance) | |||
maxDate = Math.max(maxDate, issue.getTechnicalUpdateDate().getTime()); | |||
} | |||
bulk.stop(); | |||
return maxDate; | |||
} | |||
@Override |
@@ -88,8 +88,6 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> { | |||
"inner join projects p on p.uuid=i.component_uuid " + | |||
"inner join projects root on root.uuid=i.project_uuid"; | |||
private static final String SQL_AFTER_DATE = SQL_ALL + " where i.updated_at>?"; | |||
private static final String PROJECT_FILTER = " AND root.uuid=?"; | |||
private static final Splitter TAGS_SPLITTER = Splitter.on(',').trimResults().omitEmptyStrings(); | |||
@@ -100,18 +98,13 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> { | |||
super(stmt); | |||
} | |||
static IssueResultSetIterator create(DbClient dbClient, DbSession session, long afterDate, @Nullable String projectUuid) { | |||
static IssueResultSetIterator create(DbClient dbClient, DbSession session, @Nullable String projectUuid) { | |||
try { | |||
String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL; | |||
String sql = SQL_ALL; | |||
sql += projectUuid == null ? "" : PROJECT_FILTER; | |||
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql); | |||
int index = 1; | |||
if (afterDate > 0L) { | |||
stmt.setLong(index, afterDate); | |||
index++; | |||
} | |||
if (projectUuid != null) { | |||
stmt.setString(index, projectUuid); | |||
stmt.setString(1, projectUuid); | |||
} | |||
return new IssueResultSetIterator(stmt); | |||
} catch (SQLException e) { |
@@ -26,12 +26,10 @@ import java.util.Set; | |||
import javax.annotation.Nullable; | |||
import org.elasticsearch.action.index.IndexRequest; | |||
import org.sonar.api.resources.Qualifiers; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.measure.ProjectMeasuresIndexerIterator; | |||
import org.sonar.db.measure.ProjectMeasuresIndexerIterator.ProjectMeasures; | |||
import org.sonar.server.es.BaseIndexer; | |||
import org.sonar.server.es.BulkIndexer; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.IndexTypeId; | |||
@@ -40,18 +38,18 @@ import org.sonar.server.es.StartupIndexer; | |||
import org.sonar.server.permission.index.AuthorizationScope; | |||
import org.sonar.server.permission.index.NeedAuthorizationIndexer; | |||
import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIELD_ANALYSED_AT; | |||
import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_TYPE_PROJECT_MEASURES; | |||
public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer { | |||
public class ProjectMeasuresIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer { | |||
private static final AuthorizationScope AUTHORIZATION_SCOPE = new AuthorizationScope(INDEX_TYPE_PROJECT_MEASURES, project -> Qualifiers.PROJECT.equals(project.getQualifier())); | |||
private final DbClient dbClient; | |||
private final EsClient esClient; | |||
public ProjectMeasuresIndexer(System2 system2, DbClient dbClient, EsClient esClient) { | |||
super(system2, esClient, 300, INDEX_TYPE_PROJECT_MEASURES, FIELD_ANALYSED_AT); | |||
public ProjectMeasuresIndexer(DbClient dbClient, EsClient esClient) { | |||
this.dbClient = dbClient; | |||
this.esClient = esClient; | |||
} | |||
@Override | |||
@@ -61,7 +59,7 @@ public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexe | |||
@Override | |||
public void indexOnStartup() { | |||
index(); | |||
doIndex(createBulkIndexer(false), (String) null); | |||
} | |||
@Override | |||
@@ -69,11 +67,6 @@ public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexe | |||
return AUTHORIZATION_SCOPE; | |||
} | |||
@Override | |||
protected long doIndex(long lastUpdatedAt) { | |||
return doIndex(createBulkIndexer(false), lastUpdatedAt, null); | |||
} | |||
@Override | |||
public void indexProject(String projectUuid, Cause cause) { | |||
switch (cause) { |
@@ -27,6 +27,7 @@ import java.util.Collection; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.concurrent.ExecutionException; | |||
import java.util.concurrent.Future; | |||
import java.util.concurrent.LinkedBlockingQueue; | |||
@@ -34,7 +35,6 @@ import java.util.concurrent.ThreadPoolExecutor; | |||
import java.util.concurrent.TimeUnit; | |||
import org.elasticsearch.action.bulk.BulkRequestBuilder; | |||
import org.elasticsearch.action.index.IndexRequest; | |||
import org.elasticsearch.action.search.SearchResponse; | |||
import org.picocontainer.Startable; | |||
import org.sonar.api.utils.DateUtils; | |||
import org.sonar.core.util.stream.Collectors; | |||
@@ -45,9 +45,11 @@ import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.EsUtils; | |||
import org.sonar.server.es.IndexTypeId; | |||
import org.sonar.server.es.ProjectIndexer; | |||
import org.sonar.server.es.StartupIndexer; | |||
import static com.google.common.base.Preconditions.checkArgument; | |||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; | |||
import static org.sonar.core.util.stream.Collectors.toSet; | |||
/** | |||
* Manages the synchronization of indexes with authorization settings defined in database: | |||
@@ -56,7 +58,7 @@ import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; | |||
* <li>delete project orphans from index</li> | |||
* </ul> | |||
*/ | |||
public class PermissionIndexer implements ProjectIndexer, Startable { | |||
public class PermissionIndexer implements ProjectIndexer, Startable, StartupIndexer { | |||
@VisibleForTesting | |||
static final int MAX_BATCH_SIZE = 1000; | |||
@@ -82,32 +84,28 @@ public class PermissionIndexer implements ProjectIndexer, Startable { | |||
this.authorizationScopes = authorizationScopes; | |||
} | |||
public void initializeOnStartup() { | |||
LOG.info("Index authorization"); | |||
indexAllIfEmpty(); | |||
@Override | |||
public Set<IndexTypeId> getIndexTypes() { | |||
return authorizationScopes.stream() | |||
.map(AuthorizationScope::getIndexType) | |||
.collect(toSet(authorizationScopes.size())); | |||
} | |||
public void indexAllIfEmpty() { | |||
boolean isEmpty = false; | |||
for (AuthorizationScope scope : authorizationScopes) { | |||
isEmpty |= isAuthorizationTypeEmpty(scope.getIndexType()); | |||
} | |||
if (isEmpty) { | |||
Future<?> submit = executor.submit(() -> { | |||
authorizationScopes.stream() | |||
.map(AuthorizationScope::getIndexType) | |||
.forEach(this::truncateAuthorizationType); | |||
try (DbSession dbSession = dbClient.openSession(false)) { | |||
index(new PermissionIndexerDao().selectAll(dbClient, dbSession)); | |||
} | |||
}); | |||
try { | |||
Uninterruptibles.getUninterruptibly(submit); | |||
} catch (ExecutionException e) { | |||
Throwables.propagate(e); | |||
@Override | |||
public void indexOnStartup() { | |||
Future<?> submit = executor.submit(() -> { | |||
authorizationScopes.stream() | |||
.map(AuthorizationScope::getIndexType) | |||
.forEach(this::truncateAuthorizationType); | |||
try (DbSession dbSession = dbClient.openSession(false)) { | |||
index(new PermissionIndexerDao().selectAll(dbClient, dbSession)); | |||
} | |||
}); | |||
try { | |||
Uninterruptibles.getUninterruptibly(submit); | |||
} catch (ExecutionException e) { | |||
Throwables.propagate(e); | |||
} | |||
} | |||
@@ -143,11 +141,6 @@ public class PermissionIndexer implements ProjectIndexer, Startable { | |||
.get()); | |||
} | |||
private boolean isAuthorizationTypeEmpty(IndexTypeId indexType) { | |||
SearchResponse response = esClient.prepareSearch(indexType).setSize(0).get(); | |||
return response.getHits().getTotalHits() == 0; | |||
} | |||
private void truncateAuthorizationType(IndexTypeId indexType) { | |||
BulkIndexer.delete(esClient, indexType.getIndex(), esClient.prepareSearch(indexType).setQuery(matchAllQuery())); | |||
} |
@@ -20,7 +20,6 @@ | |||
package org.sonar.server.source.index; | |||
import com.google.common.base.Joiner; | |||
import java.sql.PreparedStatement; | |||
import java.sql.SQLException; | |||
import java.util.ArrayList; | |||
@@ -33,7 +32,6 @@ import org.sonar.db.DbSession; | |||
public class FileSourcesUpdaterHelper { | |||
private static final String SQL_ALL = "SELECT %s FROM file_sources WHERE data_type='%s' "; | |||
private static final String AFTER_DATE_FILTER = " AND updated_at>?"; | |||
private static final String PROJECT_FILTER = " AND project_uuid=?"; | |||
private static final String[] FIELDS = { | |||
@@ -48,31 +46,21 @@ public class FileSourcesUpdaterHelper { | |||
// only static stuff | |||
} | |||
public static PreparedStatement preparedStatementToSelectFileSources(DbClient dbClient, DbSession session, String dataType, long afterDate, @Nullable String projectUuid) | |||
public static PreparedStatement preparedStatementToSelectFileSources(DbClient dbClient, DbSession session, String dataType, @Nullable String projectUuid) | |||
throws SQLException { | |||
String sql = createSQL(dataType, afterDate, projectUuid); | |||
String sql = createSQL(dataType, projectUuid); | |||
// rows are big, so they are scrolled once at a time (one row in memory at a time) | |||
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSingleRowSelectStatement(session, sql); | |||
int index = 1; | |||
if (afterDate > 0L) { | |||
stmt.setLong(index, afterDate); | |||
index++; | |||
} | |||
if (projectUuid != null) { | |||
stmt.setString(index, projectUuid); | |||
stmt.setString(1, projectUuid); | |||
} | |||
return stmt; | |||
} | |||
private static String createSQL(String dataType, long afterDate, @Nullable String projectUuid) { | |||
private static String createSQL(String dataType, @Nullable String projectUuid) { | |||
StringBuilder sql = new StringBuilder(String.format(SQL_ALL, FIELDS_ONE_LINE, dataType)); | |||
if (afterDate > 0L || projectUuid != null) { | |||
if (afterDate > 0L) { | |||
sql.append(AFTER_DATE_FILTER); | |||
} | |||
if (projectUuid != null) { | |||
sql.append(PROJECT_FILTER); | |||
} | |||
if (projectUuid != null) { | |||
sql.append(PROJECT_FILTER); | |||
} | |||
return sql.toString(); | |||
} |
@@ -25,10 +25,8 @@ import java.util.Set; | |||
import javax.annotation.Nullable; | |||
import org.elasticsearch.action.search.SearchRequestBuilder; | |||
import org.elasticsearch.index.query.QueryBuilders; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.server.es.BaseIndexer; | |||
import org.sonar.server.es.BulkIndexer; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.IndexTypeId; | |||
@@ -37,20 +35,20 @@ import org.sonar.server.es.StartupIndexer; | |||
import org.sonar.server.source.index.FileSourcesUpdaterHelper; | |||
import static org.sonar.server.test.index.TestIndexDefinition.FIELD_FILE_UUID; | |||
import static org.sonar.server.test.index.TestIndexDefinition.FIELD_UPDATED_AT; | |||
import static org.sonar.server.test.index.TestIndexDefinition.INDEX_TYPE_TEST; | |||
/** | |||
* Add to Elasticsearch index {@link TestIndexDefinition} the rows of | |||
* db table FILE_SOURCES of type TEST that are not indexed yet | |||
*/ | |||
public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupIndexer { | |||
public class TestIndexer implements ProjectIndexer, StartupIndexer { | |||
private final DbClient dbClient; | |||
private final EsClient esClient; | |||
public TestIndexer(System2 system2, DbClient dbClient, EsClient esClient) { | |||
super(system2, esClient, 0L, INDEX_TYPE_TEST, FIELD_UPDATED_AT); | |||
public TestIndexer(DbClient dbClient, EsClient esClient) { | |||
this.dbClient = dbClient; | |||
this.esClient = esClient; | |||
} | |||
@Override | |||
@@ -63,7 +61,7 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI | |||
break; | |||
case NEW_ANALYSIS: | |||
deleteProject(projectUuid); | |||
super.index(lastUpdatedAt -> doIndex(lastUpdatedAt, projectUuid)); | |||
doIndex(projectUuid, cause); | |||
break; | |||
default: | |||
// defensive case | |||
@@ -78,7 +76,7 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI | |||
@Override | |||
public void indexOnStartup() { | |||
index(); | |||
doIndex(null, Cause.NEW_ANALYSIS); | |||
} | |||
public long index(Iterator<FileSourcesUpdaterHelper.Row> dbRows) { | |||
@@ -86,18 +84,13 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI | |||
return doIndex(bulk, dbRows); | |||
} | |||
@Override | |||
protected long doIndex(long lastUpdatedAt) { | |||
return doIndex(lastUpdatedAt, null); | |||
} | |||
private long doIndex(long lastUpdatedAt, @Nullable String projectUuid) { | |||
private long doIndex(@Nullable String projectUuid, Cause cause) { | |||
final BulkIndexer bulk = new BulkIndexer(esClient, INDEX_TYPE_TEST.getIndex()); | |||
bulk.setLarge(lastUpdatedAt == 0L); | |||
bulk.setLarge(cause == Cause.NEW_ANALYSIS); | |||
DbSession dbSession = dbClient.openSession(false); | |||
try { | |||
TestResultSetIterator rowIt = TestResultSetIterator.create(dbClient, dbSession, lastUpdatedAt, projectUuid); | |||
TestResultSetIterator rowIt = TestResultSetIterator.create(dbClient, dbSession, projectUuid); | |||
long maxUpdatedAt = doIndex(bulk, rowIt); | |||
rowIt.close(); | |||
return maxUpdatedAt; |
@@ -66,9 +66,9 @@ public class TestResultSetIterator extends ResultSetIterator<Row> { | |||
super(stmt); | |||
} | |||
public static TestResultSetIterator create(DbClient dbClient, DbSession session, long afterDate, @Nullable String projectUuid) { | |||
public static TestResultSetIterator create(DbClient dbClient, DbSession session, @Nullable String projectUuid) { | |||
try { | |||
return new TestResultSetIterator(FileSourcesUpdaterHelper.preparedStatementToSelectFileSources(dbClient, session, FileSourceDto.Type.TEST, afterDate, projectUuid)); | |||
return new TestResultSetIterator(FileSourcesUpdaterHelper.preparedStatementToSelectFileSources(dbClient, session, FileSourceDto.Type.TEST, projectUuid)); | |||
} catch (SQLException e) { | |||
throw new IllegalStateException("Fail to prepare SQL request to select all tests", e); | |||
} |
@@ -23,10 +23,8 @@ import com.google.common.collect.ImmutableSet; | |||
import java.util.Iterator; | |||
import java.util.Set; | |||
import org.elasticsearch.action.index.IndexRequest; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.server.es.BaseIndexer; | |||
import org.sonar.server.es.BulkIndexer; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.IndexTypeId; | |||
@@ -34,13 +32,14 @@ import org.sonar.server.es.StartupIndexer; | |||
import static org.sonar.server.user.index.UserIndexDefinition.INDEX_TYPE_USER; | |||
public class UserIndexer extends BaseIndexer implements StartupIndexer { | |||
public class UserIndexer implements StartupIndexer { | |||
private final DbClient dbClient; | |||
private final EsClient esClient; | |||
public UserIndexer(System2 system2, DbClient dbClient, EsClient esClient) { | |||
super(system2, esClient, 300, UserIndexDefinition.INDEX_TYPE_USER, UserIndexDefinition.FIELD_UPDATED_AT); | |||
public UserIndexer(DbClient dbClient, EsClient esClient) { | |||
this.dbClient = dbClient; | |||
this.esClient = esClient; | |||
} | |||
@Override | |||
@@ -53,17 +52,15 @@ public class UserIndexer extends BaseIndexer implements StartupIndexer { | |||
index(); | |||
} | |||
@Override | |||
protected long doIndex(long lastUpdatedAt) { | |||
public void index() { | |||
final BulkIndexer bulk = new BulkIndexer(esClient, UserIndexDefinition.INDEX_TYPE_USER.getIndex()); | |||
bulk.setLarge(lastUpdatedAt == 0L); | |||
bulk.setLarge(true); | |||
DbSession dbSession = dbClient.openSession(false); | |||
try { | |||
UserResultSetIterator rowIt = UserResultSetIterator.create(dbClient, dbSession, lastUpdatedAt); | |||
long maxUpdatedAt = doIndex(bulk, rowIt); | |||
UserResultSetIterator rowIt = UserResultSetIterator.create(dbClient, dbSession); | |||
doIndex(bulk, rowIt); | |||
rowIt.close(); | |||
return maxUpdatedAt; | |||
} finally { | |||
dbSession.close(); | |||
} |
@@ -47,19 +47,13 @@ class UserResultSetIterator extends ResultSetIterator<UserDoc> { | |||
private static final String SQL_ALL = "select " + StringUtils.join(FIELDS, ",") + " from users u "; | |||
private static final String SQL_AFTER_DATE = SQL_ALL + " where u.updated_at>?"; | |||
private UserResultSetIterator(PreparedStatement stmt) throws SQLException { | |||
super(stmt); | |||
} | |||
static UserResultSetIterator create(DbClient dbClient, DbSession session, long afterDate) { | |||
static UserResultSetIterator create(DbClient dbClient, DbSession session) { | |||
try { | |||
String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL; | |||
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql); | |||
if (afterDate > 0L) { | |||
stmt.setLong(1, afterDate); | |||
} | |||
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, SQL_ALL); | |||
return new UserResultSetIterator(stmt); | |||
} catch (SQLException e) { | |||
throw new IllegalStateException("Fail to prepare SQL request to select all users", e); |
@@ -24,12 +24,10 @@ import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import org.elasticsearch.action.index.IndexRequest; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.component.ComponentDto; | |||
import org.sonar.db.component.UuidWithProjectUuidDto; | |||
import org.sonar.server.es.BaseIndexer; | |||
import org.sonar.server.es.BulkIndexer; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.IndexTypeId; | |||
@@ -38,13 +36,14 @@ import org.sonar.server.es.StartupIndexer; | |||
import static com.google.common.collect.Maps.newHashMap; | |||
import static org.sonar.server.view.index.ViewIndexDefinition.INDEX_TYPE_VIEW; | |||
public class ViewIndexer extends BaseIndexer implements StartupIndexer { | |||
public class ViewIndexer implements StartupIndexer { | |||
private final DbClient dbClient; | |||
private final EsClient esClient; | |||
public ViewIndexer(System2 system2, DbClient dbClient, EsClient esClient) { | |||
super(system2, esClient, 300, ViewIndexDefinition.INDEX_TYPE_VIEW, "updatedAt"); | |||
public ViewIndexer(DbClient dbClient, EsClient esClient) { | |||
this.dbClient = dbClient; | |||
this.esClient = esClient; | |||
} | |||
@Override | |||
@@ -53,34 +52,14 @@ public class ViewIndexer extends BaseIndexer implements StartupIndexer { | |||
} | |||
@Override | |||
public void indexOnStartup() { | |||
index(); | |||
} | |||
/** | |||
* Index all views if the index is empty (Only used on startup). | |||
* It's currently not possible to index only data from db that are not existing in the index because we have no way to last when the structure of a view is changed : | |||
* - Either the definition has changed -> No updated at column in the projects table, | |||
* - Either the view is defined by a regex -> A new analysed project automatically steps into the view. | |||
* <p/> | |||
* The views lookup cache will not be cleared | |||
*/ | |||
@Override | |||
protected long doIndex(long lastUpdatedAt) { | |||
long count = esClient.prepareCount(ViewIndexDefinition.INDEX_TYPE_VIEW.getIndex()).setTypes(ViewIndexDefinition.INDEX_TYPE_VIEW.getType()).get().getCount(); | |||
if (count == 0) { | |||
DbSession dbSession = dbClient.openSession(false); | |||
try { | |||
Map<String, String> viewAndProjectViewUuidMap = newHashMap(); | |||
for (UuidWithProjectUuidDto uuidWithProjectUuidDto : dbClient.componentDao().selectAllViewsAndSubViews(dbSession)) { | |||
viewAndProjectViewUuidMap.put(uuidWithProjectUuidDto.getUuid(), uuidWithProjectUuidDto.getProjectUuid()); | |||
} | |||
index(dbSession, viewAndProjectViewUuidMap, false); | |||
} finally { | |||
dbSession.close(); | |||
public void indexOnStartup(Set<IndexType> emptyIndexTypes) { | |||
try (DbSession dbSession = dbClient.openSession(false)) { | |||
Map<String, String> viewAndProjectViewUuidMap = newHashMap(); | |||
for (UuidWithProjectUuidDto uuidWithProjectUuidDto : dbClient.componentDao().selectAllViewsAndSubViews(dbSession)) { | |||
viewAndProjectViewUuidMap.put(uuidWithProjectUuidDto.getUuid(), uuidWithProjectUuidDto.getProjectUuid()); | |||
} | |||
index(dbSession, viewAndProjectViewUuidMap, false); | |||
} | |||
return 0L; | |||
} | |||
/** |
@@ -76,7 +76,7 @@ public class IssuesActionTest { | |||
@Rule | |||
public UserSessionRule userSessionRule = UserSessionRule.standalone(); | |||
private IssueIndexer issueIndexer = new IssueIndexer(system2, db.getDbClient(), es.client()); | |||
private IssueIndexer issueIndexer = new IssueIndexer(db.getDbClient(), es.client()); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, issueIndexer); | |||
private ServerFileSystem fs = mock(ServerFileSystem.class); | |||
private WsTester tester; |
@@ -113,7 +113,7 @@ public class SearchProjectsActionTest { | |||
private DbClient dbClient = db.getDbClient(); | |||
private DbSession dbSession = db.getSession(); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, new ProjectMeasuresIndexer(System2.INSTANCE, dbClient, es.client())); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, new ProjectMeasuresIndexer(dbClient, es.client())); | |||
private ProjectMeasuresIndex index = new ProjectMeasuresIndex(es.client(), new AuthorizationTypeSupport(userSession)); | |||
private ProjectMeasuresQueryValidator queryValidator = new ProjectMeasuresQueryValidator(dbClient); | |||
@@ -76,7 +76,7 @@ public class IssueUpdaterTest { | |||
private ArgumentCaptor<IssueChangeNotification> notificationArgumentCaptor = ArgumentCaptor.forClass(IssueChangeNotification.class); | |||
private IssueUpdater underTest = new IssueUpdater(dbClient, | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), | |||
notificationManager); | |||
@Test |
@@ -66,7 +66,7 @@ public class IssueIndexDebtTest { | |||
private System2 system2 = System2.INSTANCE; | |||
private IssueIndex index; | |||
private IssueIndexer issueIndexer = new IssueIndexer(system2, null, tester.client()); | |||
private IssueIndexer issueIndexer = new IssueIndexer(null, tester.client()); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer); | |||
@Before |
@@ -85,8 +85,8 @@ public class IssueIndexTest { | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
private IssueIndex underTest; | |||
private IssueIndexer issueIndexer = new IssueIndexer(system2, null, tester.client()); | |||
private ViewIndexer viewIndexer = new ViewIndexer(system2, null, tester.client()); | |||
private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null)); | |||
private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client()); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer); | |||
@Before |
@@ -52,12 +52,12 @@ public class IssueIndexerTest { | |||
@Rule | |||
public DbTester dbTester = DbTester.create(system2); | |||
private IssueIndexer underTest = new IssueIndexer(system2, dbTester.getDbClient(), esTester.client()); | |||
private IssueIndexer underTest = new IssueIndexer(dbTester.getDbClient(), esTester.client()); | |||
@Test | |||
public void index_on_startup() { | |||
IssueIndexer indexer = spy(underTest); | |||
doNothing().when(indexer).index(); | |||
doNothing().when(indexer).indexOnStartup(); | |||
indexer.indexOnStartup(); | |||
verify(indexer).indexOnStartup(); | |||
} | |||
@@ -73,7 +73,7 @@ public class IssueIndexerTest { | |||
public void index_all_issues() { | |||
dbTester.prepareDbUnit(getClass(), "index.xml"); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
List<IssueDoc> docs = esTester.getDocuments(IssueIndexDefinition.INDEX_TYPE_ISSUE, IssueDoc.class); | |||
assertThat(docs).hasSize(1); | |||
@@ -125,7 +125,7 @@ public class IssueIndexerTest { | |||
public void deleteProject_deletes_issues_of_a_specific_project() { | |||
dbTester.prepareDbUnit(getClass(), "index.xml"); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.countDocuments("issues", "issue")).isEqualTo(1); | |||
@@ -187,7 +187,7 @@ public class IssueIndexerTest { | |||
issueDoc.setKey("key"); | |||
issueDoc.setTechnicalUpdateDate(new Date()); | |||
issueDoc.setProjectUuid("non-exitsing-parent"); | |||
new IssueIndexer(system2, dbTester.getDbClient(), esTester.client()) | |||
new IssueIndexer(dbTester.getDbClient(), esTester.client()) | |||
.index(Arrays.asList(issueDoc).iterator()); | |||
assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX_TYPE_ISSUE)).isEqualTo(1L); |
@@ -39,7 +39,7 @@ public class IssueResultSetIteratorTest { | |||
@Test | |||
public void iterator_over_one_issue() { | |||
dbTester.prepareDbUnit(getClass(), "one_issue.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
@@ -72,7 +72,7 @@ public class IssueResultSetIteratorTest { | |||
@Test | |||
public void iterator_over_issues() { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
@@ -134,27 +134,17 @@ public class IssueResultSetIteratorTest { | |||
@Test | |||
public void iterator_over_issue_from_project() { | |||
dbTester.prepareDbUnit(getClass(), "many_projects.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, "THE_PROJECT_1"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), "THE_PROJECT_1"); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
assertThat(issuesByKey).hasSize(2); | |||
} | |||
@Test | |||
public void iterator_over_issue_from_project_and_date() { | |||
dbTester.prepareDbUnit(getClass(), "many_projects.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_600_000_000_000L, "THE_PROJECT_1"); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
assertThat(issuesByKey).hasSize(1); | |||
} | |||
@Test | |||
public void extract_directory_path() { | |||
dbTester.prepareDbUnit(getClass(), "extract_directory_path.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
@@ -176,7 +166,7 @@ public class IssueResultSetIteratorTest { | |||
@Test | |||
public void extract_file_path() { | |||
dbTester.prepareDbUnit(getClass(), "extract_file_path.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
Map<String, IssueDoc> issuesByKey = issuesByKey(it); | |||
it.close(); | |||
@@ -195,19 +185,6 @@ public class IssueResultSetIteratorTest { | |||
assertThat(issuesByKey.get("FGH").filePath()).isNull(); | |||
} | |||
@Test | |||
public void select_after_date() { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_420_000_000_000L, null); | |||
assertThat(it.hasNext()).isTrue(); | |||
IssueDoc issue = it.next(); | |||
assertThat(issue.key()).isEqualTo("DEF"); | |||
assertThat(it.hasNext()).isFalse(); | |||
it.close(); | |||
} | |||
private static Map<String, IssueDoc> issuesByKey(IssueResultSetIterator it) { | |||
return Maps.uniqueIndex(it, new Function<IssueDoc, String>() { | |||
@Override |
@@ -86,7 +86,7 @@ public class AddCommentActionTest { | |||
private IssueDbTester issueDbTester = new IssueDbTester(dbTester); | |||
private IssueUpdater issueUpdater = new IssueUpdater(dbClient, | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)); | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)); | |||
private OperationResponseWriter responseWriter = mock(OperationResponseWriter.class); | |||
private WsActionTester tester = new WsActionTester( |
@@ -105,7 +105,7 @@ public class BulkChangeActionTest { | |||
private IssueFieldsSetter issueFieldsSetter = new IssueFieldsSetter(); | |||
private IssueWorkflow issueWorkflow = new IssueWorkflow(new FunctionExecutor(issueFieldsSetter), issueFieldsSetter); | |||
private IssueStorage issueStorage = new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, es.client())); | |||
private IssueStorage issueStorage = new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, es.client())); | |||
private NotificationManager notificationManager = mock(NotificationManager.class); | |||
private List<Action> actions = new ArrayList<>(); | |||
@@ -97,7 +97,7 @@ public class DoTransitionActionTest { | |||
private TransitionService transitionService = new TransitionService(userSession, workflow); | |||
private OperationResponseWriter responseWriter = mock(OperationResponseWriter.class); | |||
private IssueUpdater issueUpdater = new IssueUpdater(dbClient, | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)); | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)); | |||
private WsAction underTest = new DoTransitionAction(dbClient, userSession, new IssueFinder(dbClient, userSession), issueUpdater, transitionService, responseWriter); | |||
private WsActionTester tester = new WsActionTester(underTest); |
@@ -90,7 +90,7 @@ public class SetSeverityActionTest { | |||
private WsActionTester tester = new WsActionTester(new SetSeverityAction(userSession, dbClient, new IssueFinder(dbClient, userSession), new IssueFieldsSetter(), | |||
new IssueUpdater(dbClient, | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)), | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)), | |||
responseWriter)); | |||
@Test |
@@ -90,7 +90,7 @@ public class SetTypeActionTest { | |||
private WsActionTester tester = new WsActionTester(new SetTypeAction(userSession, dbClient, new IssueFinder(dbClient, userSession), new IssueFieldsSetter(), | |||
new IssueUpdater(dbClient, | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)), | |||
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)), | |||
responseWriter)); | |||
@Test |
@@ -29,12 +29,12 @@ import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.config.MapSettings; | |||
import org.sonar.api.resources.Qualifiers; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.component.ComponentDto; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.organization.OrganizationTesting; | |||
import org.sonar.db.user.GroupDto; | |||
import org.sonar.db.user.UserDto; | |||
import org.sonar.server.component.ws.FilterParser.Operator; | |||
import org.sonar.server.es.EsTester; | |||
import org.sonar.server.es.Facets; | |||
import org.sonar.server.es.SearchIdResult; | |||
@@ -57,7 +57,6 @@ import static org.sonar.api.measures.Metric.Level.WARN; | |||
import static org.sonar.db.component.ComponentTesting.newProjectDto; | |||
import static org.sonar.db.user.GroupTesting.newGroupDto; | |||
import static org.sonar.db.user.UserTesting.newUserDto; | |||
import static org.sonar.server.component.ws.FilterParser.Operator; | |||
import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_TYPE_PROJECT_MEASURES; | |||
public class ProjectMeasuresIndexTest { | |||
@@ -85,7 +84,7 @@ public class ProjectMeasuresIndexTest { | |||
@Rule | |||
public UserSessionRule userSession = UserSessionRule.standalone(); | |||
private ProjectMeasuresIndexer projectMeasureIndexer = new ProjectMeasuresIndexer(System2.INSTANCE, null, es.client()); | |||
private ProjectMeasuresIndexer projectMeasureIndexer = new ProjectMeasuresIndexer(null, es.client()); | |||
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, projectMeasureIndexer); | |||
private ProjectMeasuresIndex underTest = new ProjectMeasuresIndex(es.client(), new AuthorizationTypeSupport(userSession)); | |||
@@ -54,19 +54,19 @@ public class ProjectMeasuresIndexerTest { | |||
public DbTester dbTester = DbTester.create(system2); | |||
private ComponentDbTester componentDbTester = new ComponentDbTester(dbTester); | |||
private ProjectMeasuresIndexer underTest = new ProjectMeasuresIndexer(system2, dbTester.getDbClient(), esTester.client()); | |||
private ProjectMeasuresIndexer underTest = new ProjectMeasuresIndexer(dbTester.getDbClient(), esTester.client()); | |||
@Test | |||
public void index_on_startup() { | |||
ProjectMeasuresIndexer indexer = spy(underTest); | |||
doNothing().when(indexer).index(); | |||
doNothing().when(indexer).indexOnStartup(); | |||
indexer.indexOnStartup(); | |||
verify(indexer).indexOnStartup(); | |||
} | |||
@Test | |||
public void index_nothing() { | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.countDocuments(INDEX_TYPE_PROJECT_MEASURES)).isZero(); | |||
} | |||
@@ -78,7 +78,7 @@ public class ProjectMeasuresIndexerTest { | |||
componentDbTester.insertProjectAndSnapshot(newProjectDto(organizationDto)); | |||
componentDbTester.insertProjectAndSnapshot(newProjectDto(organizationDto)); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.countDocuments(INDEX_TYPE_PROJECT_MEASURES)).isEqualTo(3); | |||
} | |||
@@ -90,7 +90,7 @@ public class ProjectMeasuresIndexerTest { | |||
public void index_provisioned_projects() { | |||
ComponentDto project = componentDbTester.insertProject(); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.getIds(INDEX_TYPE_PROJECT_MEASURES)).containsOnly(project.uuid()); | |||
} | |||
@@ -159,7 +159,7 @@ public class ProjectMeasuresIndexerTest { | |||
componentDbTester.insertProjectAndSnapshot(project2); | |||
ComponentDto project3 = newProjectDto(organizationDto); | |||
componentDbTester.insertProjectAndSnapshot(project3); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
underTest.deleteProject(project1.uuid()); | |||
@@ -170,7 +170,7 @@ public class ProjectMeasuresIndexerTest { | |||
public void does_nothing_when_deleting_unknown_project() throws Exception { | |||
ComponentDto project = newProjectDto(dbTester.organizations().insert()); | |||
componentDbTester.insertProjectAndSnapshot(project); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
underTest.deleteProject("UNKNOWN"); | |||
@@ -40,7 +40,6 @@ import org.sonar.server.tester.UserSessionRule; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.sonar.api.web.UserRole.ADMIN; | |||
import static org.sonar.api.web.UserRole.USER; | |||
import static org.sonar.server.permission.index.FooIndexDefinition.FOO_INDEX; | |||
public class PermissionIndexerTest { | |||
@@ -76,22 +75,14 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_does_nothing_if_no_data() { | |||
underTest.indexAllIfEmpty(); | |||
assertThat(esTester.countDocuments(FOO_INDEX, "authorization")).isZero(); | |||
assertThat(fooIndex.hasAccessToProject("a_project")).isFalse(); | |||
} | |||
@Test | |||
public void indexAllIfEmpty_grants_access_to_user() { | |||
public void initializeOnStartup_grants_access_to_user() { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user1 = userDbTester.insertUser(); | |||
UserDto user2 = userDbTester.insertUser(); | |||
userDbTester.insertProjectPermissionOnUser(user1, USER, project); | |||
userDbTester.insertProjectPermissionOnUser(user2, ADMIN, project); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
// anonymous | |||
verifyAnyoneNotAuthorized(project); | |||
@@ -104,7 +95,7 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_grants_access_to_group() { | |||
public void initializeOnStartup_grants_access_to_group() { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user1 = userDbTester.insertUser(); | |||
UserDto user2 = userDbTester.insertUser(); | |||
@@ -114,7 +105,7 @@ public class PermissionIndexerTest { | |||
userDbTester.insertProjectPermissionOnGroup(group1, USER, project); | |||
userDbTester.insertProjectPermissionOnGroup(group2, ADMIN, project); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
// anonymous | |||
verifyAnyoneNotAuthorized(project); | |||
@@ -130,7 +121,7 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_grants_access_to_user_and_group() { | |||
public void initializeOnStartup_grants_access_to_user_and_group() { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user1 = userDbTester.insertUser(); | |||
UserDto user2 = userDbTester.insertUser(); | |||
@@ -139,7 +130,7 @@ public class PermissionIndexerTest { | |||
userDbTester.insertProjectPermissionOnUser(user1, USER, project); | |||
userDbTester.insertProjectPermissionOnGroup(group, USER, project); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
// anonymous | |||
verifyAnyoneNotAuthorized(project); | |||
@@ -155,12 +146,12 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_does_not_grant_access_to_anybody() { | |||
public void initializeOnStartup_does_not_grant_access_to_anybody() { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user = userDbTester.insertUser(); | |||
GroupDto group = userDbTester.insertGroup(); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
verifyAnyoneNotAuthorized(project); | |||
verifyNotAuthorized(project, user); | |||
@@ -168,13 +159,13 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_grants_access_to_anyone() { | |||
public void initializeOnStartup_grants_access_to_anyone() { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user = userDbTester.insertUser(); | |||
GroupDto group = userDbTester.insertGroup(); | |||
userDbTester.insertProjectPermissionOnAnyone(USER, project); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
verifyAnyoneAuthorized(project); | |||
verifyAuthorized(project, user); | |||
@@ -182,7 +173,7 @@ public class PermissionIndexerTest { | |||
} | |||
@Test | |||
public void indexAllIfEmpty_grants_access_on_many_projects() { | |||
public void initializeOnStartup_grants_access_on_many_projects() { | |||
UserDto user1 = userDbTester.insertUser(); | |||
UserDto user2 = userDbTester.insertUser(); | |||
ComponentDto project = null; | |||
@@ -191,7 +182,7 @@ public class PermissionIndexerTest { | |||
userDbTester.insertProjectPermissionOnUser(user1, USER, project); | |||
} | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
verifyAnyoneNotAuthorized(project); | |||
verifyAuthorized(project, user1); | |||
@@ -204,7 +195,7 @@ public class PermissionIndexerTest { | |||
ComponentDto project2 = createAndIndexProject(); | |||
userDbTester.insertProjectPermissionOnAnyone(USER, project1); | |||
userDbTester.insertProjectPermissionOnAnyone(USER, project2); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.countDocuments(INDEX_TYPE_FOO_AUTH)).isEqualTo(2); | |||
underTest.deleteProject(project1.uuid()); | |||
@@ -228,7 +219,7 @@ public class PermissionIndexerTest { | |||
ComponentDto project = createAndIndexProject(); | |||
UserDto user1 = userDbTester.insertUser(); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
verifyAnyoneNotAuthorized(project); | |||
verifyNotAuthorized(project, user1); | |||
@@ -242,7 +233,7 @@ public class PermissionIndexerTest { | |||
userDbTester.insertProjectPermissionOnAnyone(USER, projectOnOrg1); | |||
userDbTester.insertProjectPermissionOnUser(user, USER, projectOnOrg2); | |||
underTest.indexAllIfEmpty(); | |||
underTest.indexOnStartup(); | |||
verifyAnyoneAuthorized(projectOnOrg1); | |||
verifyAnyoneNotAuthorized(projectOnOrg2); |
@@ -58,13 +58,13 @@ import org.sonar.server.ws.TestResponse; | |||
import org.sonar.server.ws.WsActionTester; | |||
import org.sonar.test.JsonAssert; | |||
import org.sonarqube.ws.MediaTypes; | |||
import org.sonarqube.ws.QualityProfiles.CreateWsResponse; | |||
import org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.sonar.server.language.LanguageTesting.newLanguages; | |||
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES; | |||
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse; | |||
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile; | |||
import static org.sonar.server.language.LanguageTesting.newLanguages; | |||
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse.parseFrom; | |||
public class CreateActionTest { |
@@ -105,22 +105,6 @@ public class RuleResultSetIteratorTest { | |||
assertThat(rule.updatedAt()).isEqualTo(1600000000000L); | |||
} | |||
@Test | |||
public void select_after_date() { | |||
dbClient.ruleDao().insert(dbSession, templateRule); | |||
dbClient.ruleDao().insert(dbSession, customRule); | |||
dbSession.commit(); | |||
RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_900_000_000_000L); | |||
assertThat(it.hasNext()).isTrue(); | |||
RuleDoc issue = it.next(); | |||
assertThat(issue.key()).isEqualTo(RuleKey.of("xoo", "S002")); | |||
assertThat(it.hasNext()).isFalse(); | |||
it.close(); | |||
} | |||
@Test | |||
public void iterator_over_rules() { | |||
dbClient.ruleDao().insert(dbSession, templateRule); |
@@ -67,12 +67,12 @@ public class TestIndexerTest { | |||
@Rule | |||
public DbTester db = DbTester.create(system2); | |||
private TestIndexer underTest = new TestIndexer(system2, db.getDbClient(), es.client()); | |||
private TestIndexer underTest = new TestIndexer(db.getDbClient(), es.client()); | |||
@Test | |||
public void index_on_startup() { | |||
TestIndexer indexer = spy(underTest); | |||
doNothing().when(indexer).index(); | |||
doNothing().when(indexer).indexOnStartup(); | |||
indexer.indexOnStartup(); | |||
verify(indexer).indexOnStartup(); | |||
} | |||
@@ -82,7 +82,7 @@ public class TestIndexerTest { | |||
db.prepareDbUnit(getClass(), "db.xml"); | |||
TestTesting.updateDataColumn(db.getSession(), "FILE_UUID", TestTesting.newRandomTests(3)); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(countDocuments()).isEqualTo(3); | |||
} |
@@ -90,7 +90,7 @@ public class TestResultSetIteratorTest { | |||
public void traverse_db() throws Exception { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(3)); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
assertThat(row.getProjectUuid()).isEqualTo("P1"); | |||
@@ -123,7 +123,7 @@ public class TestResultSetIteratorTest { | |||
.setName("N1") | |||
.build()); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", tests); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
@@ -148,20 +148,12 @@ public class TestResultSetIteratorTest { | |||
FIELD_COVERED_FILES); | |||
} | |||
@Test | |||
public void filter_by_date() { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 2000000000000L, null); | |||
assertThat(underTest.hasNext()).isFalse(); | |||
} | |||
@Test | |||
public void filter_by_project() throws Exception { | |||
dbTester.prepareDbUnit(getClass(), "filter_by_project.xml"); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(1)); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, "P1"); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), "P1"); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
assertThat(row.getProjectUuid()).isEqualTo("P1"); | |||
@@ -171,28 +163,13 @@ public class TestResultSetIteratorTest { | |||
assertThat(underTest.hasNext()).isFalse(); | |||
} | |||
@Test | |||
public void filter_by_project_and_date() throws Exception { | |||
dbTester.prepareDbUnit(getClass(), "filter_by_project_and_date.xml"); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(1)); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1400000000000L, "P1"); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
assertThat(row.getProjectUuid()).isEqualTo("P1"); | |||
assertThat(row.getFileUuid()).isEqualTo("F1"); | |||
// File F2 is not returned | |||
assertThat(underTest.hasNext()).isFalse(); | |||
} | |||
@Test | |||
public void read_does_not_fail_if_corrupted_data() throws Exception { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", "THIS_IS_NOT_PROTOBUF".getBytes()); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
assertThat(row.getFileUuid()).isEqualTo("F1"); | |||
assertThat(row.getUpdateRequests()).isEmpty(); | |||
@@ -206,7 +183,7 @@ public class TestResultSetIteratorTest { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
TestTesting.updateDataColumn(dbTester.getSession(), "F1", (byte[])null); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null); | |||
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null); | |||
FileSourcesUpdaterHelper.Row row = underTest.next(); | |||
assertThat(row.getFileUuid()).isEqualTo("F1"); |
@@ -26,7 +26,6 @@ import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.sonar.api.config.MapSettings; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.component.ComponentDto; | |||
@@ -76,7 +75,7 @@ public class ListActionTest { | |||
private DbClient dbClient = db.getDbClient(); | |||
private TestIndex testIndex = new TestIndex(es.client()); | |||
private TestIndexer testIndexer = new TestIndexer(System2.INSTANCE, db.getDbClient(), es.client()); | |||
private TestIndexer testIndexer = new TestIndexer(db.getDbClient(), es.client()); | |||
private ComponentDto project; | |||
private ComponentDto mainFile; | |||
@@ -286,7 +285,7 @@ public class ListActionTest { | |||
.setFileUuid(testFile.uuid()) | |||
.setTestData(asList(tests))); | |||
db.commit(); | |||
testIndexer.index(); | |||
testIndexer.indexOnStartup(); | |||
} | |||
private static ListResponse call(TestRequest request) { |
@@ -86,7 +86,7 @@ public class UserUpdaterTest { | |||
private ArgumentCaptor<NewUserHandler.Context> newUserHandler = ArgumentCaptor.forClass(NewUserHandler.Context.class); | |||
private Settings settings = new MapSettings(); | |||
private DbSession session = db.getSession(); | |||
private UserIndexer userIndexer = new UserIndexer(system2, dbClient, es.client()); | |||
private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); | |||
private OrganizationCreation organizationCreation = mock(OrganizationCreation.class); | |||
private UserUpdater underTest = new UserUpdater(newUserNotifier, settings, dbClient, userIndexer, system2, TestDefaultOrganizationProvider.from(db), organizationCreation); | |||
@@ -77,6 +77,6 @@ public class UserIndexerTest { | |||
} | |||
private UserIndexer createIndexer() { | |||
return new UserIndexer(system2, dbTester.getDbClient(), esTester.client()); | |||
return new UserIndexer(dbTester.getDbClient(), esTester.client()); | |||
} | |||
} |
@@ -37,7 +37,7 @@ public class UserResultSetIteratorTest { | |||
@Test | |||
public void iterator_over_users() { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L); | |||
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession()); | |||
Map<String, UserDoc> usersByLogin = Maps.uniqueIndex(it, new Function<UserDoc, String>() { | |||
@Override | |||
public String apply(UserDoc user) { | |||
@@ -72,17 +72,4 @@ public class UserResultSetIteratorTest { | |||
assertThat(user3.createdAt()).isEqualTo(1500000000000L); | |||
assertThat(user3.updatedAt()).isEqualTo(1550000000000L); | |||
} | |||
@Test | |||
public void select_after_date() { | |||
dbTester.prepareDbUnit(getClass(), "shared.xml"); | |||
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1520000000000L); | |||
assertThat(it.hasNext()).isTrue(); | |||
UserDoc user = it.next(); | |||
assertThat(user.login()).isEqualTo("user3"); | |||
assertThat(it.hasNext()).isFalse(); | |||
it.close(); | |||
} | |||
} |
@@ -57,7 +57,7 @@ public class ChangePasswordActionTest { | |||
public UserSessionRule userSessionRule = UserSessionRule.standalone().logIn(); | |||
private UserUpdater userUpdater = new UserUpdater(mock(NewUserNotifier.class), new MapSettings(), db.getDbClient(), | |||
new UserIndexer(System2.INSTANCE, db.getDbClient(), esTester.client()), | |||
new UserIndexer(db.getDbClient(), esTester.client()), | |||
System2.INSTANCE, | |||
TestDefaultOrganizationProvider.from(db), | |||
mock(OrganizationCreation.class)); |
@@ -75,7 +75,7 @@ public class CreateActionTest { | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
private UserIndex index = new UserIndex(esTester.client()); | |||
private UserIndexer userIndexer = new UserIndexer(system2, db.getDbClient(), esTester.client()); | |||
private UserIndexer userIndexer = new UserIndexer(db.getDbClient(), esTester.client()); | |||
private GroupDto defaultGroupInDefaultOrg; | |||
private OrganizationCreation organizationCreation = mock(OrganizationCreation.class); | |||
@@ -81,9 +81,9 @@ public class DeactivateActionTest { | |||
@Before | |||
public void setUp() { | |||
userIndexer = new UserIndexer(system2, dbClient, esTester.client()); | |||
userIndexer = new UserIndexer(dbClient, esTester.client()); | |||
index = new UserIndex(esTester.client()); | |||
userIndexer = new UserIndexer(system2, dbClient, esTester.client()); | |||
userIndexer = new UserIndexer(dbClient, esTester.client()); | |||
ws = new WsActionTester(new DeactivateAction( | |||
dbClient, userIndexer, userSession, new UserJsonWriter(userSession), defaultOrganizationProvider)); | |||
} |
@@ -66,7 +66,7 @@ public class SearchActionTest { | |||
private DbClient dbClient = db.getDbClient(); | |||
private DbSession dbSession = db.getSession(); | |||
private UserIndex index = new UserIndex(esTester.client()); | |||
private UserIndexer userIndexer = new UserIndexer(system2, dbClient, esTester.client()); | |||
private UserIndexer userIndexer = new UserIndexer(dbClient, esTester.client()); | |||
private WsTester ws = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession)))); | |||
@Test |
@@ -74,7 +74,7 @@ public class UpdateActionTest { | |||
dbClient.groupDao().insert(session, newGroupDto().setName("sonar-users")); | |||
session.commit(); | |||
userIndexer = new UserIndexer(system2, dbClient, esTester.client()); | |||
userIndexer = new UserIndexer(dbClient, esTester.client()); | |||
tester = new WsTester(new UsersWs(new UpdateAction( | |||
new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, defaultOrganizationProvider, ORGANIZATION_CREATION_NOT_USED_FOR_UPDATE), | |||
userSessionRule, |
@@ -71,21 +71,21 @@ public class ViewIndexerTest { | |||
private DbClient dbClient = dbTester.getDbClient(); | |||
private DbSession dbSession = dbTester.getSession(); | |||
private IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client()); | |||
private IssueIndexer issueIndexer = new IssueIndexer(dbClient, esTester.client()); | |||
private PermissionIndexer permissionIndexer = new PermissionIndexer(dbClient, esTester.client(), issueIndexer); | |||
private ViewIndexer underTest = new ViewIndexer(system2, dbClient, esTester.client()); | |||
private ViewIndexer underTest = new ViewIndexer(dbClient, esTester.client()); | |||
@Test | |||
public void index_on_startup() { | |||
ViewIndexer indexer = spy(underTest); | |||
doNothing().when(indexer).index(); | |||
doNothing().when(indexer).indexOnStartup(); | |||
indexer.indexOnStartup(); | |||
verify(indexer).indexOnStartup(); | |||
} | |||
@Test | |||
public void index_nothing() { | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
assertThat(esTester.countDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW)).isEqualTo(0L); | |||
} | |||
@@ -93,7 +93,7 @@ public class ViewIndexerTest { | |||
public void index() { | |||
dbTester.prepareDbUnit(getClass(), "index.xml"); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
List<ViewDoc> docs = esTester.getDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW, ViewDoc.class); | |||
assertThat(docs).hasSize(4); | |||
@@ -113,7 +113,7 @@ public class ViewIndexerTest { | |||
esTester.putDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW, | |||
new ViewDoc().setUuid("ABCD").setProjects(newArrayList("BCDE"))); | |||
underTest.index(); | |||
underTest.indexOnStartup(); | |||
// ... But they shouldn't be indexed | |||
assertThat(esTester.countDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW)).isEqualTo(1L); | |||
@@ -149,7 +149,7 @@ public class ViewIndexerTest { | |||
@Test | |||
public void clear_views_lookup_cache_on_index_view_uuid() { | |||
IssueIndex issueIndex = new IssueIndex(esTester.client(), System2.INSTANCE, userSessionRule, new AuthorizationTypeSupport(userSessionRule)); | |||
IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client()); | |||
IssueIndexer issueIndexer = new IssueIndexer(dbClient, esTester.client()); | |||
String viewUuid = "ABCD"; | |||