KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > repository > test > AbstractQueryTest


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.repository.test;
17
18 import org.outerj.daisy.repository.testsupport.AbstractDaisyTestCase;
19 import org.outerj.daisy.repository.*;
20 import org.outerj.daisy.repository.schema.RepositorySchema;
21 import org.outerj.daisy.repository.schema.FieldType;
22 import org.outerj.daisy.repository.schema.DocumentType;
23 import org.outerj.daisy.repository.user.Role;
24 import org.outerj.daisy.repository.query.QueryManager;
25 import org.outerj.daisy.repository.query.SortOrder;
26 import org.outerx.daisy.x10.SearchResultDocument;
27 import org.outerx.daisy.x10.DistinctSearchResultDocument;
28
29 import java.util.Locale JavaDoc;
30 import java.util.Map JavaDoc;
31 import java.util.HashMap JavaDoc;
32
33 public abstract class AbstractQueryTest extends AbstractDaisyTestCase {
34
35     public void testQuerying() throws Exception JavaDoc {
36         RepositoryManager repositoryManager = getRepositoryManager();
37
38         TestContentCreator contentCreator = new TestContentCreator();
39         contentCreator.run(repositoryManager);
40
41         System.err.println("Sleeping a little while to give fulltextinder time to do its job.");
42         Thread.sleep(10000);
43
44         Repository testuserRepository = repositoryManager.getRepository(new Credentials("testuser", "testuser"));
45         testuserRepository.switchRole(Role.ADMINISTRATOR);
46         QueryManager queryManager = testuserRepository.getQueryManager();
47
48         // Admin user should have access to all documents
49
String JavaDoc query = "select id where true order by id";
50         VariantKey[] resultKeys = queryManager.performQueryReturnKeys(query, Locale.US);
51         assertEquals(12, resultKeys.length);
52
53
54         Repository user1Repository = repositoryManager.getRepository(new Credentials("user1", "user1"));
55         queryManager = user1Repository.getQueryManager();
56
57         //
58
// Test fulltext search
59
//
60
SearchResultDocument searchResultDoc = queryManager.performQuery("select name where FullText('verzamelaars')", Locale.US);
61         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
62         assertEquals("Document1", searchResultDoc.getSearchResult().getRows().getRowArray()[0].getValueArray()[0]);
63         long document1Id = searchResultDoc.getSearchResult().getRows().getRowArray()[0].getDocumentId();
64
65         //
66
// Test ACL filtering
67
//
68
resultKeys = queryManager.performQueryReturnKeys("select name where name = 'Document3'", Locale.US);
69         assertEquals(1, resultKeys.length);
70
71         resultKeys = queryManager.performQueryReturnKeys("select name where name = 'Document6'", Locale.US);
72         assertEquals(0, resultKeys.length);
73
74         //
75
// Test LinksTo function / link extraction
76
//
77
resultKeys = queryManager.performQueryReturnKeys("select name where LinksTo(" + document1Id + ", 1, 0)", Locale.US);
78         assertEquals(1, resultKeys.length);
79
80         //
81
//
82
//
83
Repository user2Repository = repositoryManager.getRepository(new Credentials("user2", "user2"));
84         queryManager = user2Repository.getQueryManager();
85
86         resultKeys = queryManager.performQueryReturnKeys("select name where InCollection('collection2')", Locale.US);
87         assertEquals(1, resultKeys.length);
88
89         //
90
// Some tests on IS NULL
91
//
92
resultKeys = queryManager.performQueryReturnKeys("select id where $field1 like 'something-%' and ($field2 != 2323 or $field2 is null)", Locale.US);
93         assertEquals(1, resultKeys.length);
94
95         queryManager = user1Repository.getQueryManager();
96         resultKeys = queryManager.performQueryReturnKeys("select id where $field2 is null and InCollection('collection1')", Locale.US);
97         assertEquals(4, resultKeys.length);
98
99         resultKeys = queryManager.performQueryReturnKeys("select id where InCollection('collection2') and $field2 is null", Locale.US);
100         assertEquals(1, resultKeys.length);
101
102         resultKeys = queryManager.performQueryReturnKeys("select id where $field2 is null and InCollection('collection2') and $field2 is null", Locale.US);
103         assertEquals(1, resultKeys.length);
104
105         resultKeys = queryManager.performQueryReturnKeys("select id where $field2 is null and InCollection('collection2') and $field2 is null", Locale.US);
106         assertEquals(1, resultKeys.length);
107
108         resultKeys = queryManager.performQueryReturnKeys("select id where $field1 is not null", Locale.US);
109         assertEquals(2, resultKeys.length);
110
111         resultKeys = queryManager.performQueryReturnKeys("select id where #xyz is null", Locale.US);
112         assertEquals(10, resultKeys.length);
113
114         resultKeys = queryManager.performQueryReturnKeys("select id where #xyz is not null", Locale.US);
115         assertEquals(1, resultKeys.length);
116
117         resultKeys = queryManager.performQueryReturnKeys("select id where #xyz = 123", Locale.US);
118         assertEquals(1, resultKeys.length);
119
120         resultKeys = queryManager.performQueryReturnKeys("select id where #xyz is null or #xyz != 123", Locale.US);
121         assertEquals(10, resultKeys.length);
122
123         resultKeys = queryManager.performQueryReturnKeys("select id where #xyz != 123 or #xyz is null", Locale.US);
124         assertEquals(10, resultKeys.length);
125
126         //
127
// Some tests on InCollection
128
//
129
resultKeys = queryManager.performQueryReturnKeys("select id where InCollection('collection2') or InCollection('collection1')", Locale.US);
130         assertEquals(5, resultKeys.length);
131
132         resultKeys = queryManager.performQueryReturnKeys("select id where InCollection('collection2','collection1')", Locale.US);
133         assertEquals(5, resultKeys.length);
134
135         resultKeys = queryManager.performQueryReturnKeys("select id where InCollection('collection3') and InCollection('collection4')", Locale.US);
136         assertEquals(1, resultKeys.length);
137
138         //
139
// Test various conditions on various kinds of fields
140
//
141
resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'hello' and $DateField1 = '2004-12-06' and $DateTimeField1 = '2004-10-14 12:13:14' and $DecimalField1 = 678.94321 and $DoubleField1 = 123.456", Locale.US);
142         assertEquals(1, resultKeys.length);
143
144         // dates
145
resultKeys = queryManager.performQueryReturnKeys("select id where $DateField1 >= '2004-12-06' and $DateField1 <= '2004-12-06'", Locale.US);
146         assertEquals(1, resultKeys.length);
147
148         resultKeys = queryManager.performQueryReturnKeys("select id where $DateField1 >= '2004-12-06' and $DateField1 < '2004-12-11'", Locale.US);
149         assertEquals(2, resultKeys.length);
150
151         resultKeys = queryManager.performQueryReturnKeys("select id where $DateField1 != '2004-12-06' and InCollection('collection5')", Locale.US);
152         assertEquals(1, resultKeys.length);
153
154         // strings
155
resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 like '%hello' and InCollection('collection5')", Locale.US);
156         assertEquals(2, resultKeys.length);
157
158         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 not like '%hello' and InCollection('collection5')", Locale.US);
159         assertEquals(0, resultKeys.length);
160
161         // longs
162
resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 = 1978 or $LongField1 = 1985 OR $LongField1 = 1990 and $LongField1 != 1991 and InCollection('collection5')", Locale.US);
163         assertEquals(3, resultKeys.length);
164
165            // - same but with InCollection in another location
166
resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 = 1978 or $LongField1 = 1985 OR $LongField1 = 1990 and InCollection('collection5') and $LongField1 != 1991", Locale.US);
167         assertEquals(3, resultKeys.length);
168
169         resultKeys = queryManager.performQueryReturnKeys("select id where ($LongField1 = 1978 and InCollection('collection5')) or ($LongField1 = 1985 and InCollection('collection5'))", Locale.US);
170         assertEquals(2, resultKeys.length);
171
172         queryManager = user2Repository.getQueryManager();
173         resultKeys = queryManager.performQueryReturnKeys("select id where ($LongField1 = 1978 and InCollection('collection5')) or ($field2 = 34 and InCollection('collection2'))", Locale.US);
174         assertEquals(2, resultKeys.length);
175
176         queryManager = user1Repository.getQueryManager();
177         resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 between 1977 and 1979", Locale.US);
178         assertEquals(1, resultKeys.length);
179
180         resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 in (1978,1985)", Locale.US);
181         assertEquals(2, resultKeys.length);
182
183         resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 not in (1978,1985)", Locale.US);
184         assertEquals(1, resultKeys.length);
185
186         //doubles
187
resultKeys = queryManager.performQueryReturnKeys("select id where $DoubleField1 > 123 and $DoubleField1 < 124", Locale.US);
188         assertEquals(1, resultKeys.length);
189
190         //
191
// Combinations (checks that eg joining works well)
192
//
193
resultKeys = queryManager.performQueryReturnKeys("select id where name = 'Document11' and $LongField1 = 1990 and documentType = 'doctype3'", Locale.US);
194         assertEquals(1, resultKeys.length);
195
196         resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 = 1990 and name = 'Document11' and documentType = 'doctype3'", Locale.US);
197         assertEquals(1, resultKeys.length);
198
199         resultKeys = queryManager.performQueryReturnKeys("select id where $LongField1 = 1990 and documentType = 'doctype3' and name = 'Document11'", Locale.US);
200         assertEquals(1, resultKeys.length);
201
202         //
203
// Test query options
204
//
205
resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'boe'", Locale.US);
206         assertEquals(0, resultKeys.length);
207
208         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'boe' option search_last_version = 'true'", Locale.US);
209         assertEquals(1, resultKeys.length);
210
211         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'ba'", Locale.US);
212         assertEquals(0, resultKeys.length);
213
214         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'ba' option include_retired = 'true'", Locale.US);
215         assertEquals(1, resultKeys.length);
216
217         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 in('boe','ba') option include_retired = 'true', search_last_version = 'true'", Locale.US);
218         assertEquals(2, resultKeys.length);
219
220         //
221
// Test externally defined query options
222
//
223
Map JavaDoc myQueryOptions = new HashMap JavaDoc();
224         myQueryOptions.put("search_last_version", "true");
225         resultKeys = queryManager.performQueryReturnKeys("select id where $StringField1 = 'boe'", null, myQueryOptions, Locale.US);
226         assertEquals(1, resultKeys.length);
227
228         //
229
// Test limit clause
230
//
231
resultKeys = queryManager.performQueryReturnKeys("select id where InCollection('collection2','collection1') limit 2", Locale.US);
232         assertEquals(2, resultKeys.length);
233
234         //
235
// Test order by
236
//
237
searchResultDoc = queryManager.performQuery("select name, $StringField1 where $StringField1 like '%hello' and InCollection('collection5') order by $StringField1 asc, id desc", Locale.US);
238         assertEquals("another hello", searchResultDoc.getSearchResult().getRows().getRowArray()[0].getValueArray()[1]);
239         assertEquals("hello", searchResultDoc.getSearchResult().getRows().getRowArray()[1].getValueArray()[1]);
240
241         //
242
// Test multi-values
243
//
244
Repository repository = repositoryManager.getRepository(new Credentials("testuser", "testuser"));
245         repository.switchRole(Role.ADMINISTRATOR);
246         RepositorySchema schema = repository.getRepositorySchema();
247         FieldType multiValueField1 = schema.createFieldType("multiValueField1", ValueType.STRING, true);
248         multiValueField1.save();
249         DocumentType documentType = schema.createDocumentType("docWithMultiValueFields");
250         documentType.addFieldType(multiValueField1, true);
251         documentType.save();
252         Document mvDoc1 = repository.createDocument("mv doc 1", documentType.getId());
253         mvDoc1.setField("multiValueField1", new Object JavaDoc[] {"mv 1", "mv 2", "mv 3"});
254         mvDoc1.save();
255         Document mvDoc2 = repository.createDocument("mv doc 2", documentType.getId());
256         mvDoc2.setField("multiValueField1", new Object JavaDoc[] {"mv 1", "abc"});
257         mvDoc2.save();
258
259         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType = 'docWithMultiValueFields'", Locale.US);
260         SearchResultDocument.SearchResult.Rows.Row.MultiValue[] multiValues = searchResultDoc.getSearchResult().getRows().getRowArray()[0].getMultiValueArray();
261         assertEquals("mv 1", multiValues[0].getValueArray(0));
262         assertEquals("mv 2", multiValues[0].getValueArray(1));
263         assertEquals("mv 3", multiValues[0].getValueArray(2));
264
265         // .valueCount
266
searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where $multiValueField1.valueCount = 3", Locale.US);
267         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
268         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1.valueCount = 1", Locale.US);
269         assertEquals(0, searchResultDoc.getSearchResult().getRows().getRowArray().length);
270
271         // has all
272
searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('mv 1', 'mv 2')", Locale.US);
273         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
274         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('mv 1')", Locale.US);
275         assertEquals(2, searchResultDoc.getSearchResult().getRows().getRowArray().length);
276         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('rrrrrr')", Locale.US);
277         assertEquals(0, searchResultDoc.getSearchResult().getRows().getRowArray().length);
278
279         // has exactly
280
searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has exactly ('mv 1', 'abc')", Locale.US);
281         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
282         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has exactly ('mv 1', 'mv 2')", Locale.US);
283         assertEquals(0, searchResultDoc.getSearchResult().getRows().getRowArray().length);
284
285         // has any
286
searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has any ('mv 1', 'koekoek', 'mv 2', 'jaja')", Locale.US);
287         assertEquals(2, searchResultDoc.getSearchResult().getRows().getRowArray().length);
288         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has some ('koekoek', 'mv 2', 'jaja')", Locale.US);
289         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
290
291         // has none
292
searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has none ('mv 1')", Locale.US);
293         assertEquals(0, searchResultDoc.getSearchResult().getRows().getRowArray().length);
294         searchResultDoc = queryManager.performQuery("select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has none ('patati patata')", Locale.US);
295         assertEquals(2, searchResultDoc.getSearchResult().getRows().getRowArray().length);
296
297         //
298
// Test link field type
299
//
300
searchResultDoc = queryManager.performQuery("select name, $LinkField1, $LinkField2 where $LinkField1 is not null", Locale.US);
301         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
302         assertEquals("daisy:666@1:1", searchResultDoc.getSearchResult().getRows().getRowArray(0).getMultiValueArray(0).getLinkValueArray(1).getStringValue());
303
304         searchResultDoc = queryManager.performQuery("select name, $LinkField1, $LinkField2 where $LinkField1.branchId = 1 and $LinkField1.languageId = 1", Locale.US);
305         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
306
307         searchResultDoc = queryManager.performQuery("select name, $LinkField1, $LinkField2 where $LinkField1.branch = 'main' and $LinkField1.language = 'default'", Locale.US);
308         assertEquals(1, searchResultDoc.getSearchResult().getRows().getRowArray().length);
309
310         //
311
// Distinct query test
312
//
313
DistinctSearchResultDocument distinctResultDoc = queryManager.performDistinctQuery("select $StringField1 where $StringField1 is not null", SortOrder.NONE, Locale.US);
314         assertEquals(2, distinctResultDoc.getDistinctSearchResult().getValues().getValueArray().length);
315     }
316
317     protected boolean resetDataStores() {
318         return true;
319     }
320
321     protected abstract RepositoryManager getRepositoryManager() throws Exception JavaDoc;
322 }
323
Popular Tags