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);
+    }
 }

Reply via email to