001: /*
002: * Copyright 2004 Outerthought bvba and Schaubroeck nv
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.outerj.daisy.repository.test;
017:
018: import org.outerj.daisy.repository.testsupport.AbstractDaisyTestCase;
019: import org.outerj.daisy.repository.*;
020: import org.outerj.daisy.repository.schema.RepositorySchema;
021: import org.outerj.daisy.repository.schema.FieldType;
022: import org.outerj.daisy.repository.schema.DocumentType;
023: import org.outerj.daisy.repository.user.Role;
024: import org.outerj.daisy.repository.query.QueryManager;
025: import org.outerj.daisy.repository.query.SortOrder;
026: import org.outerj.daisy.repository.query.QueryHelper;
027: import org.outerx.daisy.x10.SearchResultDocument;
028: import org.outerx.daisy.x10.DistinctSearchResultDocument;
029:
030: import java.util.Locale;
031: import java.util.Map;
032: import java.util.HashMap;
033:
034: public abstract class AbstractQueryTest extends AbstractDaisyTestCase {
035:
036: public void testQuerying() throws Exception {
037: RepositoryManager repositoryManager = getRepositoryManager();
038:
039: TestContentCreator contentCreator = new TestContentCreator();
040: contentCreator.run(repositoryManager);
041:
042: System.err
043: .println("Sleeping a little while to give fulltextinder time to do its job.");
044: Thread.sleep(10000);
045:
046: Repository testuserRepository = repositoryManager
047: .getRepository(new Credentials("testuser", "testuser"));
048: testuserRepository.switchRole(Role.ADMINISTRATOR);
049: QueryManager queryManager = testuserRepository
050: .getQueryManager();
051:
052: // Admin user should have access to all documents
053: String query = "select id where true order by id";
054: VariantKey[] resultKeys = queryManager.performQueryReturnKeys(
055: query, Locale.US);
056: assertEquals(12, resultKeys.length);
057:
058: Repository user1Repository = repositoryManager
059: .getRepository(new Credentials("user1", "user1"));
060: queryManager = user1Repository.getQueryManager();
061:
062: //
063: // Test fulltext search
064: //
065: SearchResultDocument searchResultDoc = queryManager
066: .performQuery(
067: "select name where FullText('verzamelaars')",
068: Locale.US);
069: assertEquals(1, searchResultDoc.getSearchResult().getRows()
070: .getRowArray().length);
071: assertEquals("Document1", searchResultDoc.getSearchResult()
072: .getRows().getRowArray()[0].getValueArray()[0]);
073: String document1Id = searchResultDoc.getSearchResult()
074: .getRows().getRowArray()[0].getDocumentId();
075:
076: //
077: // Test ACL filtering
078: //
079: resultKeys = queryManager.performQueryReturnKeys(
080: "select name where name = 'Document3'", Locale.US);
081: assertEquals(1, resultKeys.length);
082:
083: resultKeys = queryManager.performQueryReturnKeys(
084: "select name where name = 'Document6'", Locale.US);
085: assertEquals(0, resultKeys.length);
086:
087: //
088: // Test LinksTo function / link extraction
089: //
090: resultKeys = queryManager.performQueryReturnKeys(
091: "select name where LinksTo("
092: + QueryHelper.formatString(document1Id)
093: + ", 1, 0)", Locale.US);
094: assertEquals(1, resultKeys.length);
095:
096: //
097: //
098: //
099: Repository user2Repository = repositoryManager
100: .getRepository(new Credentials("user2", "user2"));
101: queryManager = user2Repository.getQueryManager();
102:
103: resultKeys = queryManager.performQueryReturnKeys(
104: "select name where InCollection('collection2')",
105: Locale.US);
106: assertEquals(1, resultKeys.length);
107:
108: //
109: // Some tests on IS NULL
110: //
111: resultKeys = queryManager
112: .performQueryReturnKeys(
113: "select id where $field1 like 'something-%' and ($field2 != 2323 or $field2 is null)",
114: Locale.US);
115: assertEquals(1, resultKeys.length);
116:
117: queryManager = user1Repository.getQueryManager();
118: resultKeys = queryManager
119: .performQueryReturnKeys(
120: "select id where $field2 is null and InCollection('collection1')",
121: Locale.US);
122: assertEquals(4, resultKeys.length);
123:
124: resultKeys = queryManager
125: .performQueryReturnKeys(
126: "select id where InCollection('collection2') and $field2 is null",
127: Locale.US);
128: assertEquals(1, resultKeys.length);
129:
130: resultKeys = queryManager
131: .performQueryReturnKeys(
132: "select id where $field2 is null and InCollection('collection2') and $field2 is null",
133: Locale.US);
134: assertEquals(1, resultKeys.length);
135:
136: resultKeys = queryManager
137: .performQueryReturnKeys(
138: "select id where $field2 is null and InCollection('collection2') and $field2 is null",
139: Locale.US);
140: assertEquals(1, resultKeys.length);
141:
142: resultKeys = queryManager.performQueryReturnKeys(
143: "select id where $field1 is not null", Locale.US);
144: assertEquals(2, resultKeys.length);
145:
146: resultKeys = queryManager.performQueryReturnKeys(
147: "select id where #xyz is null", Locale.US);
148: assertEquals(10, resultKeys.length);
149:
150: resultKeys = queryManager.performQueryReturnKeys(
151: "select id where #xyz is not null", Locale.US);
152: assertEquals(1, resultKeys.length);
153:
154: resultKeys = queryManager.performQueryReturnKeys(
155: "select id where #xyz = 123", Locale.US);
156: assertEquals(1, resultKeys.length);
157:
158: resultKeys = queryManager.performQueryReturnKeys(
159: "select id where #xyz is null or #xyz != 123",
160: Locale.US);
161: assertEquals(10, resultKeys.length);
162:
163: resultKeys = queryManager.performQueryReturnKeys(
164: "select id where #xyz != 123 or #xyz is null",
165: Locale.US);
166: assertEquals(10, resultKeys.length);
167:
168: //
169: // Some tests on InCollection
170: //
171: resultKeys = queryManager
172: .performQueryReturnKeys(
173: "select id where InCollection('collection2') or InCollection('collection1')",
174: Locale.US);
175: assertEquals(5, resultKeys.length);
176:
177: resultKeys = queryManager
178: .performQueryReturnKeys(
179: "select id where InCollection('collection2','collection1')",
180: Locale.US);
181: assertEquals(5, resultKeys.length);
182:
183: resultKeys = queryManager
184: .performQueryReturnKeys(
185: "select id where InCollection('collection3') and InCollection('collection4')",
186: Locale.US);
187: assertEquals(1, resultKeys.length);
188:
189: //
190: // Test various conditions on various kinds of fields
191: //
192: resultKeys = queryManager
193: .performQueryReturnKeys(
194: "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",
195: Locale.US);
196: assertEquals(1, resultKeys.length);
197:
198: // dates
199: resultKeys = queryManager
200: .performQueryReturnKeys(
201: "select id where $DateField1 >= '2004-12-06' and $DateField1 <= '2004-12-06'",
202: Locale.US);
203: assertEquals(1, resultKeys.length);
204:
205: resultKeys = queryManager
206: .performQueryReturnKeys(
207: "select id where $DateField1 >= '2004-12-06' and $DateField1 < '2004-12-11'",
208: Locale.US);
209: assertEquals(2, resultKeys.length);
210:
211: resultKeys = queryManager
212: .performQueryReturnKeys(
213: "select id where $DateField1 != '2004-12-06' and InCollection('collection5')",
214: Locale.US);
215: assertEquals(1, resultKeys.length);
216:
217: // strings
218: resultKeys = queryManager
219: .performQueryReturnKeys(
220: "select id where $StringField1 like '%hello' and InCollection('collection5')",
221: Locale.US);
222: assertEquals(2, resultKeys.length);
223:
224: resultKeys = queryManager
225: .performQueryReturnKeys(
226: "select id where $StringField1 not like '%hello' and InCollection('collection5')",
227: Locale.US);
228: assertEquals(0, resultKeys.length);
229:
230: // longs
231: resultKeys = queryManager
232: .performQueryReturnKeys(
233: "select id where $LongField1 = 1978 or $LongField1 = 1985 OR $LongField1 = 1990 and $LongField1 != 1991 and InCollection('collection5')",
234: Locale.US);
235: assertEquals(3, resultKeys.length);
236:
237: // - same but with InCollection in another location
238: resultKeys = queryManager
239: .performQueryReturnKeys(
240: "select id where $LongField1 = 1978 or $LongField1 = 1985 OR $LongField1 = 1990 and InCollection('collection5') and $LongField1 != 1991",
241: Locale.US);
242: assertEquals(3, resultKeys.length);
243:
244: resultKeys = queryManager
245: .performQueryReturnKeys(
246: "select id where ($LongField1 = 1978 and InCollection('collection5')) or ($LongField1 = 1985 and InCollection('collection5'))",
247: Locale.US);
248: assertEquals(2, resultKeys.length);
249:
250: queryManager = user2Repository.getQueryManager();
251: resultKeys = queryManager
252: .performQueryReturnKeys(
253: "select id where ($LongField1 = 1978 and InCollection('collection5')) or ($field2 = 34 and InCollection('collection2'))",
254: Locale.US);
255: assertEquals(2, resultKeys.length);
256:
257: queryManager = user1Repository.getQueryManager();
258: resultKeys = queryManager.performQueryReturnKeys(
259: "select id where $LongField1 between 1977 and 1979",
260: Locale.US);
261: assertEquals(1, resultKeys.length);
262:
263: resultKeys = queryManager
264: .performQueryReturnKeys(
265: "select id where $LongField1 in (1978,1985)",
266: Locale.US);
267: assertEquals(2, resultKeys.length);
268:
269: resultKeys = queryManager.performQueryReturnKeys(
270: "select id where $LongField1 not in (1978,1985)",
271: Locale.US);
272: assertEquals(1, resultKeys.length);
273:
274: //doubles
275: resultKeys = queryManager
276: .performQueryReturnKeys(
277: "select id where $DoubleField1 > 123 and $DoubleField1 < 124",
278: Locale.US);
279: assertEquals(1, resultKeys.length);
280:
281: //
282: // Combinations (checks that eg joining works well)
283: //
284: resultKeys = queryManager
285: .performQueryReturnKeys(
286: "select id where name = 'Document11' and $LongField1 = 1990 and documentType = 'doctype3'",
287: Locale.US);
288: assertEquals(1, resultKeys.length);
289:
290: resultKeys = queryManager
291: .performQueryReturnKeys(
292: "select id where $LongField1 = 1990 and name = 'Document11' and documentType = 'doctype3'",
293: Locale.US);
294: assertEquals(1, resultKeys.length);
295:
296: resultKeys = queryManager
297: .performQueryReturnKeys(
298: "select id where $LongField1 = 1990 and documentType = 'doctype3' and name = 'Document11'",
299: Locale.US);
300: assertEquals(1, resultKeys.length);
301:
302: //
303: // Test query options
304: //
305: resultKeys = queryManager.performQueryReturnKeys(
306: "select id where $StringField1 = 'boe'", Locale.US);
307: assertEquals(0, resultKeys.length);
308:
309: resultKeys = queryManager
310: .performQueryReturnKeys(
311: "select id where $StringField1 = 'boe' option search_last_version = 'true'",
312: Locale.US);
313: assertEquals(1, resultKeys.length);
314:
315: resultKeys = queryManager.performQueryReturnKeys(
316: "select id where $StringField1 = 'ba'", Locale.US);
317: assertEquals(0, resultKeys.length);
318:
319: resultKeys = queryManager
320: .performQueryReturnKeys(
321: "select id where $StringField1 = 'ba' option include_retired = 'true'",
322: Locale.US);
323: assertEquals(1, resultKeys.length);
324:
325: resultKeys = queryManager
326: .performQueryReturnKeys(
327: "select id where $StringField1 in('boe','ba') option include_retired = 'true', search_last_version = 'true'",
328: Locale.US);
329: assertEquals(2, resultKeys.length);
330:
331: //
332: // Test externally defined query options
333: //
334: Map myQueryOptions = new HashMap();
335: myQueryOptions.put("search_last_version", "true");
336: resultKeys = queryManager.performQueryReturnKeys(
337: "select id where $StringField1 = 'boe'", null,
338: myQueryOptions, Locale.US);
339: assertEquals(1, resultKeys.length);
340:
341: //
342: // Test limit clause
343: //
344: resultKeys = queryManager
345: .performQueryReturnKeys(
346: "select id where InCollection('collection2','collection1') limit 2",
347: Locale.US);
348: assertEquals(2, resultKeys.length);
349:
350: //
351: // Test order by
352: //
353: searchResultDoc = queryManager
354: .performQuery(
355: "select name, $StringField1 where $StringField1 like '%hello' and InCollection('collection5') order by $StringField1 asc, id desc",
356: Locale.US);
357: assertEquals("another hello", searchResultDoc.getSearchResult()
358: .getRows().getRowArray()[0].getValueArray()[1]);
359: assertEquals("hello", searchResultDoc.getSearchResult()
360: .getRows().getRowArray()[1].getValueArray()[1]);
361:
362: //
363: // Test multi-values
364: //
365: Repository repository = repositoryManager
366: .getRepository(new Credentials("testuser", "testuser"));
367: repository.switchRole(Role.ADMINISTRATOR);
368: RepositorySchema schema = repository.getRepositorySchema();
369: FieldType multiValueField1 = schema.createFieldType(
370: "multiValueField1", ValueType.STRING, true);
371: multiValueField1.save();
372: DocumentType documentType = schema
373: .createDocumentType("docWithMultiValueFields");
374: documentType.addFieldType(multiValueField1, true);
375: documentType.save();
376: Document mvDoc1 = repository.createDocument("mv doc 1",
377: documentType.getId());
378: mvDoc1.setField("multiValueField1", new Object[] { "mv 1",
379: "mv 2", "mv 3" });
380: mvDoc1.save();
381: Document mvDoc2 = repository.createDocument("mv doc 2",
382: documentType.getId());
383: mvDoc2.setField("multiValueField1", new Object[] { "mv 1",
384: "abc" });
385: mvDoc2.save();
386:
387: searchResultDoc = queryManager
388: .performQuery(
389: "select name, $multiValueField1 where documentType = 'docWithMultiValueFields'",
390: Locale.US);
391: SearchResultDocument.SearchResult.Rows.Row.MultiValue[] multiValues = searchResultDoc
392: .getSearchResult().getRows().getRowArray()[0]
393: .getMultiValueArray();
394: assertEquals("mv 1", multiValues[0].getValueArray(0));
395: assertEquals("mv 2", multiValues[0].getValueArray(1));
396: assertEquals("mv 3", multiValues[0].getValueArray(2));
397:
398: // .valueCount
399: searchResultDoc = queryManager
400: .performQuery(
401: "select name, $multiValueField1 where $multiValueField1.valueCount = 3",
402: Locale.US);
403: assertEquals(1, searchResultDoc.getSearchResult().getRows()
404: .getRowArray().length);
405: searchResultDoc = queryManager
406: .performQuery(
407: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1.valueCount = 1",
408: Locale.US);
409: assertEquals(0, searchResultDoc.getSearchResult().getRows()
410: .getRowArray().length);
411:
412: // has all
413: searchResultDoc = queryManager
414: .performQuery(
415: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('mv 1', 'mv 2')",
416: Locale.US);
417: assertEquals(1, searchResultDoc.getSearchResult().getRows()
418: .getRowArray().length);
419: searchResultDoc = queryManager
420: .performQuery(
421: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('mv 1')",
422: Locale.US);
423: assertEquals(2, searchResultDoc.getSearchResult().getRows()
424: .getRowArray().length);
425: searchResultDoc = queryManager
426: .performQuery(
427: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has all ('rrrrrr')",
428: Locale.US);
429: assertEquals(0, searchResultDoc.getSearchResult().getRows()
430: .getRowArray().length);
431:
432: // has exactly
433: searchResultDoc = queryManager
434: .performQuery(
435: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has exactly ('mv 1', 'abc')",
436: Locale.US);
437: assertEquals(1, searchResultDoc.getSearchResult().getRows()
438: .getRowArray().length);
439: searchResultDoc = queryManager
440: .performQuery(
441: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has exactly ('mv 1', 'mv 2')",
442: Locale.US);
443: assertEquals(0, searchResultDoc.getSearchResult().getRows()
444: .getRowArray().length);
445:
446: // has any
447: searchResultDoc = queryManager
448: .performQuery(
449: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has any ('mv 1', 'koekoek', 'mv 2', 'jaja')",
450: Locale.US);
451: assertEquals(2, searchResultDoc.getSearchResult().getRows()
452: .getRowArray().length);
453: searchResultDoc = queryManager
454: .performQuery(
455: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has some ('koekoek', 'mv 2', 'jaja')",
456: Locale.US);
457: assertEquals(1, searchResultDoc.getSearchResult().getRows()
458: .getRowArray().length);
459:
460: // has none
461: searchResultDoc = queryManager
462: .performQuery(
463: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has none ('mv 1')",
464: Locale.US);
465: assertEquals(0, searchResultDoc.getSearchResult().getRows()
466: .getRowArray().length);
467: searchResultDoc = queryManager
468: .performQuery(
469: "select name, $multiValueField1 where documentType= 'docWithMultiValueFields' and $multiValueField1 has none ('patati patata')",
470: Locale.US);
471: assertEquals(2, searchResultDoc.getSearchResult().getRows()
472: .getRowArray().length);
473:
474: //
475: // Test link field type
476: //
477: searchResultDoc = queryManager
478: .performQuery(
479: "select name, $LinkField1, $LinkField2 where $LinkField1 is not null",
480: Locale.US);
481: assertEquals(1, searchResultDoc.getSearchResult().getRows()
482: .getRowArray().length);
483: assertEquals("daisy:666-DSYTEST@1:1", searchResultDoc
484: .getSearchResult().getRows().getRowArray(0)
485: .getMultiValueArray(0).getLinkValueArray(1)
486: .getStringValue());
487:
488: searchResultDoc = queryManager
489: .performQuery(
490: "select name, $LinkField1, $LinkField2 where $LinkField1.branchId = 1 and $LinkField1.languageId = 1",
491: Locale.US);
492: assertEquals(1, searchResultDoc.getSearchResult().getRows()
493: .getRowArray().length);
494:
495: searchResultDoc = queryManager
496: .performQuery(
497: "select name, $LinkField1, $LinkField2 where $LinkField1.branch = 'main' and $LinkField1.language = 'default'",
498: Locale.US);
499: assertEquals(1, searchResultDoc.getSearchResult().getRows()
500: .getRowArray().length);
501:
502: //
503: // Distinct query test
504: //
505: DistinctSearchResultDocument distinctResultDoc = queryManager
506: .performDistinctQuery(
507: "select $StringField1 where $StringField1 is not null",
508: SortOrder.NONE, Locale.US);
509: assertEquals(2, distinctResultDoc.getDistinctSearchResult()
510: .getValues().getValueArray().length);
511:
512: //
513: // Test Hierarchical field type
514: //
515: contentCreator
516: .createAdditionalDocumentsForHierarchicalFieldTests(repositoryManager);
517:
518: try {
519: queryManager
520: .performQuery(
521: "select $HierField1 where $HierField1 has all('A', 'B', 'C')",
522: Locale.US);
523: fail("Using has all with a non-multivalue field field should fail.");
524: } catch (Exception e) {
525: }
526:
527: try {
528: // $LinkField2 is multivalue, and of type link, but non-hierarhical
529: queryManager
530: .performQuery(
531: "select id where $LinkField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'))",
532: Locale.US);
533: fail("Using has all with hierarchical argumetns but a non-hierarchical field should fail.");
534: } catch (Exception e) {
535: }
536:
537: searchResultDoc = queryManager
538: .performQuery(
539: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'))",
540: Locale.US);
541: assertEquals(1, searchResultDoc.getSearchResult().getRows()
542: .getRowArray().length);
543:
544: searchResultDoc = queryManager
545: .performQuery(
546: "select $HierField2 where $HierField2 has exactly( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'))",
547: Locale.US);
548: assertEquals(0, searchResultDoc.getSearchResult().getRows()
549: .getRowArray().length);
550:
551: searchResultDoc = queryManager
552: .performQuery(
553: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'), Path('/daisy:1002-DSYTEST'))",
554: Locale.US);
555: assertEquals(1, searchResultDoc.getSearchResult().getRows()
556: .getRowArray().length);
557:
558: searchResultDoc = queryManager
559: .performQuery(
560: "select $HierField2 where $HierField2 has exactly( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'), Path('/daisy:1002-DSYTEST'))",
561: Locale.US);
562: assertEquals(1, searchResultDoc.getSearchResult().getRows()
563: .getRowArray().length);
564:
565: // two times same argument, should not matter
566: searchResultDoc = queryManager
567: .performQuery(
568: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'), Path('/daisy:1002-DSYTEST'), Path('/daisy:1002-DSYTEST'))",
569: Locale.US);
570: assertEquals(1, searchResultDoc.getSearchResult().getRows()
571: .getRowArray().length);
572:
573: // one dummy value more, should not find anything
574: searchResultDoc = queryManager
575: .performQuery(
576: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST'), Path('/daisy:1002-DSYTEST'), Path('/daisy:1234-DSYTEST'))",
577: Locale.US);
578: assertEquals(0, searchResultDoc.getSearchResult().getRows()
579: .getRowArray().length);
580:
581: // adding one element more to the path should not give results
582: searchResultDoc = queryManager
583: .performQuery(
584: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST/daisy:1001-DSYTEST/daisy:1002-DSYTEST'))",
585: Locale.US);
586: assertEquals(0, searchResultDoc.getSearchResult().getRows()
587: .getRowArray().length);
588:
589: // one element less in the path should not give results either
590: searchResultDoc = queryManager
591: .performQuery(
592: "select $HierField2 where $HierField2 has all( Path('/daisy:1000-DSYTEST'))",
593: Locale.US);
594: assertEquals(0, searchResultDoc.getSearchResult().getRows()
595: .getRowArray().length);
596:
597: searchResultDoc = queryManager
598: .performQuery(
599: "select $HierField2 where $HierField2 has all( Path('/daisy:1005-DSYTEST/daisy:1006-DSYTEST'))",
600: Locale.US);
601: assertEquals(2, searchResultDoc.getSearchResult().getRows()
602: .getRowArray().length);
603:
604: searchResultDoc = queryManager
605: .performQuery(
606: "select $HierField2 where $HierField2 has all( Path('/daisy:1005-DSYTEST/daisy:1006-DSYTEST'), Path('/daisy:1007-DSYTEST'))",
607: Locale.US);
608: assertEquals(2, searchResultDoc.getSearchResult().getRows()
609: .getRowArray().length);
610:
611: searchResultDoc = queryManager
612: .performQuery(
613: "select $HierField2 where $HierField2 has all( Path('/daisy:1005-DSYTEST/daisy:1006-DSYTEST'), Path('/daisy:1007-DSYTEST'), Path('/daisy:1009/daisy:1010/daisy:1009'))",
614: Locale.US);
615: assertEquals(1, searchResultDoc.getSearchResult().getRows()
616: .getRowArray().length);
617:
618: searchResultDoc = queryManager
619: .performQuery(
620: "select $HierField2 where $HierField2 has any( Path('/daisy:1007-DSYTEST'), Path('/daisy:1002-DSYTEST'))",
621: Locale.US);
622: assertEquals(3, searchResultDoc.getSearchResult().getRows()
623: .getRowArray().length);
624:
625: searchResultDoc = queryManager
626: .performQuery(
627: "select $HierField2 where $HierField2 has any( Path('/daisy:1007-DSYTEST'), Path('/daisy:1009/daisy:1010/daisy:1009'))",
628: Locale.US);
629: assertEquals(2, searchResultDoc.getSearchResult().getRows()
630: .getRowArray().length);
631:
632: searchResultDoc = queryManager
633: .performQuery(
634: "select $HierField2 where $HierField2 is not null and $HierField2 has none( Path('/daisy:1007-DSYTEST'), Path('/daisy:1009/daisy:1010/daisy:1009'))",
635: Locale.US);
636: assertEquals(1, searchResultDoc.getSearchResult().getRows()
637: .getRowArray().length);
638:
639: searchResultDoc = queryManager
640: .performQuery(
641: "select $HierField2 where $HierField2 is not null and $HierField2 has none( Path('/daisy:1007-DSYTEST'), Path('/daisy:1009/daisy:1010/daisy:1009'), Path('/daisy:1000/daisy:1001'))",
642: Locale.US);
643: assertEquals(0, searchResultDoc.getSearchResult().getRows()
644: .getRowArray().length);
645:
646: searchResultDoc = queryManager
647: .performQuery(
648: "select $HierField2 where $HierField2 is not null and $HierField2 has none( Path('/daisy:2000-DSYTEST'))",
649: Locale.US);
650: assertEquals(3, searchResultDoc.getSearchResult().getRows()
651: .getRowArray().length);
652:
653: searchResultDoc = queryManager
654: .performQuery(
655: "select $HierField2 where $HierField2 is not null and $HierField2 has none( Path('/daisy:2000-DSYTEST'), Path('/daisy:2000-DSYTEST/daisy:2000-DSYTEST'))",
656: Locale.US);
657: assertEquals(3, searchResultDoc.getSearchResult().getRows()
658: .getRowArray().length);
659:
660: searchResultDoc = queryManager.performQuery(
661: "select id where $HierField1 matchesPath('/X/Y')",
662: Locale.US);
663: assertEquals(1, searchResultDoc.getSearchResult().getRows()
664: .getRowArray().length);
665:
666: searchResultDoc = queryManager.performQuery(
667: "select id where $HierField1 matchesPath('/X/*')",
668: Locale.US);
669: assertEquals(1, searchResultDoc.getSearchResult().getRows()
670: .getRowArray().length);
671:
672: searchResultDoc = queryManager.performQuery(
673: "select id where $HierField1 matchesPath('/*/*')",
674: Locale.US);
675: assertEquals(1, searchResultDoc.getSearchResult().getRows()
676: .getRowArray().length);
677:
678: searchResultDoc = queryManager.performQuery(
679: "select id where $HierField1 matchesPath('/Aaa/**')",
680: Locale.US);
681: assertEquals(3, searchResultDoc.getSearchResult().getRows()
682: .getRowArray().length);
683:
684: searchResultDoc = queryManager.performQuery(
685: "select id where $HierField1 matchesPath('**/Cee')",
686: Locale.US);
687: assertEquals(1, searchResultDoc.getSearchResult().getRows()
688: .getRowArray().length);
689:
690: searchResultDoc = queryManager
691: .performQuery(
692: "select id where $HierField1 matchesPath('**/Cee/Dee')",
693: Locale.US);
694: assertEquals(2, searchResultDoc.getSearchResult().getRows()
695: .getRowArray().length);
696:
697: searchResultDoc = queryManager.performQuery(
698: "select id where $HierField1 matchesPath('**/*/Dee')",
699: Locale.US);
700: assertEquals(2, searchResultDoc.getSearchResult().getRows()
701: .getRowArray().length);
702:
703: searchResultDoc = queryManager
704: .performQuery(
705: "select id where $HierField1 matchesPath('**/Cee') or $HierField1 matchesPath('**/Dee')",
706: Locale.US);
707: assertEquals(3, searchResultDoc.getSearchResult().getRows()
708: .getRowArray().length);
709:
710: searchResultDoc = queryManager
711: .performQuery(
712: "select id where $HierField1 matchesPath('/Aaa/*/Cee')",
713: Locale.US);
714: assertEquals(1, searchResultDoc.getSearchResult().getRows()
715: .getRowArray().length);
716:
717: // equals operator should evaluate to true whenever the value occurs somewhere in the hierarchical field
718: searchResultDoc = queryManager.performQuery(
719: "select id where $HierField1 = 'Cee'", Locale.US);
720: assertEquals(3, searchResultDoc.getSearchResult().getRows()
721: .getRowArray().length);
722:
723: // Test transport of very long queries: this could fail in the remote api implementation if the request is done using HTTP GET
724: StringBuilder longThing = new StringBuilder(20000);
725: for (int i = 0; i < 20000; i++) {
726: longThing.append(' ');
727: }
728: queryManager.performQueryReturnKeys(
729: "select name where InCollection('collection2')"
730: + longThing, Locale.US);
731: }
732:
733: protected boolean resetDataStores() {
734: return true;
735: }
736:
737: protected abstract RepositoryManager getRepositoryManager()
738: throws Exception;
739: }
|