PageRenderTime 38ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/cayenne-3.0.1/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 321 lines | 232 code | 64 blank | 25 comment | 1 complexity | d057f72231681b7ff784a7aab26c5781 MD5 | raw file
  1. /*****************************************************************
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. ****************************************************************/
  19. package org.apache.cayenne.access.jdbc;
  20. import java.util.Collections;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
  24. import org.apache.cayenne.ejbql.EJBQLParser;
  25. import org.apache.cayenne.ejbql.EJBQLParserFactory;
  26. import org.apache.cayenne.query.EJBQLQuery;
  27. import org.apache.cayenne.query.SQLTemplate;
  28. import org.apache.cayenne.unit.CayenneCase;
  29. public class EJBQLSelectTranslatorTest extends CayenneCase {
  30. private SQLTemplate translateSelect(String ejbql) {
  31. return translateSelect(ejbql, Collections.EMPTY_MAP);
  32. }
  33. private SQLTemplate translateSelect(
  34. String ejbql,
  35. final Map<Integer, Object> queryParameters) {
  36. EJBQLParser parser = EJBQLParserFactory.getParser();
  37. EJBQLCompiledExpression select = parser.compile(ejbql, getDomain()
  38. .getEntityResolver());
  39. EJBQLQuery query = new EJBQLQuery(ejbql) {
  40. @Override
  41. public Map<Integer, Object> getPositionalParameters(){
  42. return queryParameters;
  43. }
  44. };
  45. EJBQLTranslationContext tr = new EJBQLTranslationContext(getDomain()
  46. .getEntityResolver(), query, select, new JdbcEJBQLTranslatorFactory());
  47. select.getExpression().visit(new EJBQLSelectTranslator(tr));
  48. return tr.getQuery();
  49. }
  50. public void testSelectFrom() {
  51. SQLTemplate query = translateSelect("select a from Artist a");
  52. String sql = query.getDefaultTemplate();
  53. // column order is unpredictable, just need to ensure that they are all there
  54. assertTrue(sql, sql.startsWith("SELECT"));
  55. assertTrue(sql, sql.indexOf("t0.ARTIST_ID") > 0);
  56. assertTrue(sql, sql.indexOf("t0.ARTIST_NAME") > 0);
  57. assertTrue(sql, sql.indexOf("t0.DATE_OF_BIRTH") > 0);
  58. assertTrue(sql, sql.endsWith(" FROM ARTIST t0"));
  59. }
  60. public void testSelectMultipleJoinsToTheSameTable() throws Exception {
  61. SQLTemplate query = translateSelect("SELECT a "
  62. + "FROM Artist a JOIN a.paintingArray b JOIN a.paintingArray c "
  63. + "WHERE b.paintingTitle = 'P1' AND c.paintingTitle = 'P2'");
  64. String sql = query.getDefaultTemplate();
  65. assertTrue(sql, sql.startsWith("SELECT"));
  66. assertTrue(sql, sql
  67. .indexOf("INNER JOIN PAINTING t1 ON (t0.ARTIST_ID = t1.ARTIST_ID)") > 0);
  68. assertTrue(sql, sql
  69. .indexOf("INNER JOIN PAINTING t2 ON (t0.ARTIST_ID = t2.ARTIST_ID)") > 0);
  70. }
  71. public void testSelectImplicitColumnJoins() throws Exception {
  72. SQLTemplate query = translateSelect("SELECT a.paintingArray.toGallery.galleryName "
  73. + "FROM Artist a JOIN a.paintingArray b");
  74. String sql = query.getDefaultTemplate();
  75. assertTrue(sql, sql.startsWith("SELECT"));
  76. // check that overlapping implicit and explicit joins did not result in duplicates
  77. assertTrue(sql, sql.contains("INNER JOIN GALLERY"));
  78. assertTrue(sql, sql.contains("INNER JOIN PAINTING"));
  79. int i1 = sql.indexOf("INNER JOIN PAINTING");
  80. assertTrue(sql, i1 >= 0);
  81. // TODO: andrus 1/6/2008 - this fails
  82. // int i2 = sql.indexOf("INNER JOIN PAINTING", i1 + 1);
  83. // assertTrue(sql, i2 < 0);
  84. }
  85. public void testSelectDistinct() {
  86. SQLTemplate query = translateSelect("select distinct a from Artist a");
  87. String sql = query.getDefaultTemplate();
  88. assertTrue(sql, sql.startsWith("SELECT DISTINCT "));
  89. }
  90. public void testSelectFromWhereEqual() {
  91. SQLTemplate query = translateSelect("select a from Artist a where a.artistName = 'Dali'");
  92. String sql = query.getDefaultTemplate();
  93. assertTrue(sql, sql.startsWith("SELECT"));
  94. assertTrue(sql, sql.endsWith(" FROM ARTIST t0 WHERE t0.ARTIST_NAME ="
  95. + " #bind('Dali' 'VARCHAR')"));
  96. }
  97. public void testSelectFromWhereOrEqual() {
  98. SQLTemplate query = translateSelect("select a from Artist a where a.artistName = 'Dali' "
  99. + "or a.artistName = 'Malevich'");
  100. String sql = query.getDefaultTemplate();
  101. SQLTemplate query1 = translateSelect("select a from Artist a where a.artistName = 'Picasso' "
  102. + "or a.artistName = 'Malevich' "
  103. + "or a.artistName = 'Dali'");
  104. String sql1 = query1.getDefaultTemplate();
  105. assertTrue(sql, sql.startsWith("SELECT"));
  106. assertTrue(sql, sql.indexOf(" FROM ARTIST t0 WHERE ") > 0);
  107. assertEquals(1, countDelimiters(sql, " OR ", sql.indexOf("WHERE ")));
  108. assertTrue(sql1, sql1.startsWith("SELECT"));
  109. assertTrue(sql1, sql.indexOf(" FROM ARTIST t0 WHERE ") > 0);
  110. assertEquals(2, countDelimiters(sql1, " OR ", sql.indexOf("WHERE ")));
  111. }
  112. public void testSelectFromWhereAndEqual() {
  113. SQLTemplate query = translateSelect("select a from Artist a where a.artistName = 'Dali' "
  114. + "and a.artistName = 'Malevich'");
  115. String sql = query.getDefaultTemplate();
  116. SQLTemplate query1 = translateSelect("select a from Artist a where a.artistName = 'Picasso' "
  117. + "and a.artistName = 'Malevich' "
  118. + "and a.artistName = 'Dali'");
  119. String sql1 = query1.getDefaultTemplate();
  120. assertTrue(sql, sql.startsWith("SELECT"));
  121. assertTrue(sql, sql.indexOf("WHERE ") > 0);
  122. assertEquals(1, countDelimiters(sql, " AND ", sql.indexOf("WHERE ")));
  123. assertTrue(sql1, sql1.startsWith("SELECT"));
  124. assertTrue(sql1, sql1.indexOf("WHERE ") > 0);
  125. assertEquals(2, countDelimiters(sql1, " AND ", sql1.indexOf("WHERE ")));
  126. }
  127. public void testSelectFromWhereNot() {
  128. SQLTemplate query = translateSelect("select a from Artist a where not (a.artistName = 'Dali')");
  129. String sql = query.getDefaultTemplate();
  130. assertTrue(sql, sql.startsWith("SELECT"));
  131. assertTrue(sql, sql.endsWith("WHERE NOT "
  132. + "t0.ARTIST_NAME = #bind('Dali' 'VARCHAR')"));
  133. }
  134. public void testSelectFromWhereGreater() {
  135. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice > 1.0");
  136. String sql = query.getDefaultTemplate();
  137. assertTrue(sql, sql.startsWith("SELECT"));
  138. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE > #bind($id0 'DECIMAL')"));
  139. }
  140. public void testSelectFromWhereGreaterOrEqual() {
  141. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice >= 2");
  142. String sql = query.getDefaultTemplate();
  143. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE >= #bind($id0 'INTEGER')"));
  144. }
  145. public void testSelectFromWhereLess() {
  146. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice < 1.0");
  147. String sql = query.getDefaultTemplate();
  148. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE < #bind($id0 'DECIMAL')"));
  149. }
  150. public void testSelectFromWhereLessOrEqual() {
  151. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice <= 1.0");
  152. String sql = query.getDefaultTemplate();
  153. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE <= #bind($id0 'DECIMAL')"));
  154. }
  155. public void testSelectFromWhereNotEqual() {
  156. SQLTemplate query = translateSelect("select a from Artist a where a.artistName <> 'Dali'");
  157. String sql = query.getDefaultTemplate();
  158. assertTrue(sql, sql.endsWith("WHERE t0.ARTIST_NAME <> #bind('Dali' 'VARCHAR')"));
  159. }
  160. public void testSelectFromWhereBetween() {
  161. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice between 3 and 5");
  162. String sql = query.getDefaultTemplate();
  163. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE "
  164. + "BETWEEN #bind($id0 'INTEGER') AND #bind($id1 'INTEGER')"));
  165. }
  166. public void testSelectFromWhereNotBetween() {
  167. SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice not between 3 and 5");
  168. String sql = query.getDefaultTemplate();
  169. assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE "
  170. + "NOT BETWEEN #bind($id0 'INTEGER') AND #bind($id1 'INTEGER')"));
  171. }
  172. public void testSelectFromWhereLike() {
  173. SQLTemplate query = translateSelect("select p from Painting p where p.paintingTitle like 'Stuff'");
  174. String sql = query.getDefaultTemplate();
  175. assertTrue(sql, sql.endsWith("WHERE t0.PAINTING_TITLE "
  176. + "LIKE #bind('Stuff' 'VARCHAR')"));
  177. }
  178. public void testSelectFromWhereNotLike() {
  179. SQLTemplate query = translateSelect("select p from Painting p where p.paintingTitle NOT like 'Stuff'");
  180. String sql = query.getDefaultTemplate();
  181. assertTrue(sql, sql.endsWith("WHERE t0.PAINTING_TITLE "
  182. + "NOT LIKE #bind('Stuff' 'VARCHAR')"));
  183. }
  184. public void testSelectPositionalParameters() {
  185. Map<Integer, Object> params = new HashMap<Integer, Object>();
  186. params.put(new Integer(1), "X");
  187. params.put(new Integer(2), "Y");
  188. SQLTemplate query = translateSelect(
  189. "select a from Artist a where a.artistName = ?1 or a.artistName = ?2",
  190. params);
  191. String sql = query.getDefaultTemplate();
  192. assertTrue(sql, sql
  193. .endsWith("t0.ARTIST_NAME = #bind($id0) OR t0.ARTIST_NAME = #bind($id1)"));
  194. }
  195. public void testMax() {
  196. SQLTemplate query = translateSelect("select max(p.estimatedPrice) from Painting p");
  197. String sql = query.getDefaultTemplate();
  198. assertTrue(sql, sql.startsWith("SELECT "
  199. + "#result('MAX(t0.ESTIMATED_PRICE)' 'java.math.BigDecimal' 'sc0') "
  200. + "FROM PAINTING t0"));
  201. }
  202. public void testDistinctSum() {
  203. SQLTemplate query = translateSelect("select sum( distinct p.estimatedPrice) from Painting p");
  204. String sql = query.getDefaultTemplate();
  205. assertTrue(
  206. sql,
  207. sql
  208. .startsWith("SELECT #result('SUM(DISTINCT t0.ESTIMATED_PRICE)' 'java.math.BigDecimal' 'sc0') "
  209. + "FROM PAINTING t0"));
  210. }
  211. public void testColumnPaths() {
  212. SQLTemplate query = translateSelect("select p.estimatedPrice, p.toArtist.artistName from Painting p");
  213. String sql = query.getDefaultTemplate();
  214. assertTrue(sql, sql.startsWith("SELECT "
  215. + "#result('t0.ESTIMATED_PRICE' 'java.math.BigDecimal' 'sc0' 'sc0' 3), "
  216. + "#result('t1.ARTIST_NAME' 'java.lang.String' 'sc1' 'sc1' 1) FROM"));
  217. }
  218. private int countDelimiters(String string, String delim, int fromIndex) {
  219. int i = 0;
  220. while ((fromIndex = string.indexOf(delim, fromIndex)) >= 0) {
  221. fromIndex += delim.length();
  222. i++;
  223. }
  224. return i;
  225. }
  226. // if parameter value is null (in this test x := null) we will generate "IS NULL"
  227. public void testEqualsNullParameter() {
  228. String ejbql = "select p from Painting p WHERE p.toArtist=:x";
  229. EJBQLParser parser = EJBQLParserFactory.getParser();
  230. EJBQLCompiledExpression select = parser.compile(ejbql, getDomain()
  231. .getEntityResolver());
  232. EJBQLQuery query = new EJBQLQuery(ejbql);
  233. query.setParameter("x", null);
  234. EJBQLTranslationContext tr = new EJBQLTranslationContext(getDomain()
  235. .getEntityResolver(), query, select, new JdbcEJBQLTranslatorFactory());
  236. select.getExpression().visit(new EJBQLSelectTranslator(tr));
  237. String sql = tr.getQuery().getDefaultTemplate();
  238. assertTrue(sql, sql
  239. .endsWith("t0.ARTIST_ID IS NULL"));
  240. }
  241. // if parameter value is null and more than one parameter in query
  242. public void testEqualsNullAndNotNullParameter() {
  243. String ejbql = "select p from Painting p WHERE p.toArtist=:x OR p.toArtist.artistName=:b";
  244. EJBQLParser parser = EJBQLParserFactory.getParser();
  245. EJBQLCompiledExpression select = parser.compile(ejbql, getDomain()
  246. .getEntityResolver());
  247. EJBQLQuery query = new EJBQLQuery(ejbql);
  248. query.setParameter("x", null);
  249. query.setParameter("b", "Y");
  250. EJBQLTranslationContext tr = new EJBQLTranslationContext(getDomain()
  251. .getEntityResolver(), query, select, new JdbcEJBQLTranslatorFactory());
  252. select.getExpression().visit(new EJBQLSelectTranslator(tr));
  253. String sql = tr.getQuery().getDefaultTemplate();
  254. assertTrue(sql, sql
  255. .endsWith("t0.ARTIST_ID IS NULL OR t1.ARTIST_NAME = #bind($id0)"));
  256. }
  257. }