From 11b92ba49dcad2db58255e557055dea3a27bd78b Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Fri, 5 Oct 2018 19:11:18 +0000 Subject: [PATCH] add support for strconv function git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1207 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../jackcess/expr/package-info.java | 2 +- .../impl/expr/DefaultTextFunctions.java | 48 +++++++++++++++++++ .../jackcess/impl/expr/ValueSupport.java | 30 ++++++------ .../impl/expr/DefaultFunctionsTest.java | 5 ++ .../impl/expr/ExpressionatorTest.java | 4 ++ 5 files changed, 73 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/healthmarketscience/jackcess/expr/package-info.java b/src/main/java/com/healthmarketscience/jackcess/expr/package-info.java index 1f46139..1cd517f 100644 --- a/src/main/java/com/healthmarketscience/jackcess/expr/package-info.java +++ b/src/main/java/com/healthmarketscience/jackcess/expr/package-info.java @@ -232,7 +232,7 @@ limitations under the License. * Right[$]Y * Space[$]Y * StrCompY - * StrConv + * StrConv[$]Partial * String[$]Y * StrReverseY * UCase[$]Y diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java index 4a6da20..42212cf 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java @@ -23,6 +23,7 @@ import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.LocaleContext; import com.healthmarketscience.jackcess.expr.Value; +import org.apache.commons.lang.WordUtils; import static com.healthmarketscience.jackcess.impl.expr.DefaultFunctions.*; import static com.healthmarketscience.jackcess.impl.expr.FunctionSupport.*; @@ -32,6 +33,9 @@ import static com.healthmarketscience.jackcess.impl.expr.FunctionSupport.*; */ public class DefaultTextFunctions { + // mask to separate the case conversion value (first two bits) from the char + // conversion value for the StrConv() function + private static final int STR_CONV_MASK = 0x03; private DefaultTextFunctions() {} @@ -317,6 +321,50 @@ public class DefaultTextFunctions } }); + public static final Function STRCONV = registerStringFunc(new FuncVar("StrConv", 2, 3) { + @Override + protected Value evalVar(EvalContext ctx, Value[] params) { + Value param1 = params[0]; + if(param1.isNull()) { + return ValueSupport.NULL_VAL; + } + + String str = param1.getAsString(ctx); + int conversion = params[1].getAsLongInt(ctx); + // TODO, for now, ignore locale id...? + // int localeId = params[2]; + + int caseConv = STR_CONV_MASK & conversion; + int charConv = (~STR_CONV_MASK) & conversion; + + switch(caseConv) { + case 1: + // vbUpperCase + str = str.toUpperCase(); + break; + case 2: + // vbLowerCase + str = str.toLowerCase(); + break; + case 3: + // vbProperCase + str = WordUtils.capitalize(str.toLowerCase()); + break; + default: + // do nothing + } + + if(charConv != 0) { + // 64 = vbUnicode, all java strings are already unicode,so nothing to do + if(charConv != 64) { + throw new EvalException("Unsupported character conversion " + charConv); + } + } + + return ValueSupport.toValue(str); + } + }); + public static final Function STRING = registerStringFunc(new Func2("String") { @Override protected Value eval2(EvalContext ctx, Value param1, Value param2) { diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java index 06833de..621ed37 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java @@ -96,21 +96,21 @@ public class ValueSupport } public static DateFormat getDateFormatForType(LocaleContext ctx, Value.Type type) { - String fmtStr = null; - switch(type) { - case DATE: - fmtStr = ctx.getTemporalConfig().getDefaultDateFormat(); - break; - case TIME: - fmtStr = ctx.getTemporalConfig().getDefaultTimeFormat(); - break; - case DATE_TIME: - fmtStr = ctx.getTemporalConfig().getDefaultDateTimeFormat(); - break; - default: - throw new EvalException("Unexpected date/time type " + type); - } - return ctx.createDateFormat(fmtStr); + String fmtStr = null; + switch(type) { + case DATE: + fmtStr = ctx.getTemporalConfig().getDefaultDateFormat(); + break; + case TIME: + fmtStr = ctx.getTemporalConfig().getDefaultTimeFormat(); + break; + case DATE_TIME: + fmtStr = ctx.getTemporalConfig().getDefaultDateTimeFormat(); + break; + default: + throw new EvalException("Unexpected date/time type " + type); + } + return ctx.createDateFormat(fmtStr); } /** diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java index 4051fde..f4f037b 100644 --- a/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java @@ -161,6 +161,11 @@ public class DefaultFunctionsTest extends TestCase assertEquals(1, eval("=StrComp('bar', 'FOO', 0)")); assertEquals(-1, eval("=StrComp('FOO', 'foo', 0)")); + assertEquals("FOO", eval("=StrConv('foo', 1)")); + assertEquals("foo", eval("=StrConv('foo', 2)")); + assertEquals("foo", eval("=StrConv('FOO', 2)")); + assertEquals("Foo Bar", eval("=StrConv('FOO bar', 3)")); + assertEquals("halb", eval("=StrReverse('blah')")); assertEquals("foo", eval("=Choose(1,'foo','bar','blah')")); diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java index d7b5a00..4c50f12 100644 --- a/src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java @@ -322,6 +322,10 @@ public class ExpressionatorTest extends TestCase assertEquals(new Date(1044680400000L), eval("=#01/02/2003# + '37'")); assertEquals(new Date(1044680400000L), eval("='37' + #01/02/2003#")); assertEquals(new Date(1041508800000L), eval("=#01/02/2003 7:00:00 AM#")); + + assertEquals("2/8/2003", eval("=CStr(#01/02/2003# + '37')")); + assertEquals("9:24:00 AM", eval("=CStr(#7:00:00 AM# + 0.1)")); + assertEquals("1/2/2003 1:10:00 PM", eval("=CStr(#01/02/2003# + #13:10:00#)")); } public void testNull() throws Exception -- 2.39.5