1 /*
2    Copyright (c) 2013, 2021, Oracle and/or its affiliates.
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License, version 2.0,
6    as published by the Free Software Foundation.
7 
8    This program is also distributed with certain software (including
9    but not limited to OpenSSL) that is licensed under separate terms,
10    as designated in a particular file or component or in included license
11    documentation.  The authors of MySQL hereby grant you an additional
12    permission to link the program and your derivative works with the
13    separately licensed software that they have included with MySQL.
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 Public License, version 2.0, for more details.
19 
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
23 */
24 
25 package testsuite.clusterj;
26 
27 import java.util.ArrayList;
28 import java.util.List;
29 
30 import com.mysql.clusterj.Query;
31 import com.mysql.clusterj.Query.Ordering;
32 import com.mysql.clusterj.query.Predicate;
33 import com.mysql.clusterj.query.PredicateOperand;
34 import com.mysql.clusterj.query.QueryBuilder;
35 import com.mysql.clusterj.query.QueryDomainType;
36 
37 import testsuite.clusterj.model.ConversationSummary;
38 
39 public class Bug17200163Test extends AbstractClusterJModelTest {
40 
41     protected int NUMBER_TO_INSERT = 10;
42 
43     /** The instances for testing. */
44     protected List<ConversationSummary> instances = new ArrayList<ConversationSummary>();
45 
46     @Override
localSetUp()47     public void localSetUp() {
48         createSessionFactory();
49         session = sessionFactory.getSession();
50         createInstances(NUMBER_TO_INSERT);
51         tx = session.currentTransaction();
52         tx.begin();
53         session.deletePersistentAll(ConversationSummary.class);
54         tx.commit();
55         addTearDownClasses(ConversationSummary.class);
56     }
57 
test()58     public void test() {
59         insert();
60         testQuery(0, 4, 6);
61         failOnError();
62     }
63 
insert()64     protected void insert() {
65         // insert instances
66         tx = session.currentTransaction();
67         tx.begin();
68 
69         int count = 0;
70 
71         for (int i = 0; i < NUMBER_TO_INSERT; ++i) {
72             // must be done with an active transaction
73             session.makePersistent(instances.get(i));
74             ++count;
75         }
76         tx.commit();
77     }
78 
testQuery(long userId, long startDate, long endDate)79     protected void testQuery(long userId, long startDate, long endDate) {
80         QueryBuilder builder = session.getQueryBuilder();
81         QueryDomainType<ConversationSummary> domain =
82         builder.createQueryDefinition(ConversationSummary.class);
83 
84         Predicate compare = null;
85         PredicateOperand column = domain.get("sourceUserId");
86         PredicateOperand param = domain.param("filter_sourceUserId");
87         compare = column.equal(param);
88 
89         PredicateOperand column2 = domain.get("updatedAt");
90         PredicateOperand param2 = domain.param("filter_updatedAt1");
91         compare = compare.and(column2.greaterEqual(param2));
92 
93         PredicateOperand column3 = domain.get("updatedAt");
94         PredicateOperand param3 = domain.param("filter_updatedAt2");
95         compare = compare.and(column3.lessEqual(param3));
96 
97         domain.where(compare);
98 
99         Query<ConversationSummary> query = session.createQuery(domain);
100         query.setParameter("filter_sourceUserId", userId);
101         query.setParameter("filter_updatedAt1", startDate);
102         query.setParameter("filter_updatedAt2", endDate);
103         query.setLimits(0, 2);
104         query.setOrdering(Ordering.DESCENDING, "updatedAt");
105 
106         List<Long> expected = new ArrayList<Long>();
107         expected.add((long)6);
108         expected.add((long)5);
109         List<Long> actual = new ArrayList<Long>();
110         List<ConversationSummary> results = query.getResultList();
111         for (ConversationSummary result: results) {
112             actual.add(result.getAnswererId());
113         }
114         errorIfNotEqual("Results of query with ordering and limits for ConversationSummary", expected, actual);
115     }
116 
createInstances(int number)117     protected void createInstances(int number) {
118         for (int i = 0; i < number; ++i) {
119             ConversationSummary instance = session.newInstance(ConversationSummary.class);
120             instance.setSourceUserId(0);
121             instance.setAnswererId(i);
122             instance.setDestUserId(i);
123             instance.setLastMessageById(i);
124             instance.setQueryHistoryId(i);
125             instance.setText("Text " + i);
126             instance.setUpdatedAt(i);
127             instance.setViewed(0 == (i%2)?true:false);
128             instances.add(instance);
129         }
130     }
131 
132 
133 }
134