This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 438f884ee CAY-2879 Negative number for non parameterized ObjectSelect
query not processed correctly
438f884ee is described below
commit 438f884eecd562a0b895741630bcd9b5f019998f
Author: Nikita Timofeev <[email protected]>
AuthorDate: Fri Jan 31 14:53:37 2025 +0400
CAY-2879 Negative number for non parameterized ObjectSelect query not
processed correctly
---
RELEASE-NOTES.txt | 1 +
.../translator/select/QualifierTranslator.java | 5 +--
.../translator/select/QualifierTranslatorIT.java | 20 +++++++++++
.../translator/select/QualifierTranslatorTest.java | 5 +--
.../apache/cayenne/exp/parser/ASTNegateTest.java | 41 ++++++++++++++++++++++
5 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index ddeee5276..f964462b3 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -21,6 +21,7 @@ Bug Fixes:
CAY-2701 MySQL DST-related LocalDateTime issues
CAY-2871 QualifierTranslator breaks on a relationship with a compound FK
CAY-2872 CayenneModeler "Documentation" link is broken
+CAY-2879 Negative number for non parameterized ObjectSelect query not
processed correctly
----------------------------------
Release: 5.0-M1
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
index 15d31041c..615c9cc2a 100644
---
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
+++
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
@@ -200,7 +200,6 @@ class QualifierTranslator implements TraversalHandler {
case SUBTRACT:
case MULTIPLY:
case DIVIDE:
- case NEGATIVE:
case BITWISE_AND:
case BITWISE_LEFT_SHIFT:
case BITWISE_OR:
@@ -213,7 +212,9 @@ class QualifierTranslator implements TraversalHandler {
case GREATER_THAN:
case GREATER_THAN_EQUAL_TO:
return new OpExpressionNode(expToStr(node.getType()));
-
+ case NEGATIVE:
+ // we need to add minus sign as a prefix, not a separator
+ return new FunctionNode(expToStr(node.getType()), null, false);
case TRUE:
case FALSE:
case ASTERISK:
diff --git
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
index 40eb34cc3..40843cc9f 100644
---
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
+++
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
@@ -24,6 +24,7 @@ import
org.apache.cayenne.access.sqlbuilder.SQLGenerationVisitor;
import org.apache.cayenne.access.sqlbuilder.StringBuilderAppendable;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.ObjectSelect;
import org.apache.cayenne.runtime.CayenneRuntime;
import org.apache.cayenne.test.jdbc.DBHelper;
@@ -109,4 +110,23 @@ public class QualifierTranslatorIT extends RuntimeCase {
assertEquals(" ( ( t0.F_KEY1 = 'PK1' ) AND ( t0.F_KEY2 = 'PK2' ) ) OR
( ( t0.F_KEY1 = 'PK3' ) AND ( t0.F_KEY2 = 'PK4' ) )", visitor.getSQLString());
}
+ @Test
+ public void testCAY_2879() {
+ ObjectSelect<CompoundFkTestEntity> query =
ObjectSelect.query(CompoundFkTestEntity.class)
+ .where(ExpressionFactory.exp("name = -1"));
+
+ DefaultSelectTranslator translator
+ = new DefaultSelectTranslator(query,
runtime.getDataDomain().getDefaultNode().getAdapter(),
context.getEntityResolver());
+
+ QualifierTranslator qualifierTranslator =
translator.getContext().getQualifierTranslator();
+
+ Node node = qualifierTranslator.translate(query.getWhere());
+
+ SQLGenerationVisitor visitor = new SQLGenerationVisitor(new
StringBuilderAppendable());
+ node.visit(visitor);
+
+ assertEquals(" t0.NAME = - 1", visitor.getSQLString());
+
+ }
+
}
diff --git
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
index 5ff5a2665..efe89d619 100644
---
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
+++
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
@@ -310,8 +310,9 @@ public class QualifierTranslatorTest {
{
Node op = translate("-2");
- assertThat(op, instanceOf(OpExpressionNode.class));
- assertEquals("-", ((OpExpressionNode)op).getOp());
+ assertThat(op, instanceOf(FunctionNode.class));
+ assertEquals("-", ((FunctionNode)op).getFunctionName());
+ assertNull(((FunctionNode) op).getAlias());
assertEquals(1, op.getChildrenCount());
}
diff --git
a/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java
b/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java
new file mode 100644
index 000000000..9e692e5cc
--- /dev/null
+++ b/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ *
+ * https://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.
+ ****************************************************************/
+
+package org.apache.cayenne.exp.parser;
+
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ASTNegateTest {
+
+ @Test
+ public void testParse() {
+ // we don't have negative numbers, it's a combination of ASTNegate and
Scalar
+ Expression exp = ExpressionFactory.exp("-1");
+ Object operand = exp.getOperand(0);
+
+ assertTrue(exp instanceof ASTNegate);
+ assertEquals(1, operand);
+ assertEquals("-1", exp.toString());
+ }
+
+}
\ No newline at end of file