diff --git a/querydsl-core/src/main/java/com/mysema/query/types/Ops.java b/querydsl-core/src/main/java/com/mysema/query/types/Ops.java index 3928a3489..15422ae86 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/Ops.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/Ops.java @@ -222,6 +222,10 @@ public final class Ops { public static final class StringOps { public static final Operator LTRIM = new OperatorImpl("LTRIM",String.class); public static final Operator RTRIM = new OperatorImpl("RTRIM",String.class); + public static final Operator LPAD = new OperatorImpl("LPAD",String.class, Integer.class); + public static final Operator RPAD = new OperatorImpl("RPAD",String.class, Integer.class); + public static final Operator LPAD2 = new OperatorImpl("LPAD2",String.class, Integer.class, Character.class); + public static final Operator RPAD2 = new OperatorImpl("RPAD2",String.class, Integer.class, Character.class); public static final Operator SPACE = new OperatorImpl("SPACE",Integer.class); public static final Operator SPLIT = new OperatorImpl("SPLIT",STRING_X_2); public static final Operator LAST_INDEX_2ARGS = new OperatorImpl("LAST_INDEX2"); diff --git a/querydsl-core/src/main/java/com/mysema/query/types/Templates.java b/querydsl-core/src/main/java/com/mysema/query/types/Templates.java index 7f888a715..47e0fae49 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/Templates.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/Templates.java @@ -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"); diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/StringExpressions.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/StringExpressions.java index 1aecd3603..c36c302ac 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/StringExpressions.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/StringExpressions.java @@ -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 in, int length) { + return StringOperation.create(Ops.StringOps.LPAD, in, ConstantImpl.create(length)); + } + + /** + * @param in + * @param length + * @return + */ + public static StringExpression lpad(Expression in, Expression length) { + return StringOperation.create(Ops.StringOps.LPAD, in, length); + } + + /** + * @param in + * @param length + * @return + */ + public static StringExpression rpad(Expression in, int length) { + return StringOperation.create(Ops.StringOps.RPAD, in, ConstantImpl.create(length)); + } + + /** + * @param in + * @param length + * @return + */ + public static StringExpression rpad(Expression in, Expression length) { + return StringOperation.create(Ops.StringOps.RPAD, in, length); + } + private StringExpressions() {} + /** + * @param in + * @param length + * @param c + * @return + */ + public static StringExpression lpad(Expression in, NumberExpression 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 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 in, NumberExpression 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 in, int length, char c) { + return StringOperation.create(Ops.StringOps.RPAD2, in, ConstantImpl.create(length), ConstantImpl.create(c)); + + } + } diff --git a/querydsl-core/src/test/java/com/mysema/query/types/ExpressivityTest.java b/querydsl-core/src/test/java/com/mysema/query/types/ExpressivityTest.java index 2a616da7e..0a33dcbaf 100644 --- a/querydsl-core/src/test/java/com/mysema/query/types/ExpressivityTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/types/ExpressivityTest.java @@ -318,13 +318,13 @@ public class ExpressivityTest { //Field lower() str.lower(); //Field lpad(Field length) - + StringExpressions.lpad(str, num); //Field lpad(Field length, Field character) - + StringExpressions.lpad(str, num, '!'); //Field lpad(int length) - + StringExpressions.lpad(str, 10); //Field lpad(int length, char character) - + StringExpressions.lpad(str, 10, '!'); //Field ltrim() StringExpressions.ltrim(str); //Field max() @@ -428,13 +428,13 @@ public class ExpressivityTest { //Field round(int decimals) //Field rpad(Field length) - + StringExpressions.rpad(str, num); //Field rpad(Field length, Field character) - + StringExpressions.rpad(str, num, '!'); //Field rpad(int length) - + StringExpressions.rpad(str, 10); //Field rpad(int length, char character) - + StringExpressions.rpad(str, 10, '!'); //Field rtrim() StringExpressions.rtrim(str); // shl (bitwise shift left) diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/DerbyTemplates.java b/querydsl-sql/src/main/java/com/mysema/query/sql/DerbyTemplates.java index 9fba456c1..cfe604b1c 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/DerbyTemplates.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/DerbyTemplates.java @@ -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) { diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/MySQLTemplates.java b/querydsl-sql/src/main/java/com/mysema/query/sql/MySQLTemplates.java index bd5b26273..a8269feb5 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/MySQLTemplates.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/MySQLTemplates.java @@ -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}"); diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLiteTemplates.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLiteTemplates.java index abd03eef3..725f3073a 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLiteTemplates.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLiteTemplates.java @@ -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})))"); } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java index bd17ac55c..ab0f3b4b6 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java @@ -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 unique(Expression expr) { return query().uniqueResult(expr);