提交 d1c24b27 编写于 作者: A ainilife

Refator abtest in cat-home module due to the change of abtest model

上级 60f337ef
......@@ -16,5 +16,5 @@
<run />
</runs>
</case>
<case />
<case/>
</abtest-model>
\ No newline at end of file
......@@ -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;
}
}
......@@ -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;
}
}
......@@ -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<String, String> 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<String, String> getItems() {
......
......@@ -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);
......
......@@ -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<Context>, 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<Context>, 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<Context>, 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<Context>, 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<Context>, 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<Abtest> filterTests = new ArrayList<Abtest>();
List<ABTestReport> filterReports = new ArrayList<ABTestReport>();
List<ABTestReport> totalReports = new ArrayList<ABTestReport>();
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<AbtestRun> runs = new ArrayList<AbtestRun>();
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<Context>, 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<Context>, 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<Context>, LogEnabled {
private List<GroupStrategy> 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);
......
<?xml version="1.0" encoding="UTF-8"?>
<entities>
<entity name="abtest" table="abtest" alias="a">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" />
<member name="name" field="name" value-type="String" length="45" nullable="false" />
<member name="owner" field="owner" value-type="String" length="45" nullable="false" />
<member name="group-strategy" field="group_strategy" value-type="int" length="10" />
<member name="domains" field="domains" value-type="String" length="200" />
<member name="creation-date" field="creation_date" value-type="Date" />
<member name="modified-date" field="modified_date" value-type="Date" />
<member name="description" field="description" value-type="String" length="512" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<readsets>
<readset name="FULL" all="true" />
</readsets>
<updatesets>
<updateset name="FULL" all="true" />
</updatesets>
<query-defs>
<query name="find-by-PK" type="SELECT">
<param name="key-id" />
<statement><![CDATA[SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="insert" type="INSERT">
<statement><![CDATA[INSERT INTO <TABLE/>(<FIELDS/>)
VALUES(<VALUES/>)]]></statement>
</query>
<query name="update-by-PK" type="UPDATE">
<param name="key-id" />
<statement><![CDATA[UPDATE <TABLE/>
SET <FIELDS/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
<query name="delete-by-PK" type="DELETE">
<param name="key-id" />
<statement><![CDATA[DELETE FROM <TABLE/>
WHERE <FIELD name='id'/> = ${key-id}]]></statement>
</query>
</query-defs>
</entity>
<entity name="abtest-run" table="abtest_run" alias="ar">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="case-id" field="case_id" value-type="int" length="10" nullable="false" />
<member name="start-date" field="start_date" value-type="Date" />
<member name="end-date" field="end_date" value-type="Date" />
<member name="disabled" field="disabled" value-type="int" length="3" nullable="false" />
<member name="domains" field="domains" value-type="String" length="100" nullable="false" />
<member name="strategy-id" field="strategy_id" value-type="int" length="10" nullable="false" />
<member name="strategy-config" field="strategy_config" value-type="byte[]" length="65535" />
<member name="description" field="description" value-type="String" length="100" />
<member name="strategy-configuration" field="strategy_configuration" value-type="String" length="1024" />
<member name="creation-date" field="creation_date" value-type="Date" nullable="false" />
<member name="modify-date" field="modify_date" value-type="Date" />
<member name="modified-date" field="modified_date" value-type="Date" nullable="false" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
<readsets>
......@@ -44,11 +83,13 @@
</query>
</query-defs>
</entity>
<entity name="group-strategy" table="groupStrategy" alias="g">
<entity name="group-strategy" table="group_strategy" alias="gs">
<member name="id" field="id" value-type="int" length="10" nullable="false" key="true" auto-increment="true" />
<member name="name" field="name" value-type="String" length="45" nullable="false" />
<member name="alias" field="alias" value-type="String" length="45" nullable="false" />
<member name="class-name" field="className" value-type="String" length="45" nullable="false" />
<member name="classname" field="classname" value-type="String" length="45" nullable="false" />
<member name="configuration" field="configuration" value-type="String" length="512" />
<member name="status" field="status" value-type="int" length="3" nullable="false" />
<member name="description" field="description" value-type="String" length="45" />
<var name="key-id" value-type="int" key-member="id" />
<primary-key name="PRIMARY" members="id" />
......
......@@ -2,32 +2,50 @@
<entities do-package="com.dianping.cat.home.dal.abtest" gen="true">
<entity name="abtest" table="abtest" alias="a">
<member name="creation-date" insert-expr="NOW()" />
<member name="modify-date" insert-expr="NOW()" update-expr="NOW()" />
<member name="modified-date" insert-expr="NOW()" update-expr="NOW()" />
<query-defs>
<query name="find-all" type="SELECT" multiple="true">
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/> ORDER BY <FIELD name='creation-date'/> DESC
]]></statement>
</query>
</query-defs>
</entity>
<entity name="abtest-run" table="abtest_run" alias="ar">
<member name="disabled" field="disabled" value-type="boolean" length="3" nullable="false" />
<member name="creation-date" insert-expr="NOW()" />
<member name="modified-date" insert-expr="NOW()" update-expr="NOW()" />
<updatesets>
<updateset name="DISABLE">
<member name="disabled" />
<member name="modify-date" />
</updateset>
</updatesets>
<updateset name="STATUS">
<member name="disabled" field="disabled" value-type="boolean" length="3" nullable="false" />
<member name="modified-date" insert-expr="NOW()" update-expr="NOW()" />
</updateset>
</updatesets>
<query-defs>
<query name="find-all-abtest" type="SELECT" multiple="true">
<query name="find-by-case-id" type="SELECT" multiple="true">
<param name="case-id" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/> ORDER BY <FIELD name='creation-date'/> DESC
FROM <TABLE/>
WHERE <FIELD name='case-id'/> = ${case-id}
]]></statement>
</query>
</query-defs>
</entity>
<entity name="group-strategy" table="groupStrategy" alias="g">
<query-defs>
<query name="find-all-groupStrategy" type="SELECT" multiple="true">
<statement><![CDATA[
<entity name="group-strategy" table="group_strategy" alias="gs">
<query-defs>
<query name="find-all-by-status" type="SELECT" multiple="true">
<param name="status" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/> ORDER BY <FIELD name='id'/>
FROM <TABLE/>
WHERE <FIELD name='status'/> = ${status}
]]></statement>
</query>
</query-defs>
</entity>
</query>
</query-defs>
</entity>
</entities>
......@@ -26,7 +26,8 @@
</group>
<group name="abtest" package="com.dianping.cat.home.dal.abtest">
<table name="abtest"/>
<table name="groupStrategy"/>
<table name="abtest_run"/>
<table name="group_strategy"/>
</group>
</jdbc>
<jdbc package="com.dainping.cat.home.dal" name="user">
......
......@@ -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");
......
......@@ -170,7 +170,7 @@
<c:forEach var="item" items="${model.reports}">
<tr class="middle center rowlink">
<td class="nolink" style="padding-bottom: 8px"><input type="checkbox"/></td>
<td><a href="abtest?op=report&id=${item.entity.id}">${item.entity.id}</a></td>
<td><a href="abtest?op=report&id=${item.run.id}">${item.run.id}</a></td>
<td>${item.entity.name}</td>
<td>1000</td>
<td>10%</td>
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册