You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/05/20 01:30:03 UTC
svn commit: r776495 - in /openjpa/trunk:
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
Author: faywang
Date: Tue May 19 23:30:03 2009
New Revision: 776495
URL: http://svn.apache.org/viewvc?rev=776495&view=rev
Log:
OPENJPA-1013: non-default escape character support
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java?rev=776495&r1=776494&r2=776495&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java Tue May 19 23:30:03 2009
@@ -40,6 +40,7 @@
import javax.persistence.EntityManager;
import javax.persistence.Parameter;
+import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
@@ -51,8 +52,9 @@
/**
* Tests type-strict version of Criteria API.
- * The test scenarios are from TestEJBQLCondExpression in
- * org.apache.openjpa.persistence.jpql.expressions.
+ * The test scenarios are adapted from TestEJBQLCondExpression in
+ * org.apache.openjpa.persistence.jpql.expressions and
+ * TestEJBQLFunction in org.apache.openjpa.persistence.jpql.functions.
*
*/
public class TestTypeSafeCondExpression extends SQLListenerTestCase {
@@ -219,7 +221,6 @@
em.clear();
}
- @AllowFailure
public void testLikeExprUsingCriteria2() {
String query =
"SELECT o.computerName FROM CompUser o WHERE o.name LIKE 'Sha%o_' AND " +
@@ -229,7 +230,7 @@
Root<CompUser> c = q.from(CompUser.class);
q.where(cb.and(
cb.like(c.get(CompUser_.name),"Sha%o_"),
- cb.in(c.get(CompUser_.computerName)).value("PC").negate()
+ cb.in(c.get(CompUser_.computerName)).value("UNIX").negate()
));
q.select(c.get(CompUser_.computerName));
assertEquivalence(q, query);
@@ -240,7 +241,6 @@
em.clear();
}
- @AllowFailure
public void testLikeExprUsingCriteria3() {
String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE '_J%'";
@@ -256,7 +256,6 @@
em.clear();
}
- @AllowFailure
public void testLikeExprUsingCriteria4() {
String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE ?1 ESCAPE '|'";
CriteriaQuery q = cb.create();
@@ -264,7 +263,7 @@
Parameter<String> param = cb.parameter(String.class);
q.where(cb.like(c.get(CompUser_.name), param, '|'));
q.select(c.get(CompUser_.name));
- assertEquivalence(q, query);
+ assertEquivalence(q, query, new Object[] {"%|_%"});
List result = em.createQuery(q).setParameter(1, "%|_%").getResultList();
assertNotNull(result);
@@ -430,6 +429,201 @@
em.clear();
}
+ @AllowFailure
+ public void testConcatSubStringFunc1() {
+ String query = "select " +
+ "CONCAT('Ablahum', SUBSTRING(e.name, LOCATE('e', e.name), 4)) " +
+ "From CompUer e WHERE e.name='Seetha'";
+ CriteriaQuery q = cb.create();
+ q = cb.create();
+ Root<CompUser> e = q.from(CompUser.class);
+ q.select(
+ cb.concat("Ablahum",
+ cb.substring(
+ e.get(CompUser_.name),
+ cb.locate(e.get(CompUser_.name), "e"),
+ cb.literal(4)
+ )
+ )
+ );
+ assertEquivalence(q, query);
+
+ em.clear();
+ }
+/*
+ public void testConcatSubStringFunc2() {
+ String query = "select e.name From CompUser e where e.firstName = " +
+ "CONCAT('Ablahum', SUBSTRING(e.name, LOCATE('e', e.name), 4)) ";
+ em.clear();
+ }
+
+ public void testConcatSubStringFunc3() {
+ String query = "select " +
+ "CONCAT('XYZ', SUBSTRING(e.name, LOCATE('e', e.name))) " +
+ "From CompUser e WHERE e.name='Ablahumeeth'";
+ em.clear();
+ }
+
+ public void testConcatSubStringFunc4() {
+ String query = "select e.name from CompUser e where e.firstName = " +
+ "CONCAT('XYZ', SUBSTRING(e.name, LOCATE('e', e.name))) ";
+ em.clear();
+ }
+
+ public void testConcatFunc() {
+ String query = "select " +
+ "CONCAT('', '') From CompUser WHERE e.name='Seetha'";
+ em.clear();
+ }
+
+ public void testTrimFunc1() {
+ String query = "select Trim(e.name) From CompUser e WHERE e.name='Shannon '";
+ em.clear();
+ }
+
+ public void testTrimFunc2() {
+ String query = "select e.name From CompUser e where Trim(e.name) ='Shannon'";
+ em.clear();
+ }
+
+ public void testLowerFunc1() {
+ String query = "select LOWER(e.name) From CompUser e WHERE e.name='Ugo'";
+ em.clear();
+ }
+
+ public void testLowerFunc2() {
+ String query = "select e.name From CompUser e where LOWER(e.name) ='ugo'";
+ em.clear();
+ }
+
+ public void testUpperFunc1() {
+ String query = "select UPPER(e.name) From CompUser e WHERE e.name='Ugo'";
+ em.clear();
+ }
+
+ public void testUpperFunc2() {
+ String query = "select e.name from CompUser e where UPPER(e.name)='UGO'";
+ em.clear();
+ }
+
+ public void testLengthFunc() {
+ String query = "SELECT o.name FROM CompUser o " +
+ "WHERE LENGTH(o.address.country) = 3";
+ em.clear();
+ }
+
+ public void testArithmFunc1() {
+ String query =
+ "select ABS(e.age) From CompUser e WHERE e.name='Seetha'";
+ }
+
+ public void testArithmFunc2() {
+ String query =
+ "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
+ }
+
+ public void testArithmFunc3() {
+ String query =
+ "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
+ }
+
+ public void testArithmFunc4() {
+ String query = "SELECT e.name FROM CompUser e WHERE SIZE(e.nicknames) = 6";
+ em.clear();
+ }
+
+ public void testGroupByHavingClause() {
+ String query =
+ "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name LIKE 'S%'";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(3, result.size());
+ assertTrue(result.contains("Shannon "));
+ assertTrue(result.contains("Shade"));
+ assertTrue(result.contains("Seetha"));
+
+ em.clear();
+ }
+
+ public void testOrderByClause() {
+ String query =
+ "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' ORDER BY c.name";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(3, result.size());
+ assertTrue(result.contains("Shannon "));
+ assertTrue(result.contains("Seetha"));
+ assertTrue(result.contains("Shade"));
+
+ em.clear();
+ }
+
+ public void testAVGAggregFunc() {
+ //To be Tested: AVG, COUNT, MAX, MIN, SUM
+ String query = "SELECT AVG(e.age) FROM CompUser e";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.contains(25));
+
+ em.clear();
+ }
+
+ public void testCOUNTAggregFunc() {
+ String query = "SELECT COUNT(c.name) FROM CompUser c";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.contains(6l));
+
+ em.clear();
+ }
+
+ public void testMAXAggregFunc() {
+ String query = "SELECT DISTINCT MAX(c.age) FROM CompUser c";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.contains(36));
+
+ em.clear();
+ }
+
+ public void testMINAggregFunc() {
+ String query = "SELECT DISTINCT MIN(c.age) FROM CompUser c";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.contains(10));
+
+ em.clear();
+ }
+
+ public void testSUMAggregFunc() {
+ String query = "SELECT SUM(c.age) FROM CompUser c";
+
+ List result = em.createQuery(query).getResultList();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.contains(153l));
+
+ em.clear();
+ }
+*/
+
void startTx(EntityManager em) {
em.getTransaction().begin();
}
@@ -453,6 +647,29 @@
assertEquals(jSQL, cSQL);
}
+ void assertEquivalence(CriteriaQuery c, String jpql,
+ Object[] params) {
+ sql.clear();
+ Query q = em.createQuery(c);
+ for (int i = 0; i < params.length; i++) {
+ q.setParameter(i+1, params[i]);
+ }
+ List cList = q.getResultList();
+ assertEquals(1, sql.size());
+ String cSQL = sql.get(0);
+
+ sql.clear();
+ Query q1 = em.createQuery(jpql);
+ for (int i = 0; i < params.length; i++) {
+ q1.setParameter(i+1, params[i]);
+ }
+ List jList = q1.getResultList();
+ assertEquals(1, sql.size());
+ String jSQL = sql.get(0);
+
+ assertEquals(jSQL, cSQL);
+ }
+
public CompUser createUser(String name, String cName, Address add, int age,
boolean isMale) {
CompUser user = null;
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=776495&r1=776494&r2=776495&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Tue May 19 23:30:03 2009
@@ -728,7 +728,9 @@
ExpressionFactory factory, MetamodelImpl model,
CriteriaQuery q) {
String escapeStr = escapeChar == null ? null :
- Expressions.toValue(escapeChar, factory, model, q).toString();
+ ((Character)((Literal)Expressions.toValue(
+ escapeChar, factory, model, q)).getValue()).toString();
+
return factory.matches(
Expressions.toValue(str, factory, model, q),
Expressions.toValue(pattern, factory, model, q), "_", "%",