001: /*
002: * Copyright 2007 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.acl.*;
021: import org.outerj.daisy.repository.variant.VariantManager;
022: import org.outerj.daisy.repository.variant.Branch;
023: import org.outerj.daisy.repository.query.QueryManager;
024: import org.outerj.daisy.repository.query.QueryException;
025: import org.outerj.daisy.repository.schema.RepositorySchema;
026: import org.outerj.daisy.repository.schema.FieldType;
027: import org.outerj.daisy.repository.schema.DocumentType;
028: import org.outerj.daisy.repository.user.Role;
029: import org.outerj.daisy.repository.user.UserManager;
030: import org.outerj.daisy.repository.user.User;
031: import org.outerx.daisy.x10.SearchResultDocument;
032:
033: import java.util.Locale;
034:
035: /**
036: * Tests for the query language dereference operator.
037: */
038: public abstract class AbstractDerefTest extends AbstractDaisyTestCase {
039: protected boolean resetDataStores() {
040: return true;
041: }
042:
043: protected abstract RepositoryManager getRepositoryManager()
044: throws Exception;
045:
046: public void testDeref() throws Exception {
047: RepositoryManager repositoryManager = getRepositoryManager();
048:
049: Repository testuserRepository = repositoryManager
050: .getRepository(new Credentials("testuser", "testuser"));
051: testuserRepository.switchRole(Role.ADMINISTRATOR);
052:
053: RepositorySchema schema = testuserRepository
054: .getRepositorySchema();
055: QueryManager testuserQueryManager = testuserRepository
056: .getQueryManager();
057:
058: FieldType linkField = schema.createFieldType("Link",
059: ValueType.LINK);
060: linkField.save();
061:
062: SearchResultDocument result;
063:
064: //
065: // Some basic tests
066: //
067: {
068: DocumentType documentType = schema
069: .createDocumentType("Doctype1");
070: documentType.addFieldType(linkField, false);
071: documentType.save();
072:
073: Document document3 = testuserRepository.createDocument(
074: "Doc3", documentType.getId());
075: document3.save();
076:
077: Document document2 = testuserRepository.createDocument(
078: "Doc2", documentType.getId());
079: document2.setField("Link", new VariantKey(
080: document3.getId(), -1, -1));
081: document2.save();
082:
083: Document document1 = testuserRepository.createDocument(
084: "Doc1", documentType.getId());
085: document1.setField("Link", document2.getVariantKey());
086: document1.save();
087:
088: Document document5 = testuserRepository.createDocument(
089: "Doc5", documentType.getId());
090: document5.save();
091:
092: Document document4 = testuserRepository.createDocument(
093: "Doc4", documentType.getId());
094: document4.setField("Link", document5.getVariantKey());
095: document4.save();
096:
097: result = testuserQueryManager
098: .performQuery(
099: "select name, $Link=>name where documentType='Doctype1' and $Link=>name = 'Doc2'",
100: Locale.US);
101: assertEquals(1, result.getSearchResult().getRows()
102: .sizeOfRowArray());
103: assertEquals(document1.getId(), result.getSearchResult()
104: .getRows().getRowArray(0).getDocumentId());
105:
106: result = testuserQueryManager
107: .performQuery(
108: "select name, $Link=>name where documentType='Doctype1' and $Link=>name = 'Doc3'",
109: Locale.US);
110: assertEquals(1, result.getSearchResult().getRows()
111: .sizeOfRowArray());
112: assertEquals(document2.getId(), result.getSearchResult()
113: .getRows().getRowArray(0).getDocumentId());
114:
115: // multiple levels of dereference in where clause
116: result = testuserQueryManager
117: .performQuery(
118: "select name, $Link=>name, $Link=>$Link=>name where documentType='Doctype1' and $Link=>$Link=>name = 'Doc3'",
119: Locale.US);
120: assertEquals(1, result.getSearchResult().getRows()
121: .sizeOfRowArray());
122: assertEquals(document1.getId(), result.getSearchResult()
123: .getRows().getRowArray(0).getDocumentId());
124:
125: // Some tests with multiple deref expressions combined with and / or
126: result = testuserQueryManager
127: .performQuery(
128: "select name, $Link=>name where documentType='Doctype1' and $Link=>name = 'Doc2' and $Link=>name = 'Doc3'",
129: Locale.US);
130: assertEquals(0, result.getSearchResult().getRows()
131: .sizeOfRowArray());
132:
133: result = testuserQueryManager
134: .performQuery(
135: "select name, $Link=>name where documentType='Doctype1' and ($Link=>name = 'Doc2' or $Link=>name = 'DocNotExisting')",
136: Locale.US);
137: assertEquals(1, result.getSearchResult().getRows()
138: .sizeOfRowArray());
139: assertEquals(document1.getId(), result.getSearchResult()
140: .getRows().getRowArray(0).getDocumentId());
141:
142: result = testuserQueryManager
143: .performQuery(
144: "select name, $Link=>name where documentType='Doctype1' and ($Link=>name = 'Doc2' or $Link=>name = 'Doc2')",
145: Locale.US);
146: assertEquals(1, result.getSearchResult().getRows()
147: .sizeOfRowArray());
148: assertEquals(document1.getId(), result.getSearchResult()
149: .getRows().getRowArray(0).getDocumentId());
150:
151: result = testuserQueryManager
152: .performQuery(
153: "select name, $Link=>name where documentType='Doctype1' and $Link=>name = 'Doc2' and $Link=>name = 'Doc2' and $Link=>name = 'Doc2'",
154: Locale.US);
155: assertEquals(1, result.getSearchResult().getRows()
156: .sizeOfRowArray());
157: assertEquals(document1.getId(), result.getSearchResult()
158: .getRows().getRowArray(0).getDocumentId());
159:
160: // deref in order by clause
161: result = testuserQueryManager
162: .performQuery(
163: "select name, $Link=>name where documentType='Doctype1' and ($Link=>name = 'Doc2' or $Link=>name = 'Doc5') order by $Link=>name DESC",
164: Locale.US);
165: assertEquals(2, result.getSearchResult().getRows()
166: .sizeOfRowArray());
167: assertEquals("Doc5", result.getSearchResult().getRows()
168: .getRowArray(0).getValueArray(1));
169: assertEquals("Doc2", result.getSearchResult().getRows()
170: .getRowArray(1).getValueArray(1));
171:
172: // deref expressions as arguments in functions
173: result = testuserQueryManager
174: .performQuery(
175: "select name, Left($Link=>name, 1), $Link=>$Link=>name where documentType='Doctype1' and Right($Link=>$Link=>name, 1) = '3'",
176: Locale.US);
177: assertEquals(1, result.getSearchResult().getRows()
178: .sizeOfRowArray());
179: assertEquals(document1.getId(), result.getSearchResult()
180: .getRows().getRowArray(0).getDocumentId());
181: assertEquals("D", result.getSearchResult().getRows()
182: .getRowArray(0).getValueArray(1));
183:
184: // Make one of the documents retired
185: document2.setRetired(true);
186: document2.save();
187: // now we should not get a result anymore
188: result = testuserQueryManager
189: .performQuery(
190: "select name, $Link=>name, $Link=>$Link=>name where documentType='Doctype1' and $Link=>$Link=>name = 'Doc3'",
191: Locale.US);
192: assertEquals(0, result.getSearchResult().getRows()
193: .sizeOfRowArray());
194: // unless we specify the option to include retired docs
195: result = testuserQueryManager
196: .performQuery(
197: "select name, $Link=>name, $Link=>$Link=>name where documentType='Doctype1' and $Link=>$Link=>name = 'Doc3' option include_retired = 'true'",
198: Locale.US);
199: assertEquals(1, result.getSearchResult().getRows()
200: .sizeOfRowArray());
201:
202: // Refering to ourselves using the 'link' identifier, should give all docs except for the one which is retired
203: result = testuserQueryManager
204: .performQuery(
205: "select name where documentType='Doctype1' and link=>name = name",
206: Locale.US);
207: assertEquals(4, result.getSearchResult().getRows()
208: .sizeOfRowArray());
209: // how much fun...
210: result = testuserQueryManager
211: .performQuery(
212: "select name where documentType='Doctype1' and link=>name = name and link=>link=>link=>link=>link=>name = name",
213: Locale.US);
214: assertEquals(4, result.getSearchResult().getRows()
215: .sizeOfRowArray());
216: }
217:
218: //
219: // variant related tests
220: //
221: {
222: VariantManager variantManager = testuserRepository
223: .getVariantManager();
224: Branch branch = variantManager.createBranch("branch");
225: branch.save();
226:
227: DocumentType documentType = schema
228: .createDocumentType("Doctype2");
229: documentType.addFieldType(linkField, false);
230: documentType.save();
231:
232: Document document2 = testuserRepository.createDocument(
233: "Doc2", documentType.getId());
234: document2.save();
235:
236: Document document1 = testuserRepository.createDocument(
237: "Doc1", documentType.getId());
238: document1.setField("Link", new VariantKey(
239: document2.getId(), -1, 1));
240: document1.save();
241:
242: Document document2b = testuserRepository.createVariant(
243: document2.getId(), 1, 1, -1, branch.getId(), 1,
244: true);
245: document2b.save();
246:
247: Document document1b = testuserRepository.createVariant(
248: document1.getId(), 1, 1, -1, branch.getId(), 1,
249: true);
250: document1b.save();
251:
252: // query without filtering on branch
253: result = testuserQueryManager
254: .performQuery(
255: "select name where documentType='Doctype2' and $Link=>name = 'Doc2'",
256: Locale.US);
257: assertEquals(2, result.getSearchResult().getRows()
258: .sizeOfRowArray());
259:
260: // with filtering on branch
261: result = testuserQueryManager
262: .performQuery(
263: "select name where documentType='Doctype2' and $Link=>name = 'Doc2' and branchId = 1",
264: Locale.US);
265: assertEquals(1, result.getSearchResult().getRows()
266: .sizeOfRowArray());
267:
268: // with filtering on branch of the link target doc
269: result = testuserQueryManager
270: .performQuery(
271: "select name where documentType='Doctype2' and $Link=>name = 'Doc2' and link=>branchId = 1",
272: Locale.US);
273: assertEquals(1, result.getSearchResult().getRows()
274: .sizeOfRowArray());
275: }
276:
277: //
278: // access control tests
279: //
280: {
281: // create another user
282: UserManager userManager = testuserRepository
283: .getUserManager();
284: User user2 = userManager.createUser("user2");
285: user2.setPassword("user2");
286: user2.addToRole(userManager.getRole("User", false));
287: user2.save();
288:
289: // create an ACL (default is empty so no access for non-admins/non-owners)
290: AccessManager accessManager = testuserRepository
291: .getAccessManager();
292: Acl acl = accessManager.getStagingAcl();
293: AclObject aclObject = acl.createNewObject("true");
294: AclEntry aclEntry = aclObject.createNewEntry(
295: AclSubjectType.EVERYONE, -1);
296: for (AclPermission perm : AclPermission.values())
297: aclEntry.set(perm, AclActionType.GRANT);
298: aclObject.add(aclEntry);
299: acl.add(aclObject);
300: acl.save();
301: accessManager.copyStagingToLive();
302:
303: DocumentType documentType = schema
304: .createDocumentType("Doctype3");
305: documentType.addFieldType(linkField, false);
306: documentType.save();
307:
308: Document document2 = testuserRepository.createDocument(
309: "Doc2", documentType.getId());
310: document2.save();
311:
312: Document document1 = testuserRepository.createDocument(
313: "Doc1", documentType.getId());
314: document1.setField("Link", new VariantKey(
315: document2.getId(), -1, 1));
316: document1.save();
317:
318: Repository user2Repository = repositoryManager
319: .getRepository(new Credentials("user2", "user2"));
320: QueryManager user2QueryManager = user2Repository
321: .getQueryManager();
322:
323: // user2 should still be able to access the documents
324: result = user2QueryManager
325: .performQuery(
326: "select name where documentType='Doctype3' and $Link=>name = 'Doc2'",
327: Locale.US);
328: assertEquals(1, result.getSearchResult().getRows()
329: .sizeOfRowArray());
330:
331: // make doc private so user2 doesn't have access to it
332: document2.setPrivate(true);
333: document2.save();
334:
335: // In the where-part we traverse the link "$Link" which points to a document to which the user doesn't
336: // have access anymore, hence it's impossible to know whether it satisfies the demanded conditions,
337: // and the result is excluded from the result set.
338: result = user2QueryManager
339: .performQuery(
340: "select name where documentType='Doctype3' and $Link=>name = 'Doc2'",
341: Locale.US);
342: assertEquals(0, result.getSearchResult().getRows()
343: .sizeOfRowArray());
344:
345: // add some more silly conditions
346: result = user2QueryManager
347: .performQuery(
348: "select name where documentType='Doctype3' and ($Link=>name = 'Doc2' or name='Doc1' or $Link=>name='Doc2')",
349: Locale.US);
350: assertEquals(0, result.getSearchResult().getRows()
351: .sizeOfRowArray());
352: }
353:
354: //
355: // Test all sorts of operators, many of these had to be adjusted for the deref operator to work
356: // so it's important we test them all in derefereced context
357: //
358: {
359: FieldType mvField = schema.createFieldType("Multi",
360: ValueType.STRING, true);
361: mvField.save();
362:
363: FieldType hierField = schema.createFieldType("Hier",
364: ValueType.STRING, false, true);
365: hierField.save();
366:
367: FieldType mvHierField = schema.createFieldType("MultiHier",
368: ValueType.STRING, true, true);
369: mvHierField.save();
370:
371: FieldType stringField = schema.createFieldType("String",
372: ValueType.STRING);
373: stringField.save();
374:
375: DocumentType documentType = schema
376: .createDocumentType("Doctype4");
377: documentType.addFieldType(linkField, false);
378: documentType.addFieldType(mvField, false);
379: documentType.addFieldType(hierField, false);
380: documentType.addFieldType(mvHierField, false);
381: documentType.addFieldType(stringField, false);
382: documentType.save();
383:
384: DocumentType linkedDocumentType = schema
385: .createDocumentType("DoctypeLinkedByDoctype4");
386: linkedDocumentType.addFieldType(linkField, false);
387: linkedDocumentType.addFieldType(mvField, false);
388: linkedDocumentType.addFieldType(hierField, false);
389: linkedDocumentType.addFieldType(mvHierField, false);
390: linkedDocumentType.addFieldType(stringField, false);
391: linkedDocumentType.save();
392:
393: Document document2 = testuserRepository.createDocument(
394: "Doc2", linkedDocumentType.getId());
395: document2.setField("String", "foo");
396: document2.setField("Hier", new HierarchyPath(new String[] {
397: "r", "s", "t" }));
398: document2.setField("MultiHier",
399: new Object[] {
400: new HierarchyPath(new String[] { "a1",
401: "a2", "a3" }),
402: new HierarchyPath(
403: new String[] { "b1", "b2" }),
404: new HierarchyPath(new String[] { "c1" }) });
405: document2.setField("Multi", new Object[] { "val1", "val2",
406: "val3" });
407: document2.save();
408:
409: Document document1 = testuserRepository.createDocument(
410: "Doc1", documentType.getId());
411: document1.setField("Link", new VariantKey(
412: document2.getId(), -1, 1));
413: document1.save();
414:
415: result = testuserQueryManager
416: .performQuery(
417: "select name where documentType='Doctype4' and $Link=>$String = 'foo'",
418: Locale.US);
419: assertEquals(1, result.getSearchResult().getRows()
420: .sizeOfRowArray());
421:
422: result = testuserQueryManager
423: .performQuery(
424: "select name where documentType='Doctype4' and $Link=>$String = $Link=>$String and link=>link=>link=>$Link=>$String = $Link=>link=>link=>$String",
425: Locale.US);
426: assertEquals(1, result.getSearchResult().getRows()
427: .sizeOfRowArray());
428:
429: result = testuserQueryManager
430: .performQuery(
431: "select name where documentType='Doctype4' and $Link=>$String = 'bar'",
432: Locale.US);
433: assertEquals(0, result.getSearchResult().getRows()
434: .sizeOfRowArray());
435:
436: result = testuserQueryManager
437: .performQuery(
438: "select name where documentType='Doctype4' and $Link=>$String IN ('foo', 'bar')",
439: Locale.US);
440: assertEquals(1, result.getSearchResult().getRows()
441: .sizeOfRowArray());
442:
443: result = testuserQueryManager
444: .performQuery(
445: "select name where documentType='Doctype4' and $Link=>$String NOT IN ('foo', 'bar')",
446: Locale.US);
447: assertEquals(0, result.getSearchResult().getRows()
448: .sizeOfRowArray());
449:
450: result = testuserQueryManager
451: .performQuery(
452: "select name where documentType='Doctype4' and $Link=>$String IN ('bar')",
453: Locale.US);
454: assertEquals(0, result.getSearchResult().getRows()
455: .sizeOfRowArray());
456:
457: result = testuserQueryManager
458: .performQuery(
459: "select name where documentType='Doctype4' and $Link=>$String IS NOT NULL",
460: Locale.US);
461: assertEquals(1, result.getSearchResult().getRows()
462: .sizeOfRowArray());
463:
464: result = testuserQueryManager
465: .performQuery(
466: "select name where documentType='Doctype4' and $Link is not null and $Link=>$String IS NULL",
467: Locale.US);
468: assertEquals(0, result.getSearchResult().getRows()
469: .sizeOfRowArray());
470:
471: result = testuserQueryManager
472: .performQuery(
473: "select name where documentType='Doctype4' and $Link=>$String between 'a' and 'z'",
474: Locale.US);
475: assertEquals(1, result.getSearchResult().getRows()
476: .sizeOfRowArray());
477:
478: result = testuserQueryManager
479: .performQuery(
480: "select name where documentType='Doctype4' and $Link=>$String between 'a' and 'b'",
481: Locale.US);
482: assertEquals(0, result.getSearchResult().getRows()
483: .sizeOfRowArray());
484:
485: result = testuserQueryManager
486: .performQuery(
487: "select name where documentType='Doctype4' and $Link=>$Multi has exactly ('val1', 'val2', 'val3')",
488: Locale.US);
489: assertEquals(1, result.getSearchResult().getRows()
490: .sizeOfRowArray());
491:
492: result = testuserQueryManager
493: .performQuery(
494: "select name where documentType='Doctype4' and $Link=>$Multi has exactly ('val1', 'val2')",
495: Locale.US);
496: assertEquals(0, result.getSearchResult().getRows()
497: .sizeOfRowArray());
498:
499: result = testuserQueryManager
500: .performQuery(
501: "select name where documentType='Doctype4' and $Link=>$Multi has all ('val1', 'val2', 'val3')",
502: Locale.US);
503: assertEquals(1, result.getSearchResult().getRows()
504: .sizeOfRowArray());
505:
506: result = testuserQueryManager
507: .performQuery(
508: "select name where documentType='Doctype4' and $Link=>$Multi has all ('val1', 'val2', 'valOther')",
509: Locale.US);
510: assertEquals(0, result.getSearchResult().getRows()
511: .sizeOfRowArray());
512:
513: result = testuserQueryManager
514: .performQuery(
515: "select name where documentType='Doctype4' and $Link is not null and $Link=>$Multi has none ('x', 'y')",
516: Locale.US);
517: assertEquals(1, result.getSearchResult().getRows()
518: .sizeOfRowArray());
519:
520: result = testuserQueryManager
521: .performQuery(
522: "select name where documentType='Doctype4' and $Link is not null and $Link=>$Multi has none ('x', 'y', 'val1')",
523: Locale.US);
524: assertEquals(0, result.getSearchResult().getRows()
525: .sizeOfRowArray());
526:
527: result = testuserQueryManager
528: .performQuery(
529: "select name where documentType='Doctype4' and $Link=>$Hier matchesPath('r/s/t')",
530: Locale.US);
531: assertEquals(1, result.getSearchResult().getRows()
532: .sizeOfRowArray());
533:
534: result = testuserQueryManager
535: .performQuery(
536: "select name where documentType='Doctype4' and $Link=>$Hier matchesPath('r/*/*')",
537: Locale.US);
538: assertEquals(1, result.getSearchResult().getRows()
539: .sizeOfRowArray());
540:
541: result = testuserQueryManager
542: .performQuery(
543: "select name where documentType='Doctype4' and $Link=>$Hier matchesPath('r/**')",
544: Locale.US);
545: assertEquals(1, result.getSearchResult().getRows()
546: .sizeOfRowArray());
547:
548: result = testuserQueryManager
549: .performQuery(
550: "select name where documentType='Doctype4' and $Link=>$Hier matchesPath('p/**')",
551: Locale.US);
552: assertEquals(0, result.getSearchResult().getRows()
553: .sizeOfRowArray());
554:
555: result = testuserQueryManager
556: .performQuery(
557: "select name where documentType='Doctype4' and $Link=>$MultiHier has all(Path('a1/a2/a3'), Path('c1'))",
558: Locale.US);
559: assertEquals(1, result.getSearchResult().getRows()
560: .sizeOfRowArray());
561:
562: result = testuserQueryManager
563: .performQuery(
564: "select name where documentType='Doctype4' and $Link=>$MultiHier has all(Path('a1/a2/a3'), Path('d1'))",
565: Locale.US);
566: assertEquals(0, result.getSearchResult().getRows()
567: .sizeOfRowArray());
568:
569: result = testuserQueryManager
570: .performQuery(
571: "select name where documentType='Doctype4' and $Link=>$MultiHier has all(Path('a1/a2/a3'), Path('b1/b2'), Path('c1'))",
572: Locale.US);
573: assertEquals(1, result.getSearchResult().getRows()
574: .sizeOfRowArray());
575:
576: result = testuserQueryManager
577: .performQuery(
578: "select name where documentType='Doctype4' and $Link=>$MultiHier has exactly (Path('a1/a2/a3'), Path('b1/b2'), Path('c1'))",
579: Locale.US);
580: assertEquals(1, result.getSearchResult().getRows()
581: .sizeOfRowArray());
582:
583: result = testuserQueryManager
584: .performQuery(
585: "select name where documentType='Doctype4' and $Link=>$MultiHier has none (Path('a1/a2/a3'), Path('b1/b2'), Path('c1'))",
586: Locale.US);
587: assertEquals(0, result.getSearchResult().getRows()
588: .sizeOfRowArray());
589:
590: result = testuserQueryManager
591: .performQuery(
592: "select name where documentType='Doctype4' and $Link=>$MultiHier has none (Path('x1/x2/x3'), Path('y1/b2'))",
593: Locale.US);
594: assertEquals(1, result.getSearchResult().getRows()
595: .sizeOfRowArray());
596:
597: result = testuserQueryManager
598: .performQuery(
599: "select name where documentType='Doctype4' and $Link=>$MultiHier has none (Path('x1/x2/x3'), Path('y1/b2')) and $Link=>$MultiHier has exactly (Path('a1/a2/a3'), Path('b1/b2'), Path('c1')) and $Link=>$Hier matchesPath('r/s/t')",
600: Locale.US);
601: assertEquals(1, result.getSearchResult().getRows()
602: .sizeOfRowArray());
603: }
604:
605: //
606: // Test things which shouldn't be possible
607: //
608: {
609: FieldType mvLinkField = schema.createFieldType("MvLink",
610: ValueType.LINK, true);
611: mvLinkField.save();
612:
613: FieldType hierLinkField = schema.createFieldType(
614: "HierLink", ValueType.LINK, false, true);
615: hierLinkField.save();
616:
617: DocumentType documentType = schema
618: .createDocumentType("Doctype5");
619: documentType.addFieldType(mvLinkField, false);
620: documentType.addFieldType(hierLinkField, false);
621: documentType.save();
622:
623: Document document2 = testuserRepository.createDocument(
624: "Doc2", documentType.getId());
625: document2.save();
626:
627: Document document1 = testuserRepository.createDocument(
628: "Doc1", documentType.getId());
629: document1.setField("MvLink", new Object[] { new VariantKey(
630: document2.getId(), -1, 1) });
631: document1.setField("HierLink", new HierarchyPath(
632: new Object[] { new VariantKey(document2.getId(),
633: -1, 1) }));
634: document1.save();
635:
636: try {
637: testuserQueryManager
638: .performQuery(
639: "select name where documentType='Doctype5' and $MvLink=>name = 'Doc2'",
640: Locale.US);
641: fail("Expected a query exception trying to dereference a multivalue link field");
642: } catch (QueryException e) {
643: // ok
644: }
645:
646: try {
647: testuserQueryManager
648: .performQuery(
649: "select name where documentType='Doctype5' and $HierLink=>name = 'Doc2'",
650: Locale.US);
651: fail("Expected a query exception trying to dereference a hierarchical link field");
652: } catch (QueryException e) {
653: // ok
654: }
655: }
656:
657: }
658: }
|