From 0a09d139ad49f6ad1ab333639bb16077f836861d Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Mon, 8 Sep 2014 12:31:18 +0200 Subject: [PATCH] SONAR-5560 - Updated BaseDao to scroll during synchronization --- .../sonar/server/activity/db/ActivityDao.java | 5 +- .../java/org/sonar/server/db/BaseDao.java | 120 +++++++++++------- .../issue/db/IssueAuthorizationDao.java | 9 +- .../org/sonar/server/issue/db/IssueDao.java | 7 +- .../qualityprofile/db/ActiveRuleDao.java | 7 - .../org/sonar/server/rule/db/RuleDao.java | 7 - 6 files changed, 81 insertions(+), 74 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/activity/db/ActivityDao.java b/server/sonar-server/src/main/java/org/sonar/server/activity/db/ActivityDao.java index 27fff1d30f6..f2c9b9561e3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/activity/db/ActivityDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/activity/db/ActivityDao.java @@ -26,7 +26,6 @@ import org.sonar.core.persistence.DbSession; import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; -import java.util.Date; import java.util.List; /** @@ -60,8 +59,8 @@ public class ActivityDao extends BaseDao { } @Override - protected Iterable findAfterDate(DbSession session, Date date) { - return mapper(session).selectAll(); + protected String getSynchronizationStatementName() { + return "selectAll"; } public List findAll(DbSession session) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java index 9724eda67f3..0259ce17ac6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java @@ -19,7 +19,10 @@ */ package org.sonar.server.db; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import org.apache.ibatis.session.ResultContext; +import org.apache.ibatis.session.ResultHandler; import org.sonar.api.utils.System2; import org.sonar.core.persistence.DaoComponent; import org.sonar.core.persistence.DbSession; @@ -33,9 +36,15 @@ import org.sonar.server.search.action.UpsertNestedItem; import javax.annotation.CheckForNull; import javax.annotation.Nullable; + import java.io.Serializable; +import java.sql.Timestamp; import java.util.Collection; import java.util.Date; +import java.util.List; +import java.util.Map; + +import static com.google.common.collect.Maps.newHashMap; /** * naming convention for DAO @@ -101,27 +110,27 @@ import java.util.Date; * - RuleTagDto tag add(RuleTagDto tag, RuleKey key) * - RuleParamDto param add(RuleParamDto param, RuleDto rule) * - * @param iBatis Mapper class - * @param Produced DTO class from this dao - * @param DTO Key class + * @param iBatis Mapper class + * @param Produced DTO class from this dao + * @param DTO Key class */ -public abstract class BaseDao, K extends Serializable> implements Dao, DaoComponent { +public abstract class BaseDao, KEY extends Serializable> implements Dao, DaoComponent { protected IndexDefinition indexDefinition; - private Class mapperClass; + private Class mapperClass; private System2 system2; private boolean hasIndex() { return indexDefinition != null; } - protected BaseDao(@Nullable IndexDefinition indexDefinition, Class mapperClass, System2 system2) { + protected BaseDao(@Nullable IndexDefinition indexDefinition, Class mapperClass, System2 system2) { this.mapperClass = mapperClass; this.indexDefinition = indexDefinition; this.system2 = system2; } - protected BaseDao(Class mapperClass, System2 system2) { + protected BaseDao(Class mapperClass, System2 system2) { this(null, mapperClass, system2); } @@ -129,16 +138,16 @@ public abstract class BaseDao, K extends Serializable> imple return indexDefinition != null ? this.indexDefinition.getIndexType() : null; } - protected M mapper(DbSession session) { + protected MAPPER mapper(DbSession session) { return session.getMapper(mapperClass); } - public E getNullableByKey(DbSession session, K key) { + public DTO getNullableByKey(DbSession session, KEY key) { return doGetNullableByKey(session, key); } - public E getByKey(DbSession session, K key) { - E value = doGetNullableByKey(session, key); + public DTO getByKey(DbSession session, KEY key) { + DTO value = doGetNullableByKey(session, key); if (value == null) { throw new NotFoundException(String.format("Key '%s' not found", key)); } @@ -146,32 +155,32 @@ public abstract class BaseDao, K extends Serializable> imple } @Override - public E update(DbSession session, E item) { + public DTO update(DbSession session, DTO item) { Date now = new Date(system2.now()); update(session, item, now); return item; } @Override - public E update(DbSession session, E item, E... others) { + public DTO update(DbSession session, DTO item, DTO... others) { Date now = new Date(system2.now()); update(session, item, now); - for (E other : others) { + for (DTO other : others) { update(session, other, now); } return item; } @Override - public Collection update(DbSession session, Collection items) { + public Collection update(DbSession session, Collection items) { Date now = new Date(system2.now()); - for (E item : items) { + for (DTO item : items) { update(session, item, now); } return items; } - private void update(DbSession session, E item, Date now) { + private void update(DbSession session, DTO item, Date now) { try { item.setUpdatedAt(now); doUpdate(session, item); @@ -184,31 +193,31 @@ public abstract class BaseDao, K extends Serializable> imple } @Override - public E insert(DbSession session, E item) { + public DTO insert(DbSession session, DTO item) { insert(session, item, new Date(system2.now())); return item; } @Override - public Collection insert(DbSession session, Collection items) { + public Collection insert(DbSession session, Collection items) { Date now = new Date(system2.now()); - for (E item : items) { + for (DTO item : items) { insert(session, item, now); } return items; } @Override - public E insert(DbSession session, E item, E... others) { + public DTO insert(DbSession session, DTO item, DTO... others) { Date now = new Date(system2.now()); insert(session, item, now); - for (E other : others) { + for (DTO other : others) { insert(session, other, now); } return item; } - private void insert(DbSession session, E item, Date now) { + private void insert(DbSession session, DTO item, Date now) { if (item.getCreatedAt() == null) { item.setCreatedAt(now); } @@ -216,7 +225,7 @@ public abstract class BaseDao, K extends Serializable> imple try { doInsert(session, item); if (hasIndex()) { - session.enqueue(new UpsertDto(getIndexType(), item)); + session.enqueue(new UpsertDto(getIndexType(), item)); } } catch (Exception e) { throw new IllegalStateException("Fail to insert item in db: " + item, e); @@ -224,54 +233,54 @@ public abstract class BaseDao, K extends Serializable> imple } @Override - public void delete(DbSession session, E item) { + public void delete(DbSession session, DTO item) { deleteByKey(session, item.getKey()); } @Override - public void delete(DbSession session, E item, E... others) { + public void delete(DbSession session, DTO item, DTO... others) { delete(session, item); - for (E e : others) { + for (DTO e : others) { delete(session, e); } } @Override - public void delete(DbSession session, Collection items) { - for (E item : items) { + public void delete(DbSession session, Collection items) { + for (DTO item : items) { delete(session, item); } } @Override - public void deleteByKey(DbSession session, K key) { + public void deleteByKey(DbSession session, KEY key) { Preconditions.checkNotNull(key, "Missing key"); try { doDeleteByKey(session, key); if (hasIndex()) { - session.enqueue(new DeleteKey(getIndexType(), key)); + session.enqueue(new DeleteKey(getIndexType(), key)); } } catch (Exception e) { throw new IllegalStateException("Fail to delete item from db: " + key, e); } } - protected final void enqueueUpdate(Object nestedItem, K key, DbSession session) { + protected final void enqueueUpdate(Object nestedItem, KEY key, DbSession session) { if (hasIndex()) { - session.enqueue(new UpsertNestedItem( + session.enqueue(new UpsertNestedItem( this.getIndexType(), key, nestedItem)); } } - public void enqueueDelete(Object nestedItem, K key, DbSession session) { + public void enqueueDelete(Object nestedItem, KEY key, DbSession session) { if (hasIndex()) { - session.enqueue(new DeleteNestedItem( + session.enqueue(new DeleteNestedItem( this.getIndexType(), key, nestedItem)); session.commit(); } } - public void enqueueInsert(Object nestedItem, K key, DbSession session) { + public void enqueueInsert(Object nestedItem, KEY key, DbSession session) { if (hasIndex()) { this.enqueueUpdate(nestedItem, key, session); } @@ -279,28 +288,51 @@ public abstract class BaseDao, K extends Serializable> imple @Override public final void synchronizeAfter(final DbSession session, Date date) { - for (E dto : this.findAfterDate(session, date)) { - session.enqueue(new UpsertDto(getIndexType(), dto, true)); + + ResultHandler synchronizeDtos = new ResultHandler() { + @Override + public void handleResult(ResultContext resultContext) { + DTO dto = (DTO) resultContext.getResultObject(); + System.out.println("dto = " + dto); + session.enqueue(new UpsertDto(getIndexType(), dto, true)); + } + }; + + try { + Map params = newHashMap(); + params.put("date", new Timestamp(date.getTime())); + session.select(getSynchronizeStatementFQN(), params, synchronizeDtos); + } catch (Exception e) { + throw new IllegalStateException(e); } session.commit(); } + @VisibleForTesting + public final List findAfterDate(final DbSession session, Date date) { + return session.selectList(getSynchronizeStatementFQN(), new Timestamp(date.getTime())); + } + + private String getSynchronizeStatementFQN() { + return mapperClass.getName() + "." + this.getSynchronizationStatementName(); + } + @CheckForNull - protected abstract E doGetNullableByKey(DbSession session, K key); + protected abstract DTO doGetNullableByKey(DbSession session, KEY key); - protected Iterable findAfterDate(final DbSession session, Date date) { - throw notImplemented(this); + protected String getSynchronizationStatementName() { + return "selectAfterDate"; } - protected E doInsert(DbSession session, E item) { + protected DTO doInsert(DbSession session, DTO item) { throw notImplemented(this); } - protected E doUpdate(DbSession session, E item) { + protected DTO doUpdate(DbSession session, DTO item) { throw notImplemented(this); } - protected void doDeleteByKey(DbSession session, K key) { + protected void doDeleteByKey(DbSession session, KEY key) { throw notImplemented(this); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java index 24ae9bf7d31..a4d8c40ac5b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java @@ -29,8 +29,6 @@ import org.sonar.core.persistence.DbSession; import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; -import java.util.Date; - public class IssueAuthorizationDao extends BaseDao implements DaoComponent { public IssueAuthorizationDao() { @@ -63,10 +61,5 @@ public class IssueAuthorizationDao extends BaseDao findAfterDate(DbSession session, Date date) { - // TODO ? - // return mapper(session).selectAfterDate(new Timestamp(date.getTime())); - return null; - } + // TODO DO not forget to implement "selectAfterDate" In xml mapping file. } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java index 390e39d49b8..1354d41ee47 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java @@ -29,9 +29,6 @@ import org.sonar.core.persistence.DbSession; import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; -import java.sql.Timestamp; -import java.util.Date; - public class IssueDao extends BaseDao implements DaoComponent { public IssueDao() { @@ -63,7 +60,7 @@ public class IssueDao extends BaseDao implements } @Override - protected Iterable findAfterDate(DbSession session, Date date) { - return mapper(session).selectAfterDate(new Timestamp(date.getTime())); + protected String getSynchronizationStatementName() { + return "selectAfterDate"; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/db/ActiveRuleDao.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/db/ActiveRuleDao.java index 1cd5966e5fb..76994dbf49b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/db/ActiveRuleDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/db/ActiveRuleDao.java @@ -36,8 +36,6 @@ import org.sonar.server.rule.db.RuleDao; import org.sonar.server.search.IndexDefinition; import javax.annotation.CheckForNull; -import java.sql.Timestamp; -import java.util.Date; import java.util.List; public class ActiveRuleDao extends BaseDao { @@ -117,11 +115,6 @@ public class ActiveRuleDao extends BaseDao findAfterDate(DbSession session, Date date) { - return mapper(session).selectAfterDate(new Timestamp(date.getTime())); - } - /** * Finder methods for Rules */ diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/db/RuleDao.java b/server/sonar-server/src/main/java/org/sonar/server/rule/db/RuleDao.java index 0e7b19a4ca5..101659f898e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/db/RuleDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/db/RuleDao.java @@ -31,8 +31,6 @@ import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; import javax.annotation.CheckForNull; -import java.sql.Timestamp; -import java.util.Date; import java.util.List; public class RuleDao extends BaseDao { @@ -72,11 +70,6 @@ public class RuleDao extends BaseDao { throw new UnsupportedOperationException("Rules cannot be deleted"); } - @Override - protected Iterable findAfterDate(DbSession session, Date date) { - return mapper(session).selectAfterDate(new Timestamp(date.getTime())); - } - /** * @deprecated use keys. */ -- 2.39.5