1
2
3
4
5
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
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 }