You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/07/31 22:41:58 UTC
svn commit: r561507 - in
/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src:
main/java/org/apache/cayenne/access/jdbc/
test/java/org/apache/cayenne/access/ test/resources/dml/
Author: aadamchik
Date: Tue Jul 31 13:41:57 2007
New Revision: 561507
URL: http://svn.apache.org/viewvc?view=rev&rev=561507
Log:
CAY-837 EJBQL Update Statement Support
(initial update translator - binding strings and ints works)
Added:
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLUpdateTest.java
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLUpdateTest.xml
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLUpdateTranslator.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLUpdateTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLUpdateTranslator.java?view=diff&rev=561507&r1=561506&r2=561507
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLUpdateTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLUpdateTranslator.java Tue Jul 31 13:41:57 2007
@@ -70,8 +70,10 @@
protected void appendMultiColumnPath(EJBQLMultiColumnOperand operand) {
throw new EJBQLException("Multi-column paths are unsupported in UPDATEs");
}
-
- public boolean visitUpdateField(EJBQLExpression expression, int finishedChildIndex) {
+
+ public boolean visitUpdateField(
+ EJBQLExpression expression,
+ int finishedChildIndex) {
return visitPath(expression, finishedChildIndex);
}
};
@@ -82,6 +84,39 @@
public boolean visitUpdateValue(EJBQLExpression expression) {
context.append(" =");
+ return true;
+ }
+
+ public boolean visitStringLiteral(EJBQLExpression expression) {
+ if (expression.getText() == null) {
+ context.append("null");
+ }
+ else {
+ // note that String Literal text is already wrapped in single quotes, with
+ // quotes that are part of the string escaped.
+ context.append(" #bind(").append(expression.getText()).append(" 'VARCHAR')");
+ }
+
+ return true;
+ }
+
+ public boolean visitIntegerLiteral(EJBQLExpression expression) {
+ if (expression.getText() == null) {
+ context.append("null");
+ }
+ else {
+ Object value;
+
+ try {
+ value = new Integer(expression.getText());
+ }
+ catch (NumberFormatException nfex) {
+ throw new EJBQLException("Invalid integer: " + expression.getText());
+ }
+
+ String var = context.bindParameter(value);
+ context.append(" #bind($").append(var).append(" 'INTEGER')");
+ }
return true;
}
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLUpdateTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLUpdateTest.java?view=auto&rev=561507
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLUpdateTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLUpdateTest.java Tue Jul 31 13:41:57 2007
@@ -0,0 +1,82 @@
+/*****************************************************************
+ * 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
+ *
+ * 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.
+ ****************************************************************/
+package org.apache.cayenne.access;
+
+import org.apache.cayenne.DataObjectUtils;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.QueryResponse;
+import org.apache.cayenne.query.EJBQLQuery;
+import org.apache.cayenne.unit.CayenneCase;
+
+public class DataContextEJBQLUpdateTest extends CayenneCase {
+
+ protected void setUp() throws Exception {
+ deleteTestData();
+ }
+
+ public void testUpdateNoQualifier() throws Exception {
+ createTestData("prepare");
+
+ ObjectContext context = createDataContext();
+
+ EJBQLQuery check = new EJBQLQuery("select count(p) from Painting p "
+ + "WHERE p.paintingTitle is NULL or p.paintingTitle <> 'XX'");
+
+ Object notUpdated = DataObjectUtils.objectForQuery(context, check);
+ assertEquals(new Long(2l), notUpdated);
+
+ String ejbql = "UPDATE Painting AS p SET p.paintingTitle = 'XX'";
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+
+ QueryResponse result = context.performGenericQuery(query);
+
+ int[] count = result.firstUpdateCount();
+ assertNotNull(count);
+ assertEquals(1, count.length);
+ assertEquals(2, count[0]);
+
+ notUpdated = DataObjectUtils.objectForQuery(context, check);
+ assertEquals(new Long(0l), notUpdated);
+ }
+
+ public void testUpdateNoQualifierMultipleItems() throws Exception {
+ createTestData("prepare");
+
+ ObjectContext context = createDataContext();
+
+ EJBQLQuery check = new EJBQLQuery("select count(p) from Painting p "
+ + "WHERE p.estimatedPrice is NULL or p.estimatedPrice <> 1");
+
+ Object notUpdated = DataObjectUtils.objectForQuery(context, check);
+ assertEquals(new Long(2l), notUpdated);
+
+ String ejbql = "UPDATE Painting AS p SET p.paintingTitle = 'XX', p.estimatedPrice = 1";
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+
+ QueryResponse result = context.performGenericQuery(query);
+
+ int[] count = result.firstUpdateCount();
+ assertNotNull(count);
+ assertEquals(1, count.length);
+ assertEquals(2, count[0]);
+
+ notUpdated = DataObjectUtils.objectForQuery(context, check);
+ assertEquals(new Long(0l), notUpdated);
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLUpdateTest.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLUpdateTest.xml?view=auto&rev=561507
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLUpdateTest.xml (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLUpdateTest.xml Tue Jul 31 13:41:57 2007
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans default-lazy-init="true">
+ <!-- ======================================= -->
+ <!-- Named Queries -->
+ <!-- ======================================= -->
+
+ <bean id="P11" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+ <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+ <constructor-arg><value>
+ INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', NULL, 3000)
+ </value></constructor-arg>
+ </bean>
+
+ <bean id="P12" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+ <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+ <constructor-arg><value>
+ INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', NULL, 5000)
+ </value></constructor-arg>
+ </bean>
+
+
+ <!-- ======================================= -->
+ <!-- Data Sets -->
+ <!-- ======================================= -->
+
+ <bean id="prepare" class="java.util.ArrayList">
+ <constructor-arg>
+ <list>
+ <ref bean="P11"/>
+ <ref bean="P12"/>
+ </list>
+ </constructor-arg>
+ </bean>
+</beans>
\ No newline at end of file