This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits 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 0ece00976 CAY-2971 Remove extra spaces within SQL parenthesis
0ece00976 is described below
commit 0ece00976133d3740e943c83e081c654b0f77e70
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jul 5 19:55:16 2026 -0400
CAY-2971 Remove extra spaces within SQL parenthesis
handling "- 1"
---
.../access/sqlbuilder/sqltree/NegateNode.java | 42 ++++++++++++++++++++++
.../translator/select/QualifierTranslator.java | 5 +--
.../translator/select/QualifierTranslatorIT.java | 2 +-
.../translator/select/QualifierTranslatorTest.java | 8 ++---
.../cayenne/exp/parser/ASTFunctionCallMathIT.java | 10 ++++++
5 files changed, 59 insertions(+), 8 deletions(-)
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NegateNode.java
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NegateNode.java
new file mode 100644
index 000000000..7f782b65a
--- /dev/null
+++
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NegateNode.java
@@ -0,0 +1,42 @@
+/*****************************************************************
+ * 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.access.sqlbuilder.sqltree;
+
+import org.apache.cayenne.access.sqlbuilder.SQLAppendable;
+import org.apache.cayenne.access.sqlbuilder.SQLGenerationContext;
+
+/**
+ * Unary minus. Emits the {@code -} sign hugging its operand ({@code -1}),
rather than treating it as a separated
+ * token ({@code - 1}).
+ *
+ * @since 5.0
+ */
+public class NegateNode extends Node {
+
+ @Override
+ public SQLAppendable append(SQLAppendable buffer, SQLGenerationContext
context) {
+ return
buffer.appendTokenSeparator().append('-').suppressNextTokenSeparator();
+ }
+
+ @Override
+ public Node copy() {
+ return new NegateNode();
+ }
+}
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 ba2327322..78cf33f8d 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
@@ -34,6 +34,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.EqualNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.InNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.LikeNode;
+import org.apache.cayenne.access.sqlbuilder.sqltree.NegateNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
import org.apache.cayenne.access.sqlbuilder.sqltree.NotEqualNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.NotNode;
@@ -241,8 +242,8 @@ class QualifierTranslator implements TraversalHandler {
expressionsToSkip.add(node);
return new ValueNode(null, false, null, false);
}
- // we need to add minus sign as a prefix, not a separator
- return new FunctionNode(expToStr(node.getType()), null, false);
+ // the minus sign is a prefix that hugs its operand (-1, not -
1)
+ return new NegateNode();
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 3a2d93bd5..8c2c51ec1 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
@@ -116,7 +116,7 @@ public class QualifierTranslatorIT {
SQLGenerationVisitor visitor = new SQLGenerationVisitor(new
DefaultSQLAppendable(null), null);
node.visit(visitor);
- assertEquals(" cft.NAME = - 1", visitor.getSQLString());
+ assertEquals(" cft.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 9cbd9f60e..f3b74a989 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
@@ -168,11 +168,11 @@ public class QualifierTranslatorTest {
@Test
public void translateNegate_NumberScalar() {
Node node = translate("-1");
- assertInstanceOf(FunctionNode.class, node);
+ assertInstanceOf(NegateNode.class, node);
SQLGenerationVisitor visitor = new SQLGenerationVisitor(new
DefaultSQLAppendable(null), null);
node.visit(visitor);
- assertEquals(" - 1", visitor.getSQLString());
+ assertEquals(" -1", visitor.getSQLString());
}
@Test
@@ -339,9 +339,7 @@ public class QualifierTranslatorTest {
{
Node op = translate("-2");
- assertInstanceOf(FunctionNode.class, op);
- assertEquals("-", ((FunctionNode)op).getFunctionName());
- assertNull(((FunctionNode) op).getAlias());
+ assertInstanceOf(NegateNode.class, op);
assertEquals(1, op.getChildrenCount());
}
diff --git
a/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallMathIT.java
b/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallMathIT.java
index 650eb5d7a..e67ccbb3b 100644
---
a/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallMathIT.java
+++
b/cayenne/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallMathIT.java
@@ -94,4 +94,14 @@ public class ASTFunctionCallMathIT {
Expression exp = ExpressionFactory.exp("10 - mod(sqrt(abs(-9)), 2)");
assertEquals(BigDecimal.valueOf(9L), exp.evaluate(new Object()));
}
+
+ @Test
+ public void aSTNegate() throws Exception {
+ TablePrimitives p1 = createPrimitives(-7);
+
+ // unary minus applied to a column translates to "-INT_COLUMN = ?";
verify it round-trips
+ TablePrimitives p2 = ObjectSelect.query(TablePrimitives.class)
+ .where(ExpressionFactory.exp("-intColumn =
7")).selectOne(env.context());
+ assertEquals(p1, p2);
+ }
}