diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java index 95771f5752..00fdd0800c 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java @@ -88,6 +88,7 @@ import static org.jooq.impl.DSL.greatest; import static org.jooq.impl.DSL.hour; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.least; +import static org.jooq.impl.DSL.left; import static org.jooq.impl.DSL.length; import static org.jooq.impl.DSL.ln; import static org.jooq.impl.DSL.log; @@ -107,6 +108,7 @@ import static org.jooq.impl.DSL.rad; import static org.jooq.impl.DSL.rand; import static org.jooq.impl.DSL.repeat; import static org.jooq.impl.DSL.replace; +import static org.jooq.impl.DSL.right; import static org.jooq.impl.DSL.round; import static org.jooq.impl.DSL.rpad; import static org.jooq.impl.DSL.rtrim; @@ -556,6 +558,29 @@ extends BaseTest result = create().select( + left(val("abcde"), 3), + right(val("abcde"), 3)).fetchOne(); + + assertEquals("abc", result.value1()); + assertEquals("cde", result.value2()); + + result = + create().select( + left(TAuthor_FIRST_NAME(), 3), + right(TAuthor_FIRST_NAME(), 3)) + .from(TAuthor()) + .where(TAuthor_ID().equal(1)) + .fetchOne(); + + assertEquals("Geo", result.value1()); + assertEquals("rge", result.value2()); + } + @Test public void testFunctionsOnStrings_REPEAT() throws Exception { diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 5630cba889..e07d7585bc 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -2020,6 +2020,11 @@ public abstract class jOOQAbstractTest< new FunctionTests(this).testFunctionsOnStrings_SUBSTRING(); } + @Test + public void testFunctionsOnStrings_LEFT_RIGHT() throws Exception { + new FunctionTests(this).testFunctionsOnStrings_LEFT_RIGHT(); + } + @Test public void testFunctionsOnStrings_REPEAT() throws Exception { new FunctionTests(this).testFunctionsOnStrings_REPEAT(); diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 2d25483249..0838750627 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -6967,6 +6967,110 @@ public class DSL { return new Substring(nullSafe(field), nullSafe(startingPosition), nullSafe(length)); } + /** + * Get the left outermost characters from a string. + *

+ * Example: + *

+     * 'abc' = LEFT('abcde', 3)
+     * 
+ */ + @Support + public static Field left(String field, int length) { + return left(Utils.field(field), Utils.field(length)); + } + + /** + * Get the left outermost characters from a string. + *

+ * Example: + *

+     * 'abc' = LEFT('abcde', 3)
+     * 
+ */ + @Support + public static Field left(String field, Field length) { + return left(Utils.field(field), nullSafe(length)); + } + + /** + * Get the left outermost characters from a string. + *

+ * Example: + *

+     * 'abc' = LEFT('abcde', 3)
+     * 
+ */ + @Support + public static Field left(Field field, int length) { + return left(nullSafe(field), Utils.field(length)); + } + + /** + * Get the left outermost characters from a string. + *

+ * Example: + *

+     * 'abc' = LEFT('abcde', 3)
+     * 
+ */ + @Support + public static Field left(Field field, Field length) { + return new Left(field, length); + } + + /** + * Get the right outermost characters from a string. + *

+ * Example: + *

+     * 'cde' = RIGHT('abcde', 3)
+     * 
+ */ + @Support + public static Field right(String field, int length) { + return right(Utils.field(field), Utils.field(length)); + } + + /** + * Get the right outermost characters from a string. + *

+ * Example: + *

+     * 'cde' = RIGHT('abcde', 3)
+     * 
+ */ + @Support + public static Field right(String field, Field length) { + return right(Utils.field(field), nullSafe(length)); + } + + /** + * Get the right outermost characters from a string. + *

+ * Example: + *

+     * 'cde' = RIGHT('abcde', 3)
+     * 
+ */ + @Support + public static Field right(Field field, int length) { + return right(nullSafe(field), Utils.field(length)); + } + + /** + * Get the right outermost characters from a string. + *

+ * Example: + *

+     * 'cde' = RIGHT('abcde', 3)
+     * 
+ */ + @Support + public static Field right(Field field, Field length) { + return new Right(field, length); + } + /** * Get the length of a VARCHAR type. This is a synonym for * {@link #charLength(String)}. diff --git a/jOOQ/src/main/java/org/jooq/impl/Left.java b/jOOQ/src/main/java/org/jooq/impl/Left.java new file mode 100644 index 0000000000..4d0d64235f --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/Left.java @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) + * All rights reserved. + * + * This work is dual-licensed + * - under the Apache Software License 2.0 (the "ASL") + * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") + * ============================================================================= + * You may choose which license applies to you: + * + * - If you're using this work with Open Source databases, you may choose + * either ASL or jOOQ License. + * - If you're using this work with at least one commercial database, you must + * choose jOOQ License + * + * For more information, please visit http://www.jooq.org/licenses + * + * Apache Software License 2.0: + * ----------------------------------------------------------------------------- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * jOOQ License and Maintenance Agreement: + * ----------------------------------------------------------------------------- + * Data Geekery grants the Customer the non-exclusive, timely limited and + * non-transferable license to install and use the Software under the terms of + * the jOOQ License and Maintenance Agreement. + * + * This library is distributed with a LIMITED WARRANTY. See the jOOQ License + * and Maintenance Agreement for more details: http://www.jooq.org/licensing + */ +package org.jooq.impl; + +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.inline; + +import org.jooq.Configuration; +import org.jooq.Field; +import org.jooq.QueryPart; + +/** + * @author Lukas Eder + */ +class Left extends AbstractFunction { + + /** + * Generated UID + */ + private static final long serialVersionUID = 2200760781944082146L; + + private Field field; + private Field length; + + Left(Field field, Field length) { + super("left", field.getDataType()); + + this.field = field; + this.length = length; + } + + @Override + final QueryPart getFunction0(Configuration configuration) { + switch (configuration.dialect().family()) { + /* [pro] xx + xxxx xxxxxxx + xx [/pro] */ + case DERBY: + case SQLITE: + return DSL.substring(field, inline(1), length); + + /* [pro] xx + xxxx xxxx + xxxx xxxxxxx + xxxx xxxxxxxxxx + xxxx xxxxxxx + xx [/pro] */ + case CUBRID: + case FIREBIRD: + case H2: + case HSQLDB: + case MARIADB: + case MYSQL: + case POSTGRES: + default: + return field("{left}({0}, {1})", field, length); + } + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/Right.java b/jOOQ/src/main/java/org/jooq/impl/Right.java new file mode 100644 index 0000000000..249b041d81 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/Right.java @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) + * All rights reserved. + * + * This work is dual-licensed + * - under the Apache Software License 2.0 (the "ASL") + * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") + * ============================================================================= + * You may choose which license applies to you: + * + * - If you're using this work with Open Source databases, you may choose + * either ASL or jOOQ License. + * - If you're using this work with at least one commercial database, you must + * choose jOOQ License + * + * For more information, please visit http://www.jooq.org/licenses + * + * Apache Software License 2.0: + * ----------------------------------------------------------------------------- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * jOOQ License and Maintenance Agreement: + * ----------------------------------------------------------------------------- + * Data Geekery grants the Customer the non-exclusive, timely limited and + * non-transferable license to install and use the Software under the terms of + * the jOOQ License and Maintenance Agreement. + * + * This library is distributed with a LIMITED WARRANTY. See the jOOQ License + * and Maintenance Agreement for more details: http://www.jooq.org/licensing + */ +package org.jooq.impl; + +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.one; + +import org.jooq.Configuration; +import org.jooq.Field; +import org.jooq.QueryPart; + +/** + * @author Lukas Eder + */ +class Right extends AbstractFunction { + + /** + * Generated UID + */ + private static final long serialVersionUID = 2200760781944082146L; + + private Field field; + private Field length; + + Right(Field field, Field length) { + super("right", field.getDataType()); + + this.field = field; + this.length = length; + } + + @Override + final QueryPart getFunction0(Configuration configuration) { + switch (configuration.dialect().family()) { + case DERBY: + return DSL.substring(field, field.length().add(one()).sub(length)); + + /* [pro] xx + xxxx xxxxxxx + xx [/pro] */ + case SQLITE: + return DSL.substring(field, length.neg()); + + /* [pro] xx + xxxx xxxx + xxxx xxxxxxx + xxxx xxxxxxxxxx + xxxx xxxxxxx + xx [/pro] */ + case CUBRID: + case FIREBIRD: + case H2: + case HSQLDB: + case MARIADB: + case MYSQL: + case POSTGRES: + default: + return field("{right}({0}, {1})", field, length); + } + } +}