#177 added lpad and rpad

This commit is contained in:
Timo Westkämper 2012-06-24 17:17:36 +03:00
parent b8c3f32147
commit 97f90e7f3d
8 changed files with 117 additions and 9 deletions

View File

@ -222,6 +222,10 @@ public final class Ops {
public static final class StringOps {
public static final Operator<String> LTRIM = new OperatorImpl<String>("LTRIM",String.class);
public static final Operator<String> RTRIM = new OperatorImpl<String>("RTRIM",String.class);
public static final Operator<String> LPAD = new OperatorImpl<String>("LPAD",String.class, Integer.class);
public static final Operator<String> RPAD = new OperatorImpl<String>("RPAD",String.class, Integer.class);
public static final Operator<String> LPAD2 = new OperatorImpl<String>("LPAD2",String.class, Integer.class, Character.class);
public static final Operator<String> RPAD2 = new OperatorImpl<String>("RPAD2",String.class, Integer.class, Character.class);
public static final Operator<String> SPACE = new OperatorImpl<String>("SPACE",Integer.class);
public static final Operator<String[]> SPLIT = new OperatorImpl<String[]>("SPLIT",STRING_X_2);
public static final Operator<Number> LAST_INDEX_2ARGS = new OperatorImpl<Number>("LAST_INDEX2");

View File

@ -131,6 +131,10 @@ public class Templates {
add(Ops.StringOps.LAST_INDEX_2ARGS, "lastIndexOf({0},{1},{2})");
add(Ops.StringOps.SPLIT, "split({0},{1})");
add(Ops.StringOps.POSITION, "position({0},{1})");
add(Ops.StringOps.LPAD, "lpad({0},{1})");
add(Ops.StringOps.RPAD, "rpad({0},{1})");
add(Ops.StringOps.LPAD2, "lpad({0},{1},'{2s}')");
add(Ops.StringOps.RPAD2, "rpad({0},{1},'{2s}')");
// date time
add(Ops.DateTimeOps.SYSDATE, "sysdate");

View File

@ -59,6 +59,86 @@ public final class StringExpressions {
return NumberOperation.create(Integer.class, Ops.StringOps.POSITION, in, ConstantImpl.create(search));
}
/**
* @param in
* @param length
* @return
*/
public static StringExpression lpad(Expression<String> in, int length) {
return StringOperation.create(Ops.StringOps.LPAD, in, ConstantImpl.create(length));
}
/**
* @param in
* @param length
* @return
*/
public static StringExpression lpad(Expression<String> in, Expression<Integer> length) {
return StringOperation.create(Ops.StringOps.LPAD, in, length);
}
/**
* @param in
* @param length
* @return
*/
public static StringExpression rpad(Expression<String> in, int length) {
return StringOperation.create(Ops.StringOps.RPAD, in, ConstantImpl.create(length));
}
/**
* @param in
* @param length
* @return
*/
public static StringExpression rpad(Expression<String> in, Expression<Integer> length) {
return StringOperation.create(Ops.StringOps.RPAD, in, length);
}
private StringExpressions() {}
/**
* @param in
* @param length
* @param c
* @return
*/
public static StringExpression lpad(Expression<String> in, NumberExpression<Integer> length, char c) {
return StringOperation.create(Ops.StringOps.LPAD2, in, length, ConstantImpl.create(c));
}
/**
* @param in
* @param length
* @param c
* @return
*/
public static StringExpression lpad(Expression<String> in, int length, char c) {
return StringOperation.create(Ops.StringOps.LPAD2, in, ConstantImpl.create(length), ConstantImpl.create(c));
}
/**
* @param in
* @param length
* @param c
* @return
*/
public static StringExpression rpad(Expression<String> in, NumberExpression<Integer> length, char c) {
return StringOperation.create(Ops.StringOps.RPAD2, in, length, ConstantImpl.create(c));
}
/**
* @param in
* @param length
* @param c
* @return
*/
public static StringExpression rpad(Expression<String> in, int length, char c) {
return StringOperation.create(Ops.StringOps.RPAD2, in, ConstantImpl.create(length), ConstantImpl.create(c));
}
}

View File

@ -318,13 +318,13 @@ public class ExpressivityTest {
//Field<String> lower()
str.lower();
//Field<String> lpad(Field<? extends Number> length)
StringExpressions.lpad(str, num);
//Field<String> lpad(Field<? extends Number> length, Field<String> character)
StringExpressions.lpad(str, num, '!');
//Field<String> lpad(int length)
StringExpressions.lpad(str, 10);
//Field<String> lpad(int length, char character)
StringExpressions.lpad(str, 10, '!');
//Field<String> ltrim()
StringExpressions.ltrim(str);
//Field<T> max()
@ -428,13 +428,13 @@ public class ExpressivityTest {
//Field<T> round(int decimals)
//Field<String> rpad(Field<? extends Number> length)
StringExpressions.rpad(str, num);
//Field<String> rpad(Field<? extends Number> length, Field<String> character)
StringExpressions.rpad(str, num, '!');
//Field<String> rpad(int length)
StringExpressions.rpad(str, 10);
//Field<String> rpad(int length, char character)
StringExpressions.rpad(str, 10, '!');
//Field<String> rtrim()
StringExpressions.rtrim(str);
// shl (bitwise shift left)

View File

@ -60,7 +60,6 @@ public class DerbyTemplates extends SQLTemplates {
add(Ops.MathOps.LN, "log({0})");
add(Ops.MathOps.LOG, "(log({0}) / log({1}))");
add(Ops.MathOps.COTH, "(exp({0} * 2) + 1) / (exp({0} * 2) - 1)");
}
protected void serializeModifiers(QueryMetadata metadata, SerializationContext context) {

View File

@ -50,6 +50,9 @@ public class MySQLTemplates extends SQLTemplates {
add(Ops.CONCAT, "concat({0}, {1})",0);
add(Ops.DateTimeOps.YEAR_MONTH, "extract(year_month from {0})");
add(Ops.StringOps.LPAD, "lpad({0},{1},' ')");
add(Ops.StringOps.RPAD, "rpad({0},{1},' ')");
// like without escape
if (escape == '\\') {
add(Ops.LIKE, "{0} like {1}");

View File

@ -52,6 +52,9 @@ public class SQLiteTemplates extends SQLTemplates {
add(Ops.MathOps.LN, "log({0})");
add(Ops.MathOps.LOG, "(log({0}) / log({1}))");
// add(Ops.StringOps.LPAD, "concat(repeat(' ', {1} - length({0})), {0})");
// add(Ops.StringOps.RPAD, "concat({0}, repeat(' ', {1} - length({0})))");
}
}

View File

@ -64,6 +64,7 @@ import com.mysema.query.sql.domain.QSurvey;
import com.mysema.query.support.Expressions;
import com.mysema.query.types.ArrayConstructorExpression;
import com.mysema.query.types.Concatenation;
import com.mysema.query.types.ConstantImpl;
import com.mysema.query.types.ConstructorExpression;
import com.mysema.query.types.Expression;
import com.mysema.query.types.MappingProjection;
@ -715,6 +716,20 @@ public abstract class SelectBaseTest extends AbstractBaseTest{
assertEquals(Integer.valueOf(3), unique(StringExpressions.position(str, "a")));
assertEquals(" abcd", unique(StringExpressions.rtrim(str)));
}
@Test
@ExcludeIn({SQLITE, DERBY})
public void LPad() {
assertEquals(" ab", unique(StringExpressions.lpad(ConstantImpl.create("ab"), 4)));
assertEquals("!!ab", unique(StringExpressions.lpad(ConstantImpl.create("ab"), 4, '!')));
}
@Test
@ExcludeIn({SQLITE, DERBY})
public void Rpad() {
assertEquals("ab ", unique(StringExpressions.rpad(ConstantImpl.create("ab"), 4)));
assertEquals("ab!!", unique(StringExpressions.rpad(ConstantImpl.create("ab"), 4,'!')));
}
private <T> T unique(Expression<T> expr) {
return query().uniqueResult(expr);