1   /*
2    * Created by IntelliJ IDEA.
3    * User: Mike
4    * Date: Mar 26, 2004
5    * Time: 3:19:18 PM
6    */
7   package com.atlassian.bonnie.search;
8   
9   import com.atlassian.bonnie.LuceneUtils;
10  
11  import java.util.*;
12  
13  public class TestLuceneSearcher extends BaseLuceneTest
14  {
15      protected void setUp() throws Exception
16      {
17          super.setUp();
18  
19          List searchables = new LinkedList();
20          searchables.add(createSearchableObject(111, "apple", "apple desc"));
21          searchables.add(createSearchableObject(112, "orange", "orange desc"));
22          searchables.add(createSearchableObject(113, "appletwo", "appletwo desc"));
23          searchables.add(createSearchableObject(114, "Pear", "More dull content desc"));
24          index(searchables);
25      }
26  
27      public void testSimpleSearch() throws Exception
28      {
29          List searchHits = luceneSearcher.search(luceneSearcher.buildStandardQuery("description", "\"apple\""));
30  
31          assertNotNull(searchHits);
32          assertEquals(1, searchHits.size());
33          assertEquals(MockSearchableObject.class.getName()+"-111", searchHits.get(0));
34      }
35  
36      public void testLongerSearch() throws Exception
37      {
38          List searchHits = luceneSearcher.search(luceneSearcher.buildStandardQuery("description", "appl*"));
39  
40          assertNotNull(searchHits);
41          assertEquals(2, searchHits.size());
42          assertEquals(MockSearchableObject.class.getName()+"-111", searchHits.get(0));
43          assertEquals(MockSearchableObject.class.getName()+"-113", searchHits.get(1));
44      }
45  
46      public void testMultiFieldSearch() throws Exception
47      {
48          List searchHits = luceneSearcher.search(luceneSearcher.buildStandardQuery(new String[]{"description", "title"}, "apple OR pear"));
49  
50          assertNotNull(searchHits);
51          assertEquals(2, searchHits.size());
52          assertEquals(MockSearchableObject.class.getName()+"-111", searchHits.get(0));
53          assertEquals(MockSearchableObject.class.getName()+"-114", searchHits.get(1));
54      }
55  
56      public void testSearchByClass() throws Exception
57      {
58          MockSearchableObject uniqueClassedObject = createSearchableObjectDifferentClass(115, "fish", "More fish");
59          index(uniqueClassedObject);
60          List searchHits = luceneSearcher.search(LuceneUtils.buildSingleFieldSingleValueTermQuery(BaseDocumentBuilder.FieldName.CLASS_NAME, uniqueClassedObject.getClass().getName()));
61  
62          assertNotNull(searchHits);
63          assertEquals(1, searchHits.size());
64          assertEquals(uniqueClassedObject.getClass().getName() + "-115", searchHits.get(0));
65      }
66  
67      public void testSimpleSearchForFields() throws Exception
68      {
69          List searchHits = luceneSearcher.searchForFields(luceneSearcher.buildStandardQuery("description", "\"apple\""), makeFieldSet("description"), 0, 500);
70  
71          assertNotNull(searchHits);
72          assertEquals(1, searchHits.size());
73          Map result = (Map) searchHits.get(0);
74          assertEquals("apple desc", result.get("description"));
75      }
76  
77      public void testSearchForFieldsNoFieldsSpecified() throws Exception
78      {
79          List searchHits = luceneSearcher.searchForFields(luceneSearcher.buildStandardQuery("description", "\"apple\""), Collections.EMPTY_SET, 0, 500);
80  
81          assertNotNull(searchHits);
82          assertEquals(1, searchHits.size());
83          Map result = (Map) searchHits.get(0);
84          assertNull(result.get("description"));
85          assertEquals(MockSearchableObject.class.getName()+"-111", result.get(BaseDocumentBuilder.FieldName.HANDLE));
86      }
87  
88      public void testSearchForFieldsNullFieldsSpecified() throws Exception
89      {
90          List searchHits = luceneSearcher.searchForFields(luceneSearcher.buildStandardQuery("description", "\"apple\""), Collections.EMPTY_SET, 0, 500);
91  
92          assertNotNull(searchHits);
93          assertEquals(1, searchHits.size());
94          Map result = (Map) searchHits.get(0);
95          assertNull(result.get("description"));
96          assertEquals(MockSearchableObject.class.getName()+"-111", result.get(BaseDocumentBuilder.FieldName.HANDLE));
97      }
98  
99      public void testPagingInSearchForFields() throws Exception
100     {
101         index(createSearchableObject(115, "another apple", "apples again"));
102         index(createSearchableObject(116, "more apples", "more apples desc"));
103 
104         // we should get 4 results back for appl*, but 1 and 4 should be null, we want results 2 and 3 to have values for both fields
105         List searchHits = luceneSearcher.searchForFields(luceneSearcher.buildStandardQuery("description", "appl*"), makeFieldSet("title", "description", BaseDocumentBuilder.FieldName.HANDLE), 1, 2);
106 
107         assertNotNull(searchHits);
108         assertEquals(4, searchHits.size());
109         assertNull(searchHits.get(0));
110         assertNull(searchHits.get(3));
111         Map result = (Map) searchHits.get(1);
112         assertEquals(MockSearchableObject.class.getName()+"-111", result.get(BaseDocumentBuilder.FieldName.HANDLE));
113         assertEquals("apple desc", result.get("description"));
114         assertEquals("apple", result.get("title"));
115 
116         result = (Map) searchHits.get(2);
117         assertEquals(MockSearchableObject.class.getName()+"-115", result.get(BaseDocumentBuilder.FieldName.HANDLE));
118         assertEquals("apples again", result.get("description"));
119         assertEquals("another apple", result.get("title"));
120     }
121 
122     public void testGetAllFieldValues() throws Exception
123     {
124         index(makeSearchableObjectWithKeyword(200, "title 1", "keyword 1", "1 keyword"));
125         index(makeSearchableObjectWithKeyword(300, "title 2", "keyword 2", "2 keyword"));
126         index(makeSearchableObjectWithKeyword(400, "title 3", "keyword 2", "2 keyword"));
127         index(makeSearchableObjectWithKeyword(500, "title 4", "keyword 3", "1 keyword"));
128 
129         List valuesForKeyword1 = luceneSearcher.getAllFieldValues("keyword1");
130         String valuesForKeywordString1 = valuesForKeyword1.toString();
131 
132         assertEquals("Wanted four results, got: " + valuesForKeywordString1, 4, valuesForKeyword1.size());
133         assertTrue("Wanted empty value, got: " + valuesForKeywordString1, valuesForKeyword1.contains(""));
134         assertTrue("Wanted keyword 1, got: " + valuesForKeywordString1, valuesForKeyword1.contains("keyword 1"));
135         assertTrue("Wanted keyword 2, got: " + valuesForKeywordString1, valuesForKeyword1.contains("keyword 2"));
136         assertTrue("Wanted keyword 3, got: " + valuesForKeywordString1, valuesForKeyword1.contains("keyword 3"));
137 
138         List valuesForKeyword2 = luceneSearcher.getAllFieldValues("keyword2");
139         String valuesForKeywordString2 = valuesForKeyword2.toString();
140 
141         assertEquals("Wanted four results, got: " + valuesForKeywordString2, 3, valuesForKeyword2.size());
142         assertTrue("Wanted empty value, got: " + valuesForKeywordString2, valuesForKeyword2.contains(""));
143         assertTrue("Wanted keyword 1, got: " + valuesForKeywordString2, valuesForKeyword2.contains("1 keyword"));
144         assertTrue("Wanted keyword 2, got: " + valuesForKeywordString2, valuesForKeyword2.contains("2 keyword"));
145     }
146 
147     private Set makeFieldSet(String f1, String f2, String f3)
148     {
149         Set set = new HashSet();
150         set.add(f1);
151         set.add(f2);
152         set.add(f3);
153         return set;
154     }
155 
156     private Set makeFieldSet(String fieldname)
157     {
158         Set set = new HashSet();
159         set.add(fieldname);
160         return set;
161     }
162 
163     private MockSearchableObject makeSearchableObjectWithKeyword(int id, String title, String keyword1, String keyword2)
164     {
165         MockSearchableObject obj = createSearchableObject(id, title, "I like cheese");
166         obj.setKeyword1(keyword1);
167         obj.setKeyword2(keyword2);
168         return obj;
169     }
170 
171 }