diff --git a/cat-core/src/test/resources/com/dianping/cat/abtest/spi/internal/abtest.xml b/cat-core/src/test/resources/com/dianping/cat/abtest/spi/internal/abtest.xml
index fc5a91702b93839855210e65465669cfa44d5da5..658a55965e038806014a3cbf1be7a6ce8ab8c4d7 100644
--- a/cat-core/src/test/resources/com/dianping/cat/abtest/spi/internal/abtest.xml
+++ b/cat-core/src/test/resources/com/dianping/cat/abtest/spi/internal/abtest.xml
@@ -16,5 +16,5 @@
-
+
\ No newline at end of file
diff --git a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java
index baa0a9781b66d61b3b8b0387c0d19514d2a258cb..16382490b5e98c1afe4451822f5e53abdab70901 100644
--- a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java
+++ b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java
@@ -22,9 +22,6 @@ final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator {
defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.home.dal.abtest._INDEX.getEntityClasses());
defineDaoComponents(all, com.dianping.cat.home.dal.abtest._INDEX.getDaoClasses());
- defineSimpleTableProviderComponents(all, "cat", com.dainping.cat.consumer.dal.report._INDEX.getEntityClasses());
- defineDaoComponents(all, com.dainping.cat.consumer.dal.report._INDEX.getDaoClasses());
-
return all;
}
}
diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
index 9422a3c383998480124136a3640ccd3de33495cd..93f5ac1fda75e3e226f26735fd5a02b0d2a2b08e 100755
--- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
+++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java
@@ -16,7 +16,6 @@ import com.dainping.cat.consumer.dal.report.ReportDao;
import com.dainping.cat.consumer.dal.report.TaskDao;
import com.dianping.cat.CatHomeModule;
import com.dianping.cat.configuration.ServerConfigManager;
-import com.dianping.cat.home.dal.abtest.AbtestDao;
import com.dianping.cat.home.dal.report.DailygraphDao;
import com.dianping.cat.home.dal.report.DailyreportDao;
import com.dianping.cat.home.dal.report.GraphDao;
@@ -208,7 +207,6 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
// for alarm module
all.addAll(new AlarmComponentConfigurator().defineComponents());
- // for abtest module
return all;
}
}
diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/ABTestReport.java b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/ABTestReport.java
index 164e7b0251809fc60c85996eb297fbe10a428252..ae7590b9cefd298905d14f6cf4766095c8e2e4a7 100644
--- a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/ABTestReport.java
+++ b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/ABTestReport.java
@@ -4,39 +4,48 @@ import java.util.Date;
import java.util.Map;
import com.dianping.cat.home.dal.abtest.Abtest;
+import com.dianping.cat.home.dal.abtest.AbtestRun;
public class ABTestReport {
private Abtest m_entity;
+
+ private AbtestRun m_run;
private AbtestStatus m_status;
private Map m_items;
- public ABTestReport(Abtest entity) {
+ public ABTestReport(Abtest entity, AbtestRun run) {
m_entity = entity;
+ m_run = run;
}
- public ABTestReport(Abtest entity, Date now) {
+ public ABTestReport(Abtest entity, AbtestRun run, Date now) {
m_entity = entity;
+ m_run = run;
setStatus(now);
// TODO m_items setting
}
private void setStatus(Date now) {
- m_status = AbtestStatus.calculateStatus(m_entity, now);
+ m_status = AbtestStatus.calculateStatus(m_run, now);
}
public Abtest getEntity() {
return m_entity;
}
+
+ public AbtestRun getRun() {
+ return m_run;
+ }
public void setStatus(AbtestStatus status) {
m_status = status;
}
public AbtestStatus getStatus() {
- return m_status;
+ return m_status;
}
public Map getItems() {
diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/AbtestStatus.java b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/AbtestStatus.java
index f097ccd71e92f840ac17c8d328344c1b29c8d9c0..10e4730d0ada146f3cf771d41cf83e8abe8c7830 100644
--- a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/AbtestStatus.java
+++ b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/AbtestStatus.java
@@ -3,7 +3,7 @@ package com.dianping.cat.system.page.abtest;
import java.util.Calendar;
import java.util.Date;
-import com.dianping.cat.home.dal.abtest.Abtest;
+import com.dianping.cat.home.dal.abtest.AbtestRun;
public enum AbtestStatus {
@@ -23,12 +23,12 @@ public enum AbtestStatus {
return defaultStatus;
}
- public static AbtestStatus calculateStatus(Abtest abtest, Date now) {
- if (abtest.isDisabled()) {
+ public static AbtestStatus calculateStatus(AbtestRun run, Date now) {
+ if (run.isDisabled()) {
return AbtestStatus.SUSPENDED;
} else {
- Date startDate = abtest.getStartDate();
- Date endDate = abtest.getEndDate();
+ Date startDate = run.getStartDate();
+ Date endDate = run.getEndDate();
if (startDate != null) {
calendar.setTime(startDate);
diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/Handler.java
index b276cb26ee421f3462c8f72ed1819c5c3632ee64..27070fe657ce8de1a694915c28e1e101256016b7 100644
--- a/cat-home/src/main/java/com/dianping/cat/system/page/abtest/Handler.java
+++ b/cat-home/src/main/java/com/dianping/cat/system/page/abtest/Handler.java
@@ -27,6 +27,9 @@ import com.dianping.cat.Cat;
import com.dianping.cat.home.dal.abtest.Abtest;
import com.dianping.cat.home.dal.abtest.AbtestDao;
import com.dianping.cat.home.dal.abtest.AbtestEntity;
+import com.dianping.cat.home.dal.abtest.AbtestRun;
+import com.dianping.cat.home.dal.abtest.AbtestRunDao;
+import com.dianping.cat.home.dal.abtest.AbtestRunEntity;
import com.dianping.cat.home.dal.abtest.GroupStrategy;
import com.dianping.cat.home.dal.abtest.GroupStrategyDao;
import com.dianping.cat.home.dal.abtest.GroupStrategyEntity;
@@ -46,6 +49,9 @@ public class Handler implements PageHandler, LogEnabled {
@Inject
private AbtestDao m_abtestDao;
+ @Inject
+ private AbtestRunDao m_abtestRunDao;
+
@Inject
private ProjectDao m_projectDao;
@@ -66,13 +72,19 @@ public class Handler implements PageHandler, LogEnabled {
if (ctx.getHttpServletRequest().getMethod().equalsIgnoreCase("post")) {
if (action == Action.CREATE) {
Abtest abtest = new Abtest();
+
+ // TODO need more parameters for abtest
abtest.setName(payload.getName());
abtest.setDescription(payload.getDescription());
- abtest.setStartDate(payload.getStartDate());
- abtest.setEndDate(payload.getEndDate());
+ abtest.setGroupStrategy(payload.getStrategyId());
abtest.setDomains(StringUtils.join(payload.getDomains(), ','));
- abtest.setStrategyId(payload.getStrategyId());
- abtest.setStrategyConfig(payload.getStrategyConfig().getBytes(CHARSET));
+
+ AbtestRun run = new AbtestRun();
+
+ run.setStartDate(payload.getStartDate());
+ run.setEndDate(payload.getEndDate());
+ run.setDomains(StringUtils.join(payload.getDomains(), ','));
+ run.setStrategyConfiguration(payload.getStrategyConfig());
try {
m_abtestDao.insert(abtest);
} catch (DalException e) {
@@ -81,14 +93,19 @@ public class Handler implements PageHandler, LogEnabled {
}
} else if (action == Action.DETAIL) {
Abtest abtest = new Abtest();
+
abtest.setKeyId(payload.getId());
abtest.setName(payload.getName());
abtest.setDescription(payload.getDescription());
- abtest.setStartDate(payload.getStartDate());
- abtest.setEndDate(payload.getEndDate());
abtest.setDomains(StringUtils.join(payload.getDomains(), ','));
- abtest.setStrategyId(payload.getStrategyId());
- abtest.setStrategyConfig(payload.getStrategyConfig().getBytes(CHARSET));
+
+ AbtestRun run = new AbtestRun();
+
+ run.setStartDate(payload.getStartDate());
+ run.setEndDate(payload.getEndDate());
+ run.setDomains(StringUtils.join(payload.getDomains(), ','));
+ run.setStrategyConfiguration(payload.getStrategyConfig());
+
try {
m_abtestDao.updateByPK(abtest, AbtestEntity.UPDATESET_FULL);
} catch (DalException e) {
@@ -112,20 +129,20 @@ public class Handler implements PageHandler, LogEnabled {
for (String id : ids) {
System.out.println("change status for " + id);
try {
- int intID = Integer.parseInt(id);
- Abtest abtest = m_abtestDao.findByPK(intID, AbtestEntity.READSET_FULL);
+ int runID = Integer.parseInt(id);
+ AbtestRun run = m_abtestRunDao.findByPK(runID, AbtestRunEntity.READSET_FULL);
if (payload.getDisableAbtest() == -1) { // suspend
- if (!abtest.isDisabled()) {
- abtest.setDisabled(true);
- m_abtestDao.updateByPK(abtest, AbtestEntity.UPDATESET_DISABLE);
+ if (!run.isDisabled()) {
+ run.setDisabled(true);
+ m_abtestRunDao.updateByPK(run, AbtestRunEntity.UPDATESET_STATUS);
} else {
error.addArgument(id, "Abtest " + id + " has been already suspended!");
}
} else if (payload.getDisableAbtest() == 1) { // resume
- if (abtest.isDisabled()) {
- abtest.setDisabled(false);
- m_abtestDao.updateByPK(abtest, AbtestEntity.UPDATESET_DISABLE);
+ if (run.isDisabled()) {
+ run.setDisabled(false);
+ m_abtestRunDao.updateByPK(run, AbtestRunEntity.UPDATESET_STATUS);
} else {
error.addArgument(id, "Abtest " + id + " has been already active!");
}
@@ -189,36 +206,48 @@ public class Handler implements PageHandler, LogEnabled {
Date now = new Date();
try {
- entities = m_abtestDao.findAllAbtest(AbtestEntity.READSET_FULL);
+ entities = m_abtestDao.findAll(AbtestEntity.READSET_FULL);
} catch (DalException e) {
Cat.logError(e);
}
- List filterTests = new ArrayList();
+ List filterReports = new ArrayList();
+ List totalReports = new ArrayList();
int createdCount = 0, readyCount = 0, runningCount = 0, terminatedCount = 0, suspendedCount = 0;
for (Abtest abtest : entities) {
- ABTestReport report = new ABTestReport(abtest, now);
-
- if (status != null && report.getStatus() == status) {
- filterTests.add(abtest);
+ List runs = new ArrayList();
+ try {
+ runs = m_abtestRunDao.findByCaseId(abtest.getId(), AbtestRunEntity.READSET_FULL);
+ } catch (DalException e) {
+ Cat.logError(e);
}
- switch (report.getStatus()) {
- case CREATED:
- createdCount++;
- break;
- case READY:
- readyCount++;
- break;
- case RUNNING:
- runningCount++;
- break;
- case TERMINATED:
- terminatedCount++;
- break;
- case SUSPENDED:
- suspendedCount++;
- break;
+
+ for(AbtestRun run : runs){
+ ABTestReport report = new ABTestReport(abtest,run, now);
+
+ totalReports.add(report);
+ if (status != null && report.getStatus() == status) {
+ filterReports.add(report);
+ }
+
+ switch (report.getStatus()) {
+ case CREATED:
+ createdCount++;
+ break;
+ case READY:
+ readyCount++;
+ break;
+ case RUNNING:
+ runningCount++;
+ break;
+ case TERMINATED:
+ terminatedCount++;
+ break;
+ case SUSPENDED:
+ suspendedCount++;
+ break;
+ }
}
}
@@ -227,11 +256,12 @@ public class Handler implements PageHandler, LogEnabled {
model.setRunningCount(runningCount);
model.setTerminatedCount(terminatedCount);
model.setSuspendedCount(suspendedCount);
+
if (status != null) {
- entities = filterTests;
+ totalReports = filterReports;
}
- int totalSize = entities.size();
+ int totalSize = totalReports.size();
int totalPages = totalSize % m_pageSize == 0 ? (totalSize / m_pageSize) : (totalSize / m_pageSize + 1);
// safe guarder for pageNum
@@ -248,7 +278,7 @@ public class Handler implements PageHandler, LogEnabled {
int fromIndex = (payload.getPageNum() - 1) * m_pageSize;
int toIndex = (fromIndex + m_pageSize) <= totalSize ? (fromIndex + m_pageSize) : totalSize;
for (int i = fromIndex; i < toIndex; i++) {
- reports.add(new ABTestReport(entities.get(i), now));
+ reports.add(totalReports.get(i));
}
model.setTotalPages(totalPages);
@@ -258,7 +288,7 @@ public class Handler implements PageHandler, LogEnabled {
private List getAllGroupStrategys() {
try {
- return m_groupStrategyDao.findAllGroupStrategy(GroupStrategyEntity.READSET_FULL);
+ return m_groupStrategyDao.findAllByStatus(1, GroupStrategyEntity.READSET_FULL);
} catch (DalException e) {
m_logger.error(e.getMessage(), e);
Cat.logError(e);
diff --git a/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-codegen.xml b/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-codegen.xml
index 0cd2a37dfaeb6cdcd6b1d56552eee076d82b01a5..7f4dbaf48a1453ccbc2c9559a0b787b3ab06dba2 100644
--- a/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-codegen.xml
+++ b/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-codegen.xml
@@ -1,17 +1,56 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FROM
+ WHERE = ${key-id}]]>
+
+
+ ()
+ VALUES()]]>
+
+
+
+
+ SET
+ WHERE = ${key-id}]]>
+
+
+
+
+ WHERE = ${key-id}]]>
+
+
+
+
+
+
-
-
-
+
-
+
@@ -44,11 +83,13 @@
-
+
-
+
+
+
diff --git a/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-dal.xml b/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-dal.xml
index b34b50845ac7ada6f86be8af7dd61c8db35e97db..353a11e642cdeea7cb8c97f046db1efbb75658cf 100644
--- a/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-dal.xml
+++ b/cat-home/src/main/resources/META-INF/dal/jdbc/abtest-dal.xml
@@ -2,32 +2,50 @@
-
+
+
+
+
+ FROM ORDER BY DESC
+ ]]>
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
+
- FROM ORDER BY DESC
+ FROM
+ WHERE = ${case-id}
]]>
-
-
-
-
+
+
+
+
- FROM ORDER BY
+ FROM
+ WHERE = ${status}
]]>
-
-
-
+
+
+
diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml
index 801e4ef83675b739dc721bb37ac3da2e48f6d85e..24e608b0315d62bdeb8975a90bc89576e5d61aa9 100644
--- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml
+++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml
@@ -26,7 +26,8 @@
-
+
+
diff --git a/cat-home/src/main/webapp/js/abtestAllTest.js b/cat-home/src/main/webapp/js/abtestAllTest.js
index 9d34077bba5e17b1f40c09afa57691318b172c1f..c98b1b10308e7949b34f56fdd37df3e3fd890d2e 100644
--- a/cat-home/src/main/webapp/js/abtestAllTest.js
+++ b/cat-home/src/main/webapp/js/abtestAllTest.js
@@ -18,13 +18,7 @@ $(document)
var checkbox = $(".table input[type='checkbox']:checked");
var id = "";
for ( var i = 0; i < checkbox.length; i++) {
- id = id
- + $(
- ":nth-child(2)",
- $(checkbox[i])
- .closest(
- 'tr'))
- .html() + "-";
+ id = id + $(":nth-child(2)",$(checkbox[i]).closest('tr')).html() + "-";
}
url = window.location.href;
index = url.indexOf("&suspend");
@@ -33,7 +27,7 @@ $(document)
.substring(0, index)
+ "&suspend=-1&ids=" + id;
} else {
- if(url.indexOf("?") == -1){
+ if (url.indexOf("?") == -1) {
url = url + '?';
}
window.location.href = url
@@ -48,13 +42,7 @@ $(document)
var checkbox = $(".table input[type='checkbox']:checked");
var id = "";
for ( var i = 0; i < checkbox.length; i++) {
- id = id
- + $(
- ":nth-child(2)",
- $(checkbox[i])
- .closest(
- 'tr'))
- .html() + "-";
+ id = id + $(":nth-child(2)",$(checkbox[i]).closest('tr')).html() + "-";
}
url = window.location.href;
index = url.indexOf("&suspend");
diff --git a/cat-home/src/main/webapp/jsp/system/abtestAllTest.jsp b/cat-home/src/main/webapp/jsp/system/abtestAllTest.jsp
index ee9e9f1e675c364ff0eaacbbd6ca90ce98c0d42b..770dc48e94e98d633fa290579d3eac094116c71f 100644
--- a/cat-home/src/main/webapp/jsp/system/abtestAllTest.jsp
+++ b/cat-home/src/main/webapp/jsp/system/abtestAllTest.jsp
@@ -170,7 +170,7 @@
|
- ${item.entity.id} |
+ ${item.run.id} |
${item.entity.name} |
1000 |
10% |
diff --git a/script/Cat.sql b/script/Cat.sql
index bed32d703b25ab2030f2dd1d24c09f408695e399..6b274e72b82f28839bbef31a484591fd8e32dd07 100644
--- a/script/Cat.sql
+++ b/script/Cat.sql
@@ -245,29 +245,43 @@ CREATE TABLE `project` (
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='项目基本信息';
-CREATE TABLE `groupStrategy` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(45) NOT NULL COMMENT 'GroupStrategy的名字',
- `alias` varchar(45) NOT NULL COMMENT 'GroupStrategy的英文名',
- `className` varchar(45) NOT NULL COMMENT 'GroupStrategy的class名字',
- `description` varchar(45) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
-
-CREATE TABLE `abtest` (
- `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `name` varchar(45) NOT NULL COMMENT 'abtest的名字',
- `start_date` datetime DEFAULT NULL COMMENT '开始时间',
- `end_date` datetime DEFAULT NULL COMMENT '结束时间',
- `disabled` tinyint(4) NOT NULL COMMENT '是否有效',
- `domains` varchar(100) NOT NULL COMMENT '属于的domain,用分号分割',
- `strategy_id` int(11) NOT NULL COMMENT '分组策略ID',
- `strategy_config` blob COMMENT '策略配置',
- `description` varchar(100) DEFAULT NULL COMMENT '实验描述',
- `creation_date` datetime NOT NULL COMMENT '创建时间',
- `modify_date` datetime DEFAULT NULL COMMENT '修改时间',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8$$
+CREATE TABLE `abtest` (
+ `id` int(11) NOT NULL COMMENT 'ID',
+ `name` varchar(45) NOT NULL COMMENT '名字',
+ `owner` varchar(45) NOT NULL COMMENT 'case的Owner',
+ `group_strategy` int(11) DEFAULT NULL COMMENT '分组策略ID',
+ `domains` varchar(200) DEFAULT NULL COMMENT 'Domains,分号分割',
+ `creation_date` datetime DEFAULT NULL COMMENT '创建时间',
+ `modified_date` datetime DEFAULT NULL COMMENT '上次修改时间',
+ `description` varchar(512) DEFAULT NULL COMMENT '描述',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8
+
+CREATE TABLE `abtest_run` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `case_id` int(11) NOT NULL,
+ `start_date` datetime DEFAULT NULL COMMENT '开始时间',
+ `end_date` datetime DEFAULT NULL COMMENT '结束时间',
+ `disabled` tinyint(4) NOT NULL COMMENT '是否有效',
+ `domains` varchar(100) NOT NULL COMMENT '属于的domain,用分号分割',
+ `strategy_configuration` varchar(1024) DEFAULT NULL COMMENT '策略配置',
+ `creation_date` datetime NOT NULL COMMENT '创建时间',
+ `modified_date` datetime NOT NULL COMMENT '上次修改时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8
+
+CREATE TABLE `group_strategy` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` varchar(45) NOT NULL COMMENT 'GroupStrategy的名字',
+ `alias` varchar(45) NOT NULL COMMENT 'GroupStrategy的英文名',
+ `classname` varchar(45) NOT NULL COMMENT 'GroupStrategy的class名字',
+ `configuration` varchar(512) DEFAULT NULL COMMENT '配置的schema',
+ `status` tinyint(4) NOT NULL COMMENT '是否开/关',
+ `description` varchar(45) DEFAULT NULL COMMENT '描述',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8
+
+