Browse Source

add support for strconv function

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1207 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/jackcess-2.2.1
James Ahlborn 5 years ago
parent
commit
11b92ba49d

+ 1
- 1
src/main/java/com/healthmarketscience/jackcess/expr/package-info.java View File

@@ -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>

+ 48
- 0
src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java View File

@@ -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) {

+ 15
- 15
src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java View File

@@ -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);
}

/**

+ 5
- 0
src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java View File

@@ -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')"));

+ 4
- 0
src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java View File

@@ -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

Loading…
Cancel
Save