package nebula.data.db; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.text.html.InlineView; import nebula.lang.Field; import nebula.lang.Reference; import nebula.lang.Type; public class DBSqlBuilder { final DbConfiguration config; public DBSqlBuilder(final DbConfiguration config, Type type) { this.config = config; } public List<DBTable> makeMapping(Type type) { List<DBTable> tables = new ArrayList<DBTable>(); DBTable mainTable = new DBTable(type.getName()); tables.add(mainTable); for (Field of : type.getFields()) { // if (of.isTransient()) continue; if (!of.isArray()) { // 一般类型,非列表 switch (of.getRefer()) { case ByVal: // 最基本类型// Type A1 /*************************************************************************************************/ n("基本", of.getName(), of.getType().getName()); mainTable.add(of.getName(), of.getName()); /* ########################################################### */ break; case Inline: // 嵌入,展开全部 for (Field in1f : of.getType().getFields()) { // if (in1f.isTransient()) continue;// Skip when is Transient if (!in1f.isArray()) {// 展开全部项 switch (in1f.getRefer()) { case ByVal: // Type B1 嵌入基本类型 /*************************************************************************************************/ n("嵌入->基本", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName()); mainTable.add(ns(of.getName(), in1f.getName()), ns(of.getName(), in1f.getName())); /* ########################################################### */ break; case Inline: // Type B2 嵌入的嵌入 if (in1f.getRefer() == Reference.Inline) {// TODO 共同同一个表 for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal) { // Type C1 /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->嵌入->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } } else { // 单独Table for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal) { // Type C1 /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->嵌入->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } } break; case ByRef: // Type B3 case Cascade: // Type B4 for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal && (in2f.isKey() || in2f.isCore())) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->引用->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f .getType().getName()); /* ########################################################### */ } } break; } } else { switch (in1f.getRefer()) { case ByVal: // Type B5 /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName()), ns(of.getName(), in1f.getName())); n("嵌入->基本(列表)", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName()); /* ########################################################### */ break; case Inline: // Type B6 if (in1f.getRefer() == Reference.Inline) {// TODO // 共同同一个表 for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal) { // Type C1 D1 /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->嵌入对象(列表)->基本", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } } else { // 单独Table for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal) { // Type C1 D1 /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->嵌入对象(列表)->基本", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } } break; case ByRef: // Type B7 case Cascade: // Type B8 for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal && (in2f.isKey() || in2f.isCore())) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("嵌入->引用->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f .getType().getName()); /* ########################################################### */ } } } } } break; case ByRef: // Type A3 case Cascade: // Type A4 for (Field in1f : of.getType().getFields()) { if (!in1f.isArray() && in1f.getRefer() == Reference.ByVal && (in1f.isKey() || in1f.isCore())) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName()), ns(of.getName(), in1f.getName())); n("引用->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName()); /* ########################################################### */ } } break; } } else {// 数组不可以是Key switch (of.getRefer()) { case ByVal: // Basic Type Field // Type A5 /*************************************************************************************************/ n("列表.基本", of.getName(), of.getType().getName()); mainTable.add(of.getName(), of.getName()); break; case Inline: // inline object // Type A6 for (Field in1f : of.getType().getFields()) { // if (in1f.isTransient()) continue;// Skip when is Transient if (!in1f.isArray()) { switch (in1f.getRefer()) { case ByVal: // Type E1 /*************************************************************************************************/ n("列表-嵌入->基本", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName()); mainTable.add(ns(of.getName(), in1f.getName()), ns(of.getName(), in1f.getName())); /* ########################################################### */ break; case Inline:// Type E2 for (Field in2f : in1f.getType().getFields()) { // if (in2f.isTransient()) continue;// Skip when is Transient if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("列表-嵌入->嵌入 ->基本字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } break; case ByRef:// Type E3 case Cascade:// Type E4 for (Field in2f : in1f.getType().getFields()) { if (!in2f.isArray() && in2f.getRefer() == Reference.ByVal && (in2f.isKey() || in2f.isCore())) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in2f.getName()), ns(of.getName(), in1f.getName(), in2f.getName())); n("列表-嵌入->引用->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName(), in2f.getName(), in2f.getType().getName()); /* ########################################################### */ } } break; } } } break; case ByRef: case Cascade: for (Field in1f : of.getType().getFields()) { if (!in1f.isArray() && in1f.getRefer() == Reference.ByVal && (in1f.isKey() || in1f.isCore())) { /*************************************************************************************************/ mainTable.add(ns(of.getName(), in1f.getName(), in1f.getName()), ns(of.getName(), in1f.getName())); n("列表-引用->关键字段", of.getName(), of.getType().getName(), in1f.getName(), in1f.getType().getName()); /* ########################################################### */ } } } } } return tables; } private String ns(String... names) { StringBuilder sb = new StringBuilder(); sb.append(names[0]); for (int i = 1; i < names.length; i++) { sb.append("_"); sb.append(names[i]); } return sb.toString(); } private void n(String... argv) { StringBuilder sb = new StringBuilder(); sb.append(argv[0]); for (int i = 1; i < argv.length; i += 2) { sb.append(" - "); sb.append(argv[i]); sb.append('('); sb.append(argv[i + 1]); sb.append(')'); } System.out.println(sb); } }