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 linkTables = metaService.getMetaLinks();//表关联条件 Map attachTable = metaService.getTables();//用到的关联表 List shows = metaService.getShows();//查询的属性 //查询条件 List filters = fBean.getFilters(); Limit limit = fBean.getLimit(); List 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()); } }