This commit is contained in:
2019-03-07 10:24:29 +08:00
parent 6c8c683c31
commit e057d613b9
215 changed files with 70917 additions and 118 deletions

View 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());
}
}