.
This commit is contained in:
118
src/main/java/net/tccn/dbq/fbean/ParseMysql.java
Normal file
118
src/main/java/net/tccn/dbq/fbean/ParseMysql.java
Normal file
@@ -0,0 +1,118 @@
|
||||
package net.tccn.dbq.fbean;
|
||||
|
||||
import net.tccn.meta.MetaKit;
|
||||
import net.tccn.meta.MetaLink;
|
||||
import net.tccn.meta.MetaService;
|
||||
import net.tccn.meta.MetaTable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2018/12/24 15:49.
|
||||
*/
|
||||
public class ParseMysql implements Parser {
|
||||
|
||||
private Predicate isEmpty = (x) -> {
|
||||
if (x == null)
|
||||
return true;
|
||||
if (x instanceof List)
|
||||
return ((List) x).isEmpty();
|
||||
if (x instanceof String)
|
||||
return ((String) x).isEmpty();
|
||||
if (x instanceof Map)
|
||||
return ((Map) x).isEmpty();
|
||||
if (x instanceof Collection)
|
||||
return ((Collection) x).isEmpty();
|
||||
return false;
|
||||
};
|
||||
|
||||
@Override
|
||||
public String parse(FBean fBean) {
|
||||
MetaService metaService = MetaKit.metaService(fBean.getName());
|
||||
|
||||
//基础属性
|
||||
MetaTable metaTable = metaService.getMetaTable();//基础元数据
|
||||
List<MetaLink> linkTables = metaService.getMetaLinks();//表关联条件
|
||||
Map<String, MetaTable> attachTable = metaService.getTables();//用到的关联表
|
||||
List<String> shows = metaService.getShows();//查询的属性
|
||||
|
||||
//查询条件
|
||||
List<Filter> filters = fBean.getFilters();
|
||||
Limit limit = fBean.getLimit();
|
||||
List<Order> orders = fBean.getOrders();
|
||||
|
||||
StringBuilder buf = new StringBuilder();
|
||||
//select
|
||||
buf.append("select ");
|
||||
if (!isEmpty.test(shows)) {
|
||||
shows.forEach(x -> {
|
||||
//buf.append("`").append("x").append("`").append(",");
|
||||
buf.append(x).append(",");
|
||||
});
|
||||
buf.deleteCharAt(buf.length() - 1);
|
||||
} else {
|
||||
buf.append("*");
|
||||
}
|
||||
|
||||
//from
|
||||
buf.append(" from ").append("`").append(metaTable.getName()).append("` ").append(metaTable.getAlias());
|
||||
|
||||
//left join
|
||||
if (!isEmpty.test(linkTables)) {
|
||||
linkTables.forEach(x -> {
|
||||
MetaTable leftTable = attachTable.get(metaTable.getAlias().equals(x.getTables()[0]) ? x.getTables()[1] : x.getTables()[0]);
|
||||
|
||||
buf.append(" left join ").append(leftTable.getName()).append(" ").append(leftTable.getAlias()).append(" on ");
|
||||
int tag = buf.length();
|
||||
x.getLink().forEach((k,v) -> {
|
||||
if (buf.length() > tag) {
|
||||
buf.append(" and ");
|
||||
}
|
||||
buf.append(k).append("=").append(v);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//where
|
||||
if (!isEmpty.test(filters)) {
|
||||
buf.append(Filter.filter(filters, DbType.MYSQL));
|
||||
}
|
||||
|
||||
//order by
|
||||
if (!isEmpty.test(orders)) {
|
||||
buf.append(" ").append(Order.order(orders, DbType.MYSQL));
|
||||
}
|
||||
|
||||
//limit
|
||||
buf.append(" ").append(limit.limit());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String parse(Filter filter) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String parseSave(MetaService ms, Map data) {
|
||||
String sqlTpl = "insert %s (%s) value (%s)";
|
||||
StringBuilder bufK = new StringBuilder();
|
||||
StringBuilder bufV = new StringBuilder();
|
||||
data.forEach((k,v) -> {
|
||||
if (v != null || !String.valueOf(v).isEmpty()) {
|
||||
bufK.append("`").append(k).append("`,");
|
||||
if (v instanceof Number) {
|
||||
bufV.append(v).append(",");
|
||||
} else {
|
||||
bufV.append("'").append(v).append("',");
|
||||
}
|
||||
}
|
||||
});
|
||||
bufK.deleteCharAt(bufK.length() - 1);
|
||||
bufV.deleteCharAt(bufV.length() - 1);
|
||||
return String.format(sqlTpl, ms.getMetaTable().getName(), bufK.toString(), bufV.toString());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user