Skip to content

Commit

Permalink
Support for custom date format
Browse files Browse the repository at this point in the history
From the discussion on #605
  • Loading branch information
lvca committed Nov 8, 2022
1 parent c343a0e commit 14a1260
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ public class SQLMethodAsDate extends AbstractSQLMethod {
public static final String NAME = "asdate";

public SQLMethodAsDate() {
super(NAME, 0, 0);
super(NAME, 0, 1);
}

@Override
public String getSyntax() {
return "asDate()";
return "asDate([<format>])";
}

@Override
Expand All @@ -55,10 +55,11 @@ public Object execute(Object iThis, Identifiable iCurrentRecord, CommandContext
return new Date(((Number) iThis).longValue());
} else {
try {
return new SimpleDateFormat(iContext.getDatabase().getSchema().getDateFormat()).parse(iThis.toString());
final String format = iParams.length > 0 ? iParams[0].toString() : iContext.getDatabase().getSchema().getDateFormat();
return new SimpleDateFormat(format).parse(iThis.toString());

} catch (ParseException e) {
LogManager.instance().log(this, Level.SEVERE, "Error during %s execution", e, NAME);
LogManager.instance().log(this, Level.SEVERE, "Error during %s method execution", e, NAME);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ public class SQLMethodAsDateTime extends AbstractSQLMethod {
public static final String NAME = "asdatetime";

public SQLMethodAsDateTime() {
super(NAME, 0, 0);
super(NAME, 0, 1);
}

@Override
public String getSyntax() {
return "asDatetime()";
return "asDatetime([<format>])";
}

@Override
Expand All @@ -55,9 +55,10 @@ public Object execute(Object iThis, Identifiable iCurrentRecord, CommandContext
return new Date(((Number) iThis).longValue());
} else {
try {
return new SimpleDateFormat(iContext.getDatabase().getSchema().getDateTimeFormat()).parse(iThis.toString());
final String format = iParams.length > 0 ? iParams[0].toString() : iContext.getDatabase().getSchema().getDateTimeFormat();
return new SimpleDateFormat(format).parse(iThis.toString());
} catch (ParseException e) {
LogManager.instance().log(this, Level.SEVERE, "Error during %s execution", e, NAME);
LogManager.instance().log(this, Level.SEVERE, "Error during %s method execution", e, NAME);
// IGNORE IT: RETURN NULL
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,71 +35,68 @@
*/
public class SQLFunctionConvertTest {

@Test
public void testSQLConversions() throws Exception {
TestHelper.executeInNewDatabase("testSQLConvert", (db) -> db.transaction(() -> {
db.command("sql", "create document type TestConversion");
@Test
public void testSQLConversions() throws Exception {
TestHelper.executeInNewDatabase("testSQLConvert", (db) -> db.transaction(() -> {
db.command("sql", "create document type TestConversion");

db.command("sql", "insert into TestConversion set string = 'Jay', date = sysdate(), number = 33");
db.command("sql", "insert into TestConversion set string = 'Jay', date = sysdate(), number = 33, dateAsString = '2011-12-03T10:15:30.388724'");

Document doc = db.query("sql", "select from TestConversion limit 1").next().toElement();
Document doc = db.query("sql", "select from TestConversion limit 1").next().toElement();

db.command("sql", "update TestConversion set selfrid = 'foo" + doc.getIdentity() + "'");
db.command("sql", "update TestConversion set selfrid = 'foo" + doc.getIdentity() + "'");

ResultSet results = db.query("sql", "select string.asString() as convert from TestConversion");
assertNotNull(results);
ResultSet results = db.query("sql", "select string.asString() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof String);

assertTrue(results.next().getProperty("convert") instanceof String);
results = db.query("sql", "select number.asDate() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Date);

results = db.query("sql", "select number.asDate() as convert from TestConversion");
assertNotNull(results);
results = db.query("sql", "select dateAsString.asDate(\"yyyy-MM-dd'T'HH:mm:ss.SSSSSS\") as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Date);

assertTrue(results.next().getProperty("convert") instanceof Date);
results = db.query("sql", "select number.asDateTime() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Date);

results = db.query("sql", "select number.asDateTime() as convert from TestConversion");
assertNotNull(results);
results = db.query("sql", "select dateAsString.asDateTime(\"yyyy-MM-dd'T'HH:mm:ss.SSSSSS\") as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Date);

assertTrue(results.next().getProperty("convert") instanceof Date);
results = db.query("sql", "select number.asInteger() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Integer);

results = db.query("sql", "select number.asInteger() as convert from TestConversion");
assertNotNull(results);
results = db.query("sql", "select number.asLong() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Long);

assertTrue(results.next().getProperty("convert") instanceof Integer);
results = db.query("sql", "select number.asFloat() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Float);

results = db.query("sql", "select number.asLong() as convert from TestConversion");
assertNotNull(results);
results = db.query("sql", "select number.asDecimal() as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof BigDecimal);

assertTrue(results.next().getProperty("convert") instanceof Long);
results = db.query("sql", "select number.convert('LONG') as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Long);

results = db.query("sql", "select number.asFloat() as convert from TestConversion");
assertNotNull(results);
results = db.query("sql", "select number.convert('SHORT') as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Short);

assertTrue(results.next().getProperty("convert") instanceof Float);
results = db.query("sql", "select number.convert('DOUBLE') as convert from TestConversion");
assertNotNull(results);
assertTrue(results.next().getProperty("convert") instanceof Double);

results = db.query("sql", "select number.asDecimal() as convert from TestConversion");
assertNotNull(results);

assertTrue(results.next().getProperty("convert") instanceof BigDecimal);

results = db.query("sql", "select number.convert('LONG') as convert from TestConversion");
assertNotNull(results);

assertTrue(results.next().getProperty("convert") instanceof Long);

results = db.query("sql", "select number.convert('SHORT') as convert from TestConversion");
assertNotNull(results);

assertTrue(results.next().getProperty("convert") instanceof Short);

results = db.query("sql", "select number.convert('DOUBLE') as convert from TestConversion");
assertNotNull(results);

assertTrue(results.next().getProperty("convert") instanceof Double);

results = db.query("sql", "select selfrid.substring(3).convert('LINK').string as convert from TestConversion");
assertNotNull(results);

assertEquals(results.next().getProperty("convert"), "Jay");
}));
}
results = db.query("sql", "select selfrid.substring(3).convert('LINK').string as convert from TestConversion");
assertNotNull(results);
assertEquals(results.next().getProperty("convert"), "Jay");
}));
}
}

0 comments on commit 14a1260

Please sign in to comment.