package typeimport;
import static typeimport.DBColumnType.Blob;
import static typeimport.DBColumnType.Char;
import static typeimport.DBColumnType.Date;
import static typeimport.DBColumnType.Datetime;
import static typeimport.DBColumnType.Decimal;
import static typeimport.DBColumnType.Long;
import static typeimport.DBColumnType.NVarchar;
import static typeimport.DBColumnType.String;
import static typeimport.DBColumnType.Text;
import static typeimport.DBColumnType.Timestamp;
import static typeimport.DBColumnType.Varchar;
import static typeimport.MatchPattern.EndWithIgnoreCase;
import static typeimport.MatchPattern.EqualsIgnoreCase;
import static typeimport.MatchPattern.IncludeIgnoreCase;
import static typeimport.MatchPattern.StartWithIgnoreCase;
import java.io.IOException;
import java.util.List;
import nebula.lang.TypeStandalone;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ImportHHTDataDefine extends DefaultImporter {
Log log = LogFactory.getLog(getClass());
public static void main(String[] args) throws IOException {
new ImportHHTDataDefine().load();
}
public ImportHHTDataDefine() {
super("hht", true, false);
// ID
when(EqualsIgnoreCase).with("ID").typeOf(Long).then().setTypeName("ID");
when(EndWithIgnoreCase).with("ID").typeOf(Long).then().setTypeName("ID");
// String
when(EqualsIgnoreCase)
.with("Name", "Description", "Comment", "Account", "Regexp", "Title", "Host", "Filename", "TimeZone", "Status", "Url", "Password", "Subject",
"Content", "Summary", "Revision", "Symbol", "Fax").typeOf(String).then().useMatchedNameAsTypeName().useMatchedNameAsFieldName();
when(StartWithIgnoreCase, EndWithIgnoreCase)
.with("Path", "Password", "Description", "FirstName", "FileName", "LastName", "Phone", "Postal", "Title", "Url", "Host", "Name", "Msg", "Info",
"Memo", "Notice", "Symbol", "Help").typeOf(String).then().useMatchedNameAsTypeName();
when(StartWithIgnoreCase, EndWithIgnoreCase).with("EMail", "Name", "Phone", "Postal").typeOf(String).then().useMatchedNameAsTypeName();
when(EndWithIgnoreCase).with("Addr").typeOf(String).then().setTypeName("Address");
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Address").typeOf(String).then().useMatchedNameAsFieldName();
when(StartWithIgnoreCase).with("Message", "Help").typeOf(String).then().useMatchedNameAsTypeName();
when(EndWithIgnoreCase).with("Text").typeOf(Text).then().useMatchedNameAsTypeName();
when(EndWithIgnoreCase)
.with("Value", "GREETING", "TERM", "PREFIX", "SUFFIX", "KEYWORD", "POREFERENCE", "REFERENCE", "REFERRER", "RELEASENO", "TAXINDICATOR",
"DIRECTORY", "CREATEDDATE", "UPDATEDDATE", "DATECOLUMN", "USERID").typeOf(String).then().setTypeName("String");
when(EndWithIgnoreCase)
.with("CREDITCARDNUMBER", "TAXID", "CHECKNO", "ACCOUNTNO", "DOCUMENTNO", "CUSTOMERNO", "CONFIRMATIONNO", "TRXID", "REFERENCENO", "ROUTINGNO",
"SERNO", "RPRODUCTNO", "VERSIONNO", "CODE", "PONUM").typeOf(String).then().setTypeName("Code");
when(EndWithIgnoreCase).with("Note").typeOf(NVarchar).then().setTypeName("Note");
when(StartWithIgnoreCase)
.with("WEBPARAM", "X", "Y", "WHERECLAUSE", "Z", "ARGS", "FOLDER", "CREDITCARDVV", "FOLDER", "PRODUCTATTRIBUTE", "LOOKUPCLIENTID")
.typeOf(String).then().setTypeName("String");
when(EqualsIgnoreCase).with("A_STREET", "A_CITY", "A_STATE", "A_ZIP", "A_IDENT_DL", "A_IDENT_SSN").typeOf(String).then().setTypeName("String");
when(EqualsIgnoreCase).with("UNINSTALL", "A_CITY", "A_STATE", "A_ZIP", "A_IDENT_DL", "A_IDENT_SSN").typeOf(String).then().setTypeName("String");
// HTML
when(EqualsIgnoreCase).with("HEADERLEFT", "HEADERCENTER", "HEADERRIGHT", "FOOTERLEFT", "FOOTERCENTER", "FOOTERRIGHT").typeOf(String).then()
.setTypeName("String");
when(EqualsIgnoreCase, EndWithIgnoreCase)
.with("PROTOCOL", "ACCEPTLANGUAGE", "CONTENTHTML", "LOGIC", "DISPLAYSEQUENCE", "DISPLAYSEQUENCELOCAL", "FORMAT", "WEBSESSION", "USERAGENT",
"SESSION_ID", "SCRIPT", "REQUESTUSER", "REQUESTUSERPW", "REQUESTFOLDER", "REPLY_REMARKS", "REPLY").typeOf(String).then()
.setTypeName("String");
when(EqualsIgnoreCase).with("VALUEMIN", "VALUEMAX", "DISPLAYLOGIC", "DISPLAYSEQUENCE", "DISPLAYSEQUENCELOCAL", "CALLOUT").typeOf(String).then()
.setTypeName("String");
// SQL
when(EndWithIgnoreCase).with("CLAUSE", "SQL").typeOf(String).then().setTypeName("String");
when(EndWithIgnoreCase).with("XML").typeOf(String).then().setTypeName("Note");
when(StartWithIgnoreCase).with("META_", "VERSION").typeOf(String).then().setTypeName("String");
// Others
when(EndWithIgnoreCase).with("SUMMARY").typeOf(String).then().setTypeName("Comment");
when(EndWithIgnoreCase).with("COMMITWARNING").typeOf(String).then().setTypeName("Msg");
when(StartWithIgnoreCase).with("EFT", "R_", "A_").typeOf(String).then().setTypeName("String");
when(StartWithIgnoreCase).with("OS_COMMAND", "ORGCOLUMN", "NULLCOLUMNS").typeOf(String).then().setTypeName("String");
when(EqualsIgnoreCase).with("Redirects_to", "Homepage").typeOf(String).then().setTypeName("Url");
when(EqualsIgnoreCase).with("DUNS", "BBAN", "NAICS", "APAR", "SKU", "UPC", "SWIPE", "IBAN", "ISDN", "LOT", "SWIFTCode").typeOf(Char, String).then()
.useMatchedNameAsTypeName().useMatchedNameAsFieldName();
when(IncludeIgnoreCase).with("Text").typeOf(String).then().useMatchedNameAsTypeName();
// Number
when(EqualsIgnoreCase).with("FileSize", "Port", "Status", "Version", "Position", "SeqNo", "Priority").typeOf(Long).then().useMatchedNameAsTypeName()
.useMatchedNameAsFieldName();
when(EndWithIgnoreCase).with("Port").typeOf(Long).then().useMatchedNameAsTypeName();
when(StartWithIgnoreCase, EndWithIgnoreCase)
.with("Count", "Length", "Height", "Width", "Size", "Weight", "Ratio", "Rate", "Rating", "Depth", "Price", "Line", "Cost", "Volume", "Amount",
"Percent", "Frequency", "Sequence", "Unit", "Precision", "Ranking").typeOf(Long).then().useMatchedNameAsTypeName();
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Days", "Months", "Years", "DELIVERYTIME").typeOf(Long).then().setTypeName("Count");
when(StartWithIgnoreCase).with("Level", "SERVICELEVELPROVIDED").typeOf(Long).then().setTypeName("Count");
when(EndWithIgnoreCase).with("Limit", "Copies").typeOf(Long).then().setTypeName("Count");
when(StartWithIgnoreCase, EndWithIgnoreCase).with("AMT", "GrandTotal").typeOf(Long).then().setTypeName("Amount");
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Qty").typeOf(Long).then().setTypeName("Quantity");
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Lines").typeOf(Long).then().setTypeName("Line");
when(EndWithIgnoreCase).with("No").typeOf(Long).then().setTypeName("SeqNo");
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Due", "PASTDUE").typeOf(Long).then().setTypeName("Amount");// TODO
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Acct").typeOf(Long).then().setTypeName("Amount");// TODO
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Time").typeOf(Long).then().setTypeName("Count");// TODO
when(StartWithIgnoreCase).with("Measure").typeOf(Long).then().setTypeName("Length");// TODO
when(EndWithIgnoreCase).with("QTYAVAILABLE", "QTYCONFIRMED").typeOf(Long).then().setTypeName("Quantity");
// HTML
when(EndWithIgnoreCase).with("Margin", "Left", "Right", "Top", "Bottom", "Position", "Space").typeOf(Long).then().setTypeName("Length");
when(StartWithIgnoreCase).with("Col").typeOf(Long).then().setTypeName("Length");
// Date
when(EqualsIgnoreCase).with("Birthday").typeOf(Date, Datetime).then().useMatchedNameAsTypeName().useMatchedNameAsFieldName();
when(EndWithIgnoreCase).with("_On").typeOf(Datetime).then().setTypeName(Datetime.name());
when(EndWithIgnoreCase).with("_On").typeOf(Date).then().setTypeName(Date.name());
when(EndWithIgnoreCase).with("_Date").typeOf(Date).then().setTypeName(Date.name());
when(StartWithIgnoreCase, EndWithIgnoreCase).with("Date", "Valid").typeOf(Date).then().setTypeName(Date.name());
when(EndWithIgnoreCase).with("_Timestamp").typeOf(Timestamp).then().setTypeName(Timestamp.name());
when(EqualsIgnoreCase)
.with("ASSIGNDATEFROM", "ASSIGNDATETO", "DISCONTINUEDBY", "DUNNINGGRACE", "ENDTIME", "FIRSTSALE", "LASTCONTACT", "LINEDATEWORKCOMPLETE",
"LINEDATEWORKSTART", "PRICEEFFECTIVE", "REPLY_RECEIVED", "SOURCEUPDATED", "STARTTIME", "T_DATETIME", "TIMESLOTEND", "TIMESLOTSTART",
"TRXRECEIVED", "TRXSENT").typeOf(Date).then().setTypeName("Date");
// Attr
when(EndWithIgnoreCase).with("Rule", "Status").typeOf(Char).then().setTypeName("Attr");
when(StartWithIgnoreCase, EndWithIgnoreCase, EqualsIgnoreCase).with("Type").typeOf(String).then().setTypeName("Attr");
when(EqualsIgnoreCase)
.with("AD_LANGUAGE", "COUNTRYCODE", "COSTINGMETHOD", "DOCACTION", "GENERATEORDER", "GENERATETO", "PROJECTLINELEVEL", "ACCESSLEVEL")
.typeOf(Char, Varchar).then().setTypeName("Attr");
// Boolean
when(EqualsIgnoreCase).with("PROCESSING", "PROCESSED", "POSTED").typeOf(Char).then().setTypeName("YesNo");
when(StartWithIgnoreCase).with("Is", "I_IS", "HAS", "POST", "ALLOW", "Create").typeOf(Char).then().setTypeName("YesNo");
when(StartWithIgnoreCase).with("On", "ACCEPT", "AFTER", "OVERWRITE", "ANY", "DISCONTINUED").typeOf(Char).then().setTypeName("YesNo");
when(EqualsIgnoreCase)
.with("DOPRICING", "CREATEPO", "CLASSIFICATION", "CREATESO", "PRIORITY", "PRIORITYUSER", "REQUIREVV", "PROJECTCATEGORY",
"REQUIRESTAXCERTIFICATE", "UPDATEQTY", "LISTTRX", "LISTSOURCES", "GENERATELIST", "ENFORCEPRICELIMIT", "CREATERECIPROCALRATE",
"COUNTHIGHMOVEMENT").typeOf(Char).then().setTypeName("YesNo");// TODO
// Spacial
when(EndWithIgnoreCase).with("Comments").typeOf(String).then().setTypeName("Note");
when(EndWithIgnoreCase).with("Mail").typeOf(String).then().setTypeName("EMail");
when(EndWithIgnoreCase).with("Hours").typeOf(Decimal).then().setTypeName("Number");
when(EndWithIgnoreCase).with("Encoding").typeOf(String).then().setTypeName("String");
when(EndWithIgnoreCase).with("Notes").typeOf(Text).then().setTypeName("Note");
// notsure
// when().is(Bit).then().setTypeName("YesNo");
// when().is(Varchar, NVarchar).then().setTypeName("String");
when().typeOf(Text, Blob).then().setTypeName("Note");
// when().is(Long).then().setTypeName("Count");
when(EqualsIgnoreCase).with("repository_id").inTable("Changesets").then().setReferTo("Repositories");
// Skip System Column
when(EqualsIgnoreCase).with("ISACTIVE").typeOf(Char).skip();
when(EqualsIgnoreCase).with("CREATEDBY", "UPDATEDBY").typeOf(Long).skip();
when(EqualsIgnoreCase).with("CREATED", "UPDATED").typeOf(Date).skip();
}
public void analyze(List<Type> types) {
// Costruct Type
for (Type type : types) {
for (Field field : type.fields) {
Field result = this.match(field);
if (result != null) {
} else {
System.out.println(field);
}
}
}
// check type
for (Type type : types) {
boolean hasIDKey = false;
boolean hasNameKey = false;
boolean hasNameRequired = false;
boolean hasName = false;
for (Field field : type.fields) {
if ("Name".equalsIgnoreCase(field.resultName)) {
hasName = true;
if (!field.nullable) {
hasNameRequired = true;
}
if (field.isKey) {
hasNameKey = true;
}
} else if (field.isKey) {
if ("ID".equalsIgnoreCase(field.resultTypeName)) {
hasIDKey = true;
}
}
}
if (hasIDKey && !hasName) {
type.standalone = TypeStandalone.Transaction;
} else if (hasNameKey) {
type.standalone = TypeStandalone.Master;
} else if (hasIDKey && hasNameRequired) {
type.standalone = TypeStandalone.Master;
}
// System.out.println("##\t" + type.rawName + "\t" + type.name +
// "\t" + hasIDKey + "\t" + hasNameKey + "\t"
// + hasNameRequired + "\t" + hasName);
}
for (Type type : types) {
for (Field field : type.fields) {
if (field.isForeignKey) {
if (typesByRawName.containsKey(field.foreignKeyTable)) {
field.resultTypeName = typesByRawName.get(field.foreignKeyTable).resultName;
}
} else if (!field.isKey && "ID".equals(field.resultTypeName)) {
String typename = field.name;
if (typename.toUpperCase().endsWith("_ID")) {
typename = typename.substring(0, typename.length() - 3);
}
if (typesByRawName.containsKey(typename)) {
field.resultTypeName = typesByRawName.get(typename).resultName;
field.isForeignKey = true;
field.foreignKeyTable = typename;
} else if (typesByRawName.containsKey(typename + "s")) {
field.resultTypeName = typesByRawName.get(typename + "s").resultName;
field.isForeignKey = true;
field.foreignKeyTable = typename + "s";
} else {
// System.out.println("Fail check foreign key : " +
// type.name + " - " + field.name);
}
}
}
}
// 附属表的情况,主键为另一个对象的主键
for (Type type : types) {
for (Field field : type.fields) {
if (field.isKey) {
if (field.name.endsWith("_ID") && !"ID".equals(field.resultTypeName) && typeMapByName.containsKey(field.resultTypeName)) {
Type refType = typeMapByName.get(field.resultTypeName);
switch (refType.standalone) {
case Master:
type.standalone = TypeStandalone.Master;
break;
case Transaction:
type.standalone = TypeStandalone.Transaction;
break;
}
}
}
}
}
for (Type type : types) {
if (type.standalone == TypeStandalone.Abstract) {
type.standalone = TypeStandalone.Master;
type.comment = "TODO Type not sure !! ";
// System.out.println("## Type not sure " + type.name);
}
}
// System.out.println("\n\n\n=================================================\n\n\n");
// for (Type type : types) {
// for (Field field : type.fields) {
// System.out.println(type.rawName + "\t" + type.name + "\t" +
// type.standalone.name() + "\t"
// + type.comment + "\t" + field);
// }
// }
}
}