| 1 31 32 package org.opencms.search; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.file.CmsProperty; 36 import org.opencms.file.CmsPropertyDefinition; 37 import org.opencms.main.OpenCms; 38 import org.opencms.report.CmsShellReport; 39 import org.opencms.test.OpenCmsTestCase; 40 import org.opencms.test.OpenCmsTestProperties; 41 import org.opencms.util.CmsDateUtil; 42 import org.opencms.util.CmsStringUtil; 43 44 import java.util.Arrays ; 45 import java.util.Iterator ; 46 import java.util.List ; 47 import java.util.Map ; 48 49 import junit.extensions.TestSetup; 50 import junit.framework.Test; 51 import junit.framework.TestSuite; 52 53 59 public class TestCmsSearchAdvancedFeatures extends OpenCmsTestCase { 60 61 62 public static final String INDEX_OFFLINE = "Offline project (VFS)"; 63 64 65 public static final String INDEX_ONLINE = "Online project (VFS)"; 66 67 72 public TestCmsSearchAdvancedFeatures(String arg0) { 73 74 super(arg0); 75 } 76 77 82 public static Test suite() { 83 84 OpenCmsTestProperties.initialize(org.opencms.test.AllTests.TEST_PROPERTIES_PATH); 85 86 TestSuite suite = new TestSuite(); 87 suite.setName(TestCmsSearchAdvancedFeatures.class.getName()); 88 89 suite.addTest(new TestCmsSearchAdvancedFeatures("testSortSearchResults")); 90 suite.addTest(new TestCmsSearchAdvancedFeatures("testSearchCategories")); 91 suite.addTest(new TestCmsSearchAdvancedFeatures("testMultipleSearchRoots")); 92 suite.addTest(new TestCmsSearchAdvancedFeatures("testSearchRestriction")); 93 94 TestSetup wrapper = new TestSetup(suite) { 95 96 protected void setUp() { 97 98 setupOpenCms("simpletest", "/sites/default/"); 99 } 100 101 protected void tearDown() { 102 103 removeOpenCms(); 104 } 105 }; 106 107 return wrapper; 108 } 109 110 115 public void testMultipleSearchRoots() throws Exception { 116 117 CmsObject cms = getCmsObject(); 118 echo("Testing searching with multiple search roots"); 119 120 CmsSearch searchBean = new CmsSearch(); 121 List searchResult; 122 String query = "OpenCms"; 123 124 searchBean.init(cms); 125 searchBean.setIndex(INDEX_OFFLINE); 126 searchBean.setMatchesPerPage(1000); 127 searchBean.setQuery(query); 128 129 String [][] roots = new String [][] { 130 new String [] {"/folder1/"}, 131 new String [] {"/folder2/"}, 132 new String [] {"/types/"}, 133 new String [] {"/folder2/", "/types/"}, 134 new String [] {"/folder1/", "/types/"}, 135 new String [] {"/folder1/", "/folder2/"}, 136 new String [] {"/folder1/", "/folder2/", "/types/"}}; 137 138 int[] expected = new int[] {7, 4, 1, 5, 8, 11, 12}; 139 140 for (int i = 0; i < expected.length; i++) { 141 int expect = expected[i]; 142 String [] rootList = roots[i]; 143 searchBean.setSearchRoots(rootList); 144 searchResult = searchBean.getSearchResult(); 145 Iterator j = searchResult.iterator(); 146 System.out.println("Result for search " 147 + i 148 + " (found " 149 + searchResult.size() 150 + ", expected " 151 + expect 152 + ")"); 153 while (j.hasNext()) { 154 CmsSearchResult res = (CmsSearchResult)j.next(); 155 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 156 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 157 System.out.println(" score: " + res.getScore()); 158 } 159 assertEquals(expect, searchResult.size()); 160 } 161 } 162 163 168 public void testSearchCategories() throws Exception { 169 170 CmsObject cms = getCmsObject(); 171 echo("Testing searching for categories"); 172 173 CmsSearch searchBean = new CmsSearch(); 175 List searchResult; 176 String query = "OpenCms"; 177 178 180 CmsProperty cat1 = new CmsProperty(CmsPropertyDefinition.PROPERTY_SEARCH_CATEGORY, "category_1", null, true); 181 CmsProperty cat2 = new CmsProperty(CmsPropertyDefinition.PROPERTY_SEARCH_CATEGORY, "category_2", null, true); 182 CmsProperty cat3 = new CmsProperty(CmsPropertyDefinition.PROPERTY_SEARCH_CATEGORY, "category_3", null, true); 183 184 cms.lockResource("/folder1/"); 185 cms.writePropertyObject("/folder1/", cat1); 186 cms.unlockResource("/folder1/"); 187 cms.lockResource("/folder2/"); 188 cms.writePropertyObject("/folder2/", cat2); 189 cms.unlockResource("/folder2/"); 190 cms.lockResource("/types/"); 191 cms.writePropertyObject("/types/", cat3); 192 cms.unlockResource("/types/"); 193 194 OpenCms.getSearchManager().rebuildIndex(INDEX_OFFLINE, new CmsShellReport(cms.getRequestContext().getLocale())); 196 197 searchBean.init(cms); 198 searchBean.setIndex(INDEX_OFFLINE); 199 searchBean.setQuery(query); 200 searchBean.setMatchesPerPage(1000); 201 searchBean.setCalculateCategories(true); 202 203 searchResult = searchBean.getSearchResult(); 205 Iterator i = searchResult.iterator(); 206 System.out.println("Result sorted by relevance:"); 207 while (i.hasNext()) { 208 CmsSearchResult res = (CmsSearchResult)i.next(); 209 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 210 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 211 System.out.println(" score: " + res.getScore()); 212 } 213 214 Map categories = searchBean.getSearchResultCategories(); 215 assertNotNull(categories); 217 System.out.println(CmsSearchCategoryCollector.formatCategoryMap(categories)); 219 assertTrue(categories.containsKey(cat1.getValue())); 221 assertTrue(categories.containsKey(cat2.getValue())); 222 assertTrue(categories.containsKey(cat3.getValue())); 223 assertTrue(categories.containsKey(CmsSearchCategoryCollector.UNKNOWN_CATEGORY)); 224 assertEquals(4, categories.size()); 226 assertEquals(new Integer (7), categories.get(cat1.getValue())); 228 assertEquals(new Integer (4), categories.get(cat2.getValue())); 229 assertEquals(new Integer (1), categories.get(cat3.getValue())); 230 assertEquals(new Integer (1), categories.get(CmsSearchCategoryCollector.UNKNOWN_CATEGORY)); 231 232 searchBean.setCalculateCategories(false); 234 235 String [][] cats = new String [][] { 236 new String [] {cat1.getValue()}, 237 new String [] {cat2.getValue()}, 238 new String [] {cat3.getValue()}, 239 new String [] {cat1.getValue(), cat3.getValue()}, 240 new String [] {cat2.getValue(), cat3.getValue()}, 241 new String [] {cat1.getValue(), cat2.getValue()}, 242 new String [] {cat1.getValue(), cat2.getValue(), cat3.getValue()}}; 243 244 int[] expected = new int[] {7, 4, 1, 8, 5, 11, 12}; 245 246 for (int k = 0; k < expected.length; k++) { 247 int expect = expected[k]; 248 String [] catList = cats[k]; 249 searchBean.setCategories(catList); 250 searchResult = searchBean.getSearchResult(); 251 Iterator j = searchResult.iterator(); 252 System.out.println("Result for search " 253 + k 254 + " (found " 255 + searchResult.size() 256 + ", expected " 257 + expect 258 + ")"); 259 while (j.hasNext()) { 260 CmsSearchResult res = (CmsSearchResult)j.next(); 261 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 262 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 263 System.out.println(" score: " + res.getScore()); 264 } 265 assertEquals(expect, searchResult.size()); 266 } 267 } 268 269 274 public void testSearchRestriction() throws Exception { 275 276 CmsObject cms = getCmsObject(); 277 echo("Testing searching in search results"); 278 279 CmsSearch searchBean = new CmsSearch(); 280 List searchResult; 281 String query = "OpenCms"; 282 283 searchBean.init(cms); 284 searchBean.setIndex(INDEX_OFFLINE); 285 searchBean.setMatchesPerPage(1000); 286 searchBean.setQuery(query); 287 288 String [][] roots = new String [][] { 290 new String [] {"/folder1/"}, 291 new String [] {"/folder2/"}, 292 new String [] {"/types/"}, 293 new String [] {"/folder2/", "/types/"}, 294 new String [] {"/folder1/", "/types/"}, 295 new String [] {"/folder1/", "/folder2/"}, 296 new String [] {"/folder1/", "/folder2/", "/types/"}}; 297 298 int[] expected = new int[] {7, 4, 1, 5, 8, 11, 12}; 299 300 for (int i = 0; i < expected.length; i++) { 301 int expect = expected[i]; 302 String [] rootList = roots[i]; 303 searchBean.setSearchRoots(rootList); 304 searchResult = searchBean.getSearchResult(); 305 Iterator j = searchResult.iterator(); 306 System.out.println("Result for search " 307 + i 308 + " (found " 309 + searchResult.size() 310 + ", expected " 311 + expect 312 + ")"); 313 while (j.hasNext()) { 314 CmsSearchResult res = (CmsSearchResult)j.next(); 315 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 316 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 317 System.out.println(" score: " + res.getScore()); 318 } 319 assertEquals(expect, searchResult.size()); 320 } 321 322 CmsSearchParameters restriction; 324 restriction = new CmsSearchParameters("Alkacon", null, null, null, false, null); 325 326 expected = new int[] {3, 2, 1, 3, 4, 5, 6}; 327 328 for (int i = 0; i < expected.length; i++) { 329 int expect = expected[i]; 330 String [] rootList = roots[i]; 331 searchBean.setSearchRoots(rootList); 332 searchBean.setResultRestriction(restriction); 333 searchResult = searchBean.getSearchResult(); 334 Iterator j = searchResult.iterator(); 335 System.out.println("Result for search " 336 + i 337 + " (found " 338 + searchResult.size() 339 + ", expected " 340 + expect 341 + ")"); 342 while (j.hasNext()) { 343 CmsSearchResult res = (CmsSearchResult)j.next(); 344 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 345 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 346 System.out.println(" score: " + res.getScore()); 347 } 348 assertEquals(expect, searchResult.size()); 349 } 350 351 restriction = new CmsSearchParameters("Alkacon", Arrays.asList(new String [] {"meta"}), null, null, false, null); 353 354 expected = new int[] {0, 0, 1, 1, 1, 0, 1}; 355 356 for (int i = 0; i < expected.length; i++) { 357 int expect = expected[i]; 358 String [] rootList = roots[i]; 359 searchBean.setSearchRoots(rootList); 360 searchBean.setResultRestriction(restriction); 361 searchResult = searchBean.getSearchResult(); 362 Iterator j = searchResult.iterator(); 363 System.out.println("Result for search " 364 + i 365 + " (found " 366 + searchResult.size() 367 + ", expected " 368 + expect 369 + ")"); 370 while (j.hasNext()) { 371 CmsSearchResult res = (CmsSearchResult)j.next(); 372 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 373 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 374 System.out.println(" score: " + res.getScore()); 375 } 376 assertEquals(expect, searchResult.size()); 377 } 378 379 searchBean = new CmsSearch(); 382 searchBean.init(cms); 383 searchBean.setIndex(INDEX_OFFLINE); 384 searchBean.setMatchesPerPage(1000); 385 searchBean.setQuery(query); 386 restriction = new CmsSearchParameters( 387 null, 388 null, 389 null, 390 Arrays.asList(new String [] {"category_1", "category_3"}), 391 false, 392 null); 393 394 expected = new int[] {7, 0, 1, 1, 8, 7, 8}; 395 396 for (int i = 0; i < expected.length; i++) { 397 int expect = expected[i]; 398 String [] rootList = roots[i]; 399 searchBean.setSearchRoots(rootList); 400 searchBean.setResultRestriction(restriction); 401 searchResult = searchBean.getSearchResult(); 402 Iterator j = searchResult.iterator(); 403 System.out.println("Result for search " 404 + i 405 + " (found " 406 + searchResult.size() 407 + ", expected " 408 + expect 409 + ")"); 410 while (j.hasNext()) { 411 CmsSearchResult res = (CmsSearchResult)j.next(); 412 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 413 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 414 System.out.println(" score: " + res.getScore()); 415 } 416 assertEquals(expect, searchResult.size()); 417 } 418 } 419 420 425 public void testSortSearchResults() throws Exception { 426 427 CmsObject cms = getCmsObject(); 428 echo("Testing sorting of search results"); 429 430 CmsSearch searchBean = new CmsSearch(); 432 List searchResult; 433 String query = "OpenCms"; 434 435 OpenCms.getSearchManager().rebuildIndex(INDEX_OFFLINE, new CmsShellReport(cms.getRequestContext().getLocale())); 437 438 searchBean.init(cms); 439 searchBean.setIndex(INDEX_OFFLINE); 440 searchBean.setQuery(query); 441 442 searchResult = searchBean.getSearchResult(); 444 Iterator i = searchResult.iterator(); 445 System.out.println("Result sorted by relevance:"); 446 while (i.hasNext()) { 447 CmsSearchResult res = (CmsSearchResult)i.next(); 448 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 449 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 450 System.out.print(CmsDateUtil.getHeaderDate(res.getDateLastModified().getTime())); 451 System.out.println(" score: " + res.getScore()); 452 } 453 454 String lastTitle = null; 456 searchBean.setSortOrder(CmsSearchParameters.SORT_TITLE); 457 searchResult = searchBean.getSearchResult(); 458 i = searchResult.iterator(); 459 System.out.println("Result sorted by title:"); 460 while (i.hasNext()) { 461 CmsSearchResult res = (CmsSearchResult)i.next(); 462 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 463 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 464 System.out.print(CmsDateUtil.getHeaderDate(res.getDateLastModified().getTime())); 465 System.out.println(" score: " + res.getScore()); 466 if (lastTitle != null) { 467 assertTrue(lastTitle.compareTo(res.getTitle()) <= 0); 469 } 470 lastTitle = res.getTitle(); 471 } 472 473 long lastTime = 0; 475 searchBean.setSortOrder(CmsSearchParameters.SORT_DATE_LASTMODIFIED); 476 searchResult = searchBean.getSearchResult(); 477 i = searchResult.iterator(); 478 System.out.println("Result sorted by date last modified:"); 479 while (i.hasNext()) { 480 CmsSearchResult res = (CmsSearchResult)i.next(); 481 System.out.print(CmsStringUtil.padRight(cms.getRequestContext().removeSiteRoot(res.getPath()), 50)); 482 System.out.print(CmsStringUtil.padRight(res.getTitle(), 40)); 483 System.out.print(CmsDateUtil.getHeaderDate(res.getDateLastModified().getTime())); 484 System.out.println(" score: " + res.getScore()); 485 if (lastTime > 0) { 486 assertTrue(lastTime >= res.getDateLastModified().getTime()); 488 assertTrue(res.getScore() <= 100); 489 } 490 lastTime = res.getDateLastModified().getTime(); 491 } 492 493 assertNull(searchBean.getSearchResultCategories()); 494 } 495 } | Popular Tags |