aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Ahlborn <jtahlborn@yahoo.com>2018-10-05 19:11:18 +0000
committerJames Ahlborn <jtahlborn@yahoo.com>2018-10-05 19:11:18 +0000
commit11b92ba49dcad2db58255e557055dea3a27bd78b (patch)
tree804e151c5ee586b9f9d2d87920fca7217aea6297
parent535e01e48552081565dc76b98148fa0a2a67c52d (diff)
downloadjackcess-11b92ba49dcad2db58255e557055dea3a27bd78b.tar.gz
jackcess-11b92ba49dcad2db58255e557055dea3a27bd78b.zip
add support for strconv function
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1207 f203690c-595d-4dc9-a70b-905162fa7fd2
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/expr/package-info.java2
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java48
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java30
-rw-r--r--src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java5
-rw-r--r--src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java4
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.
* <tr class="TableRowColor"><td>Right[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>Space[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>StrComp</td><td>Y</td></tr>
- * <tr class="TableRowColor"><td>StrConv</td><td></td></tr>
+ * <tr class="TableRowColor"><td>StrConv[$]</td><td>Partial</td></tr>
* <tr class="TableRowColor"><td>String[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>StrReverse</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>UCase[$]</td><td>Y</td></tr>
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