From 2a34ed63b38ec26f7c7f163f3693121460481f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 21 Jun 2016 22:04:20 +0300 Subject: [PATCH 1/2] Add test --- .../core/types/dsl/StringExpression.java | 13 +++++++++++++ .../test/java/com/querydsl/sql/SelectBase.java | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/StringExpression.java b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/StringExpression.java index 96ec68d6f..deb0ffc33 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/StringExpression.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/StringExpression.java @@ -482,6 +482,19 @@ public abstract class StringExpression extends LiteralExpression { return Expressions.numberOperation(Integer.class, Ops.StringOps.LOCATE2, ConstantImpl.create(str), mixin, ConstantImpl.create(start)); } + /** + * Create a {@code locate(str, this, start)} expression + * + *

Get the position of the given String in this String, the first position is 1

+ * + * @param str string + * @param start start + * @return locate(str, this, start) + */ + public NumberExpression locate(String str, Expression start) { + return Expressions.numberOperation(Integer.class, Ops.StringOps.LOCATE2, ConstantImpl.create(str), mixin, start); + } + /** * Create a {@code this.toLowerCase()} expression * diff --git a/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java b/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java index 675e42319..259df3813 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java @@ -1699,6 +1699,24 @@ public class SelectBase extends AbstractBaseTest { assertEquals(Integer.valueOf(0), firstResult(str.locate("a", 4))); assertEquals(Integer.valueOf(4), firstResult(str.locate("b", 2))); assertEquals(" abcd", firstResult(StringExpressions.rtrim(str))); + assertEquals("abc", firstResult(str.substring(2, 5))); + } + + @Test + @ExcludeIn(SQLITE) + public void string_withTemplate() { + StringExpression str = Expressions.stringTemplate("' abcd '"); + + NumberExpression four = Expressions.numberTemplate(Integer.class, "4"); + NumberExpression two = Expressions.numberTemplate(Integer.class, "2"); + NumberExpression five = Expressions.numberTemplate(Integer.class, "5"); + + assertEquals("abcd ", firstResult(StringExpressions.ltrim(str))); + assertEquals(Integer.valueOf(3), firstResult(str.locate("a"))); + assertEquals(Integer.valueOf(0), firstResult(str.locate("a", four))); + assertEquals(Integer.valueOf(4), firstResult(str.locate("b", two))); + assertEquals(" abcd", firstResult(StringExpressions.rtrim(str))); + assertEquals("abc", firstResult(str.substring(two, five))); } @Test From 0cff0fc799b659df5cafada9473119a93b8b2b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 24 Jun 2016 11:19:31 +0300 Subject: [PATCH 2/2] Fix numeric type usage --- .../src/main/java/com/querydsl/core/types/Template.java | 9 +++++++-- .../java/com/querydsl/core/types/TemplateFactory.java | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/Template.java b/querydsl-core/src/main/java/com/querydsl/core/types/Template.java index 5fb578c35..4508c547a 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/Template.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/Template.java @@ -284,15 +284,20 @@ public final class Template implements Serializable { private final int index1; - private final BigDecimal arg2; + private final Number arg2; - private final Expression expr2; + private final Expression expr2; private final Operator operator; private final boolean asString; + @Deprecated public OperationConst(int index1, BigDecimal arg2, Operator operator, boolean asString) { + this(index1, (Number) arg2, operator, asString); + } + + public OperationConst(int index1, Number arg2, Operator operator, boolean asString) { this.index1 = index1; this.arg2 = arg2; this.expr2 = Expressions.constant(arg2); diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/TemplateFactory.java b/querydsl-core/src/main/java/com/querydsl/core/types/TemplateFactory.java index 2b563f9fd..c6dca7dd9 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/TemplateFactory.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/TemplateFactory.java @@ -231,7 +231,12 @@ public class TemplateFactory { elements.add(new Template.Operation(index, index2, operator, asString)); } else if (m.group(5) != null) { Operator operator = OPERATORS.get(m.group(3)); - BigDecimal number = new BigDecimal(m.group(5)); + Number number; + if (m.group(5).contains(".")) { + number = new BigDecimal(m.group(5)); + } else { + number = Integer.valueOf(m.group(5)); + } elements.add(new Template.OperationConst(index, number, operator, asString)); } else if (asString) { elements.add(new Template.AsString(index));