View Javadoc

1   /*
2    * #%L
3    * ToPIA :: Persistence
4    * 
5    * $Id: TopiaQueryTest.java 2416 2012-03-02 10:08:59Z tchemit $
6    * $HeadURL: http://svn.nuiton.org/svn/topia/tags/topia-2.8/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java $
7    * %%
8    * Copyright (C) 2004 - 2010 CodeLutin
9    * %%
10   * This program is free software: you can redistribute it and/or modify
11   * it under the terms of the GNU Lesser General Public License as 
12   * published by the Free Software Foundation, either version 3 of the 
13   * License, or (at your option) any later version.
14   * 
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Lesser Public License for more details.
19   * 
20   * You should have received a copy of the GNU General Lesser Public 
21   * License along with this program.  If not, see
22   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
23   * #L%
24   */
25  
26  package org.nuiton.topia.framework;
27  
28  import org.apache.commons.logging.Log;
29  import org.apache.commons.logging.LogFactory;
30  import org.junit.Assert;
31  import org.junit.Test;
32  import org.nuiton.topia.persistence.TopiaEntity;
33  import org.nuiton.topiatest.QueriedEntity;
34  
35  /** @author fdesbois */
36  public class TopiaQueryTest {
37  
38      private static final Log log = LogFactory.getLog(TopiaQueryTest.class);
39  
40      @Test
41      public void testAdd() {
42  
43          // Test with one paramValue
44          String value = "topia";
45          TopiaQuery query = new TopiaQuery(QueriedEntity.class);
46          query.addEquals(QueriedEntity.PROPERTY_TEST_ADD, value);
47          Assert.assertEquals(
48                  "FROM org.nuiton.topiatest.QueriedEntity " +
49                  "WHERE testAdd = :testAdd",
50                  query.fullQuery());
51  
52          // Test with null paramValue
53          //String nullValue = null;
54          query = new TopiaQuery(QueriedEntity.class);
55          query.addEquals(QueriedEntity.PROPERTY_TEST_ADD, new Object[]{null});
56          Assert.assertEquals(
57                  "FROM org.nuiton.topiatest.QueriedEntity " +
58                  "WHERE testAdd IS NULL",
59                  query.fullQuery());
60  
61          // Test with two paramValues
62          String value2 = "eugene";
63          query = new TopiaQuery(QueriedEntity.class);
64          query.addEquals(QueriedEntity.PROPERTY_TEST_ADD, value, value2);
65          Assert.assertEquals(
66                  "FROM org.nuiton.topiatest.QueriedEntity " +
67                  "WHERE testAdd IN (:testAdd1, :testAdd2)",
68                  query.fullQuery());
69  
70          // Test with two paramValues + null
71          query = new TopiaQuery(QueriedEntity.class);
72          query.addEquals(QueriedEntity.PROPERTY_TEST_ADD, value, value2, null);
73          Assert.assertEquals(
74                  "FROM org.nuiton.topiatest.QueriedEntity " +
75                  "WHERE testAdd IN (:testAdd1, :testAdd2) OR testAdd IS NULL",
76                  query.fullQuery());
77      }
78  
79      @Test
80      public void testAddSubQuery() {
81  
82          // Test 1 : Subquery with two params with different values
83          TopiaQuery query = new TopiaQuery(QueriedEntity.class).
84                  addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value1");
85          // Exist 2 params
86          Assert.assertEquals(2, query.getParams().size());
87  
88          TopiaQuery subquery = new TopiaQuery(QueriedEntity.class).
89                  addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value2");
90  
91          query.addSubQuery("Q1 = (?)", subquery);
92          log.debug(query);
93          // Add other params from subquery
94          Assert.assertEquals(4, query.getParams().size());
95  
96  
97          // Test 2 : Subquery with two params with different values
98          // one of them is null
99          query = new TopiaQuery(QueriedEntity.class).
100                 addWhere(QueriedEntity.PROPERTY_TEST_ADD, TopiaQuery.Op.EQ, null);
101         // Exist 0 param (null value)
102         Assert.assertEquals(0, query.getParams().size());
103 
104         subquery = new TopiaQuery(QueriedEntity.class).
105                 addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value1");
106 
107         query.addSubQuery("Q1 = (?)", subquery);
108         log.debug(query);
109         // Add 2 params from subquery
110         Assert.assertEquals(2, query.getParams().size());
111 
112 
113         // Test 3 : Subquery with two params with same value
114         query = new TopiaQuery(QueriedEntity.class, "Q1").
115                 addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value1");
116         // Exist 2 params
117         Assert.assertEquals(2, query.getParams().size());
118 
119         subquery = new TopiaQuery(QueriedEntity.class, "Q2").
120                 addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value1");
121 
122         query.addSubQuery("Q1 = (?)", subquery);
123         log.debug(query);
124         // Still 2 params
125         Assert.assertEquals(2, query.getParams().size());
126 
127         // non-regression test, when parameters of main query is not empty
128         // and sub-query use different parameters from the one used in the
129         // main query, parameters needed by the subquery are lost in the
130         // resulting query
131 
132         // Test 4 : add a subquery with its own parameters
133         query = new TopiaQuery(QueriedEntity.class, "Q1").
134                 addEquals(QueriedEntity.TOPIA_ID, "ID1");
135 
136         subquery = new TopiaQuery(QueriedEntity.class, "Q2").
137                 addEquals(QueriedEntity.PROPERTY_TEST_ADD, "value");
138 
139         query.addSubQuery(QueriedEntity.PROPERTY_TEST_ADD + " IN (?)", subquery);
140 
141         log.debug(query);
142         Assert.assertEquals(4, query.getParams().size());
143     }
144 
145     /** Test of addFilter method, of class TopiaQuery. */
146     @Test
147     public void testAddFilter() {
148         log.info("testAddFilter");
149 
150         EntityFilter filter = new TopiaFilter();
151         filter.setStartIndex(1);
152         filter.setEndIndex(40);
153         filter.setOrderBy(QueriedEntity.PROPERTY_TEST_ADD);
154 
155         TopiaQuery query = new TopiaQuery(QueriedEntity.class).addFilter(filter);
156 
157         log.debug("Query : " + query);
158 
159         Assert.assertEquals("FROM " + QueriedEntity.class.getName() +
160                             " ORDER BY " + QueriedEntity.PROPERTY_TEST_ADD,
161                             query.fullQuery());
162 
163         filter.setOrderBy(null);
164 
165         query = new TopiaQuery(QueriedEntity.class).addFilter(filter);
166 
167         log.debug("Query : " + query);
168 
169         Assert.assertEquals("FROM " + QueriedEntity.class.getName() +
170                             " ORDER BY " + TopiaEntity.TOPIA_CREATE_DATE + " DESC",
171                             query.fullQuery());
172 
173     }
174 
175     @Test
176     // cf http://nuiton.org/issues/1745
177     public void testWhereWithFunction() {
178 
179         TopiaQuery query = new TopiaQuery(QueriedEntity.class);
180         query.addWhere("lower(name)", TopiaQuery.Op.LIKE, "%azerty%");
181 
182         log.debug("Query : " + query);
183 
184         Assert.assertEquals("FROM " + QueriedEntity.class.getName() +
185                             " WHERE lower(name) LIKE :lower_name_",
186                             query.fullQuery());
187     }
188 
189 }