Skip to content

Commit

Permalink
0002415: select date and timestamp without column template
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Mar 16, 2021
1 parent 754ca32 commit 3ed79d2
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,16 @@
import org.apache.commons.lang3.ArrayUtils;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.ase.AseDatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2000DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2005DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2008DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2016DatabasePlatform;
import org.jumpmind.db.platform.mysql.MySqlDatabasePlatform;
import org.jumpmind.db.platform.oracle.OracleDatabasePlatform;
import org.jumpmind.db.platform.postgresql.PostgreSqlDatabasePlatform;
import org.jumpmind.db.platform.sqlanywhere.SqlAnywhereDatabasePlatform;
import org.jumpmind.db.platform.tibero.TiberoDatabasePlatform;
import org.jumpmind.db.util.BinaryEncoding;
import org.jumpmind.symmetric.common.ContextConstants;
import org.jumpmind.symmetric.io.AbstractWriterTest;
Expand Down Expand Up @@ -322,11 +330,14 @@ protected void assertTestTableEquals(String testTableId, BinaryEncoding encoding
}

protected String[] massageExpectectedResultsForDialect(String[] values) {
if(values[5] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)) {
// No time portion for a date field
values[5] = values[5].replaceFirst(" \\d\\d:\\d\\d:\\d\\d\\.000", "");
if (values[5] != null && (!(platform instanceof OracleDatabasePlatform || platform instanceof TiberoDatabasePlatform
|| ((platform instanceof MsSql2000DatabasePlatform || platform instanceof MsSql2005DatabasePlatform)
&& !(platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform))
|| platform instanceof AseDatabasePlatform || platform instanceof SqlAnywhereDatabasePlatform))) {
values[5] = values[5].replaceFirst(" \\d\\d:\\d\\d:\\d\\d.*", "");
}
if(values[6] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)) {
if(values[6] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform
|| platform instanceof MySqlDatabasePlatform || platform instanceof PostgreSqlDatabasePlatform)) {
if(values[6].length() == 23) {
values[6] = values[6] + "0000";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ protected boolean useTriggerTemplateForColumnTemplatesDuringInitialLoad(Column c
|| type == Types.NUMERIC || type == Types.BINARY || type == Types.VARBINARY
|| (type == Types.BLOB && !requiresWrappedBlobTemplateForBlobType()) || type == Types.LONGVARBINARY
|| type == Types.DECIMAL || type == Types.FLOAT || type == Types.DOUBLE
|| type == ColumnTypes.MSSQL_NTEXT) {
|| type == ColumnTypes.MSSQL_NTEXT || type == Types.DATE || type == Types.TIME || type == Types.TIMESTAMP) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
Expand All @@ -36,8 +37,15 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.jumpmind.db.platform.AbstractDatabasePlatform;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.ase.AseDatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2000DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2005DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2008DatabasePlatform;
import org.jumpmind.db.platform.mssql.MsSql2016DatabasePlatform;
import org.jumpmind.db.platform.oracle.OracleDatabasePlatform;
import org.jumpmind.db.platform.sqlanywhere.SqlAnywhereDatabasePlatform;
import org.jumpmind.db.platform.tibero.TiberoDatabasePlatform;
import org.jumpmind.symmetric.TestConstants;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.csv.CsvWriter;
Expand Down Expand Up @@ -654,6 +662,8 @@ protected void assertTestTableEquals(String testTableId, String[] expectedValues
expectedValues[2] = translateExpectedString(expectedValues[2], true);
expectedValues[3] = translateExpectedCharString(expectedValues[3], 50, false);
expectedValues[4] = translateExpectedCharString(expectedValues[4], 50, true);
expectedValues[5] = translateExpectedDate(expectedValues[5]);
expectedValues[6] = translateExpectedTimestamp(expectedValues[6]);
}
assertEquals(TEST_COLUMNS, expectedValues, results);
}
Expand All @@ -671,8 +681,11 @@ protected void assertEquals(String[] name, String[] expected, Map<String, Object
if ((resultObj instanceof Double || resultObj instanceof BigDecimal) && expected[i].indexOf(decimal) != -1) {
DecimalFormat df = new DecimalFormat("0.00####################################");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Timestamp) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.0");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Date) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.000");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Boolean) {
resultValue = ((Boolean) resultObj) ? "1" : "0";
Expand Down Expand Up @@ -730,6 +743,24 @@ && getDbDialect().getPlatform().getDatabaseInfo().isCharColumnSpaceTrimmed()) {
return value;
}

protected String translateExpectedDate(String value) {
IDatabasePlatform platform = engine.getDatabasePlatform();
if (value != null && (!(platform instanceof OracleDatabasePlatform || platform instanceof TiberoDatabasePlatform
|| ((platform instanceof MsSql2000DatabasePlatform || platform instanceof MsSql2005DatabasePlatform)
&& !(platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform))
|| platform instanceof AseDatabasePlatform || platform instanceof SqlAnywhereDatabasePlatform))) {
value = value.replaceAll(" 00:00:00\\.0*", "");
}
return value;
}

protected String translateExpectedTimestamp(String value) {
if (value != null) {
value = value.replaceAll("\\.0*", ".0");
}
return value;
}

protected IDataLoaderService getDataLoaderService() {
DataLoaderService dataLoaderService = (DataLoaderService) getSymmetricEngine()
.getDataLoaderService();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,10 @@ public String[] getStringValues(BinaryEncoding encoding, Column[] metaData, Row
values[i] = row.getBoolean(name) ? "1" : "0";
} else if (column.isOfNumericType()) {
values[i] = row.getString(name);
} else if (!column.isTimestampWithTimezone() && (type == Types.DATE || type == Types.TIMESTAMP || type == Types.TIME)) {
} else if (!column.isTimestampWithTimezone() && (type == Types.DATE || type == Types.TIME)) {
values[i] = getDateTimeStringValue(name, type, row, useVariableDates);
} else if (!column.isTimestampWithTimezone() && type == Types.TIMESTAMP) {
values[i] = getTimestampStringValue(name, type, row, useVariableDates);
} else if (column.isOfBinaryType()) {
byte[] bytes = row.getBytes(name);
if (encoding == BinaryEncoding.NONE) {
Expand Down Expand Up @@ -573,8 +575,10 @@ public String getCsvStringValue(BinaryEncoding encoding, Column[] metaData, Row
concatenatedRow.append(row.getString(name));
} else if (column.isOfNumericType()) {
concatenatedRow.append(row.getString(name));
} else if (!column.isTimestampWithTimezone() && (type == Types.DATE || type == Types.TIMESTAMP || type == Types.TIME)) {
} else if (!column.isTimestampWithTimezone() && (type == Types.DATE || type == Types.TIME)) {
concatenatedRow.append("\"").append(getDateTimeStringValue(name, type, row, false)).append("\"");
} else if (!column.isTimestampWithTimezone() && type == Types.TIMESTAMP) {
concatenatedRow.append("\"").append(getTimestampStringValue(name, type, row, false)).append("\"");
} else if (type == Types.BOOLEAN || type == Types.BIT) {
concatenatedRow.append(row.getBoolean(name) ? "1" : "0");
} else if (column.isOfBinaryType()) {
Expand Down Expand Up @@ -613,6 +617,21 @@ protected String getDateTimeStringValue(String name, int type, Row row, boolean
}
}

protected String getTimestampStringValue(String name, int type, Row row, boolean useVariableDates) {
Object tsObj = row.get(name);
if (tsObj instanceof String) {
return (String) tsObj;
} else {
Timestamp ts = row.getTimestamp(name);
if (useVariableDates) {
long diff = ts.getTime() - System.currentTimeMillis();
return "${ts" + diff + "}";
} else {
return String.format("%tF %tT.%09d", ts, ts, ts.getNanos());
}
}
}

public Map<String, String> getSqlScriptReplacementTokens() {
return null;
}
Expand Down
10 changes: 10 additions & 0 deletions symmetric-db/src/main/java/org/jumpmind/db/sql/Row.java
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,16 @@ public Time getTime(String columnName) {
}
}

public Timestamp getTimestamp(String columnName) {
Object obj = this.get(columnName);
if (obj instanceof Timestamp) {
return (Timestamp) obj;
} else {
Date date = getDateTime(columnName);
return new Timestamp(date.getTime());
}
}

public Date getDateTime(String columnName) {
Object obj = this.get(columnName);
if (obj instanceof Number) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -642,12 +642,12 @@ private String[] massageExpectectedResultsForDialect(String[] values) {
)
|| platform instanceof AseDatabasePlatform
|| platform instanceof SqlAnywhereDatabasePlatform))) {
values[5] = values[5].replaceFirst(" \\d\\d:\\d\\d:\\d\\d\\.?0?", " 00:00:00.0");
values[5] = values[5].replaceFirst(" \\d\\d:\\d\\d:\\d\\d.*", "");
} else if (values[5] != null && values[5].length() == 23 && (platform instanceof OracleDatabasePlatform || platform instanceof TiberoDatabasePlatform)) {
values[5] = values[5] + "0000";
}
if(values[6] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)) {
if(values[6].length() == 23) {
values[6] = values[6] + "0000";
}
if (values[6] != null && values[6].length() == 23) {
values[6] = values[6] + "0000";
}
if (values[10] != null) {
values[10] = values[10].replace(',', '.');
Expand All @@ -671,14 +671,23 @@ private String[] massageExpectectedResultsForDialect(String[] values) {
}

private String[] massageExpectectedResultsForDialect2(String[] values) {
if(values[6] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)) {
// No time portion for a date field
values[6] = values[6].replaceFirst(" \\d\\d:\\d\\d:\\d\\d\\.000", "");
if (values[6] != null
&& (!(platform instanceof OracleDatabasePlatform
|| platform instanceof TiberoDatabasePlatform
||
// Only SqlServer 2000 and 2005 should not be mangled. 2008 now uses Date and Time data types.
(
(platform instanceof MsSql2000DatabasePlatform || platform instanceof MsSql2005DatabasePlatform
) && ! (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)
)
|| platform instanceof AseDatabasePlatform
|| platform instanceof SqlAnywhereDatabasePlatform))) {
values[6] = values[6].replaceFirst(" \\d\\d:\\d\\d:\\d\\d.*", "");
} else if (values[6] != null && values[6].length() == 23 && (platform instanceof OracleDatabasePlatform || platform instanceof TiberoDatabasePlatform)) {
values[6] = values[6] + "0000";
}
if(values[7] != null && (platform instanceof MsSql2008DatabasePlatform || platform instanceof MsSql2016DatabasePlatform)) {
if(values[7].length() == 23) {
values[7] = values[7] + "0000";
}
if (values[7] != null && values[7].length() == 23) {
values[7] = values[7] + "0000";
}
return values;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
package org.jumpmind.symmetric.io;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand Down Expand Up @@ -305,8 +306,11 @@ protected void assertEquals(String[] name, String[] expected, Map<String, Object
if ((resultObj instanceof Double || resultObj instanceof BigDecimal) && expected[i].indexOf(decimal) != -1) {
DecimalFormat df = new DecimalFormat("0.00####################################");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Timestamp) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.0000000");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Date) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.000");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
resultValue = df.format(resultObj);
} else if (resultObj instanceof Boolean) {
resultValue = ((Boolean) resultObj) ? "1" : "0";
Expand Down

0 comments on commit 3ed79d2

Please sign in to comment.