package com.github.ltsopensource.admin.access.memory;
import com.github.ltsopensource.admin.access.RshHandler;
import com.github.ltsopensource.admin.request.NodePaginationReq;
import com.github.ltsopensource.admin.response.PaginationRsp;
import com.github.ltsopensource.core.cluster.Node;
import com.github.ltsopensource.core.cluster.NodeType;
import com.github.ltsopensource.core.commons.utils.CharacterUtils;
import com.github.ltsopensource.core.commons.utils.CollectionUtils;
import com.github.ltsopensource.core.commons.utils.StringUtils;
import com.github.ltsopensource.core.logger.Logger;
import com.github.ltsopensource.core.logger.LoggerFactory;
import com.github.ltsopensource.store.jdbc.builder.*;
import com.github.ltsopensource.store.jdbc.dbutils.JdbcTypeUtils;
import java.util.List;
/**
* @author Robert HG (254963746@qq.com) on 6/6/15.
*/
public class NodeMemCacheAccess extends MemoryAccess {
private static final Logger LOGGER = LoggerFactory.getLogger(NodeMemCacheAccess.class);
public NodeMemCacheAccess() {
createTable(readSqlFile("sql/h2/lts_node.sql"));
}
private String getTableName() {
return "lts_node";
}
public void addNode(List<Node> nodes) {
for (Node node : nodes) {
try {
NodePaginationReq request = new NodePaginationReq();
request.setIdentity(node.getIdentity());
List<Node> existNodes = search(request);
if (CollectionUtils.isNotEmpty(existNodes)) {
// 如果存在,那么先删除
removeNode(existNodes);
}
new InsertSql(getSqlTemplate())
.insert(getTableName())
.columns("identity",
"available",
"cluster_name",
"node_type",
"ip",
"port",
"node_group",
"create_time",
"threads",
"host_name",
"http_cmd_port"
)
.values(node.getIdentity(),
node.isAvailable() ? 1 : 0,
node.getClusterName(),
node.getNodeType().name(),
node.getIp(),
node.getPort(),
node.getGroup(),
node.getCreateTime(),
node.getThreads(),
node.getHostName(),
node.getHttpCmdPort())
.doInsert();
} catch (Exception e) {
LOGGER.error("Insert {} error!", node, e);
}
}
}
public void clear() {
new DeleteSql(getSqlTemplate())
.delete()
.from()
.table(getTableName())
.doDelete();
}
public void removeNode(List<Node> nodes) {
for (Node node : nodes) {
try {
new DeleteSql(getSqlTemplate())
.delete()
.from()
.table(getTableName())
.where("identity = ?", node.getIdentity())
.doDelete();
} catch (Exception e) {
LOGGER.error("Delete {} error!", node, e);
}
}
}
public Node getNodeByIdentity(String identity) {
return new SelectSql(getSqlTemplate())
.select()
.all()
.from()
.table(getTableName())
.where("identity = ?", identity)
.single(RshHandler.NODE_RSH);
}
public List<Node> getNodeByNodeType(NodeType nodeType) {
NodePaginationReq nodePaginationReq = new NodePaginationReq();
nodePaginationReq.setNodeType(nodeType);
nodePaginationReq.setLimit(Integer.MAX_VALUE);
return search(nodePaginationReq);
}
public List<Node> search(NodePaginationReq request) {
SelectSql selectSql = new SelectSql(getSqlTemplate())
.select()
.all()
.from()
.table(getTableName())
.whereSql(buildWhereSql(request));
if (StringUtils.isNotEmpty(request.getField())) {
selectSql.orderBy()
.column(CharacterUtils.camelCase2Underscore(request.getField()), OrderByType.convert(request.getDirection()));
}
return selectSql.limit(request.getStart(), request.getLimit())
.list(RshHandler.NODE_LIST_RSH);
}
private WhereSql buildWhereSql(NodePaginationReq request) {
return new WhereSql()
.andOnNotEmpty("identity = ?", request.getIdentity())
.andOnNotEmpty("node_group = ?", request.getNodeGroup())
.andOnNotNull("node_type = ?", request.getNodeType() == null ? null : request.getNodeType().name())
.andOnNotEmpty("ip = ?", request.getIp())
.andOnNotNull("available = ?", request.getAvailable())
.andBetween("create_time", JdbcTypeUtils.toTimestamp(request.getStartDate()), JdbcTypeUtils.toTimestamp(request.getEndDate()));
}
public PaginationRsp<Node> pageSelect(NodePaginationReq request) {
PaginationRsp<Node> response = new PaginationRsp<Node>();
Long results = new SelectSql(getSqlTemplate())
.select()
.columns("count(1)")
.from()
.table(getTableName())
.whereSql(buildWhereSql(request))
.single();
response.setResults(results.intValue());
if (results > 0) {
List<Node> nodes = search(request);
response.setRows(nodes);
}
return response;
}
}