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 @@ - + 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 + +