Revision 3237
Added by Jing Tao over 17 years ago
src/edu/ucsb/nceas/metacat/QueryGroup.java | ||
---|---|---|
49 | 49 |
private Vector queryTerms = null;//this vector only holds query terms without same search value. |
50 | 50 |
private Vector queryGroupsChildren = null; |
51 | 51 |
private static Logger logMetacat = Logger.getLogger(QueryGroup.class); |
52 |
private static String UNION = "UNION"; |
|
52 | 53 |
|
53 | 54 |
/** |
54 | 55 |
* construct a new QueryGroup |
... | ... | |
70 | 71 |
* @param qgroup the query group to be added to the list of terms |
71 | 72 |
*/ |
72 | 73 |
public void addChild(QueryGroup qgroup) { |
73 |
//children.add((Object)qgroup);
|
|
74 |
children.add((Object)qgroup); |
|
74 | 75 |
queryGroupsChildren.add(qgroup); |
75 | 76 |
} |
76 | 77 |
|
... | ... | |
80 | 81 |
* @param qterm the query term to be added to the list of terms |
81 | 82 |
*/ |
82 | 83 |
public void addChild(QueryTerm qterm) { |
83 |
// children.add((Object)qterm);
|
|
84 |
children.add((Object)qterm); |
|
84 | 85 |
handleNewQueryTerms(qterm); |
85 | 86 |
|
86 | 87 |
} |
87 | 88 |
|
88 |
/**
|
|
89 |
/* |
|
89 | 90 |
* Retrieve an Enumeration of query terms for this QueryGroup |
90 | 91 |
*/ |
91 |
public Enumeration getChildren() {
|
|
92 |
private Enumeration getChildren() {
|
|
92 | 93 |
return children.elements(); |
93 | 94 |
} |
94 | 95 |
|
... | ... | |
106 | 107 |
|
107 | 108 |
boolean first = true; |
108 | 109 |
|
109 |
Enumeration en= getChildren(); |
|
110 |
while (en.hasMoreElements()) { |
|
111 |
Object qobject = en.nextElement(); |
|
112 |
if (qobject instanceof QueryGroup) { |
|
113 |
QueryGroup qg = (QueryGroup)qobject; |
|
110 |
if (!queryTermsWithSameValue.isEmpty()) |
|
111 |
{ |
|
112 |
printSQLStringWithSameSearchValue(); |
|
113 |
} |
|
114 |
|
|
115 |
for (int i=0; i<queryGroupsChildren.size(); i++) |
|
116 |
{ |
|
117 |
|
|
118 |
|
|
119 |
QueryGroup qg = (QueryGroup)queryGroupsChildren.elementAt(i); |
|
114 | 120 |
String queryGroupSQL = qg.printSQL(useXMLIndex); |
115 | 121 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " |
116 |
+ queryGroupSQL); |
|
117 |
|
|
122 |
+ queryGroupSQL); |
|
118 | 123 |
if (first) { |
119 | 124 |
first = false; |
120 | 125 |
} else { |
... | ... | |
127 | 132 |
// count percerntage number |
128 | 133 |
int count = qg.getPercentageSymbolCount(); |
129 | 134 |
countPercentageSearchItem = countPercentageSearchItem + count; |
130 |
} else if (qobject instanceof QueryTerm) { |
|
131 |
QueryTerm qt = (QueryTerm)qobject; |
|
135 |
} |
|
136 |
|
|
137 |
for (int i=0; i<queryTerms.size(); i++) |
|
138 |
{ |
|
139 |
QueryTerm qt = (QueryTerm)queryTerms.elementAt(i); |
|
132 | 140 |
String termQueryString = qt.printSQL(useXMLIndex); |
133 | 141 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " |
134 | 142 |
+ termQueryString); |
... | ... | |
141 | 149 |
} |
142 | 150 |
} |
143 | 151 |
queryString.append(termQueryString); |
144 |
} |
|
152 |
|
|
145 | 153 |
// count percerntage number |
146 | 154 |
int count = qt.getPercentageSymbolCount(); |
147 | 155 |
countPercentageSearchItem = countPercentageSearchItem + count; |
148 |
} else { |
|
149 |
System.err.println("qobject wrong type: fatal error"); |
|
150 |
} |
|
156 |
} |
|
151 | 157 |
} |
152 | 158 |
|
153 | 159 |
if(!queryString.toString().equals("")){ |
... | ... | |
162 | 168 |
} |
163 | 169 |
|
164 | 170 |
|
171 |
|
|
172 |
|
|
165 | 173 |
/* |
166 | 174 |
* If every query term in a queryGroup share a search value, we should |
167 | 175 |
* use a new query to replace the original query term query in order to |
... | ... | |
177 | 185 |
|
178 | 186 |
if (queryTermsWithSameValue != null) |
179 | 187 |
{ |
180 |
QueryTerm term1 = (QueryTerm)queryTermsWithSameValue.elementAt(0); |
|
181 |
value = term1.getValue(); |
|
182 |
boolean first = true; |
|
183 |
sqlBuff.append("SELECT DISTINCT docid FROM xml_path_index WHERE UPPER(nodedata) LIKE '%"); |
|
184 |
sqlBuff.append(value); |
|
185 |
sqlBuff.append("%' AND path IN ("); |
|
186 |
//gets every path in query term object |
|
187 |
for (int i=0; i<queryTermsWithSameValue.size(); i++) |
|
188 |
boolean firstVector = true; |
|
189 |
for (int j=0; j<queryTermsWithSameValue.size(); j++) |
|
188 | 190 |
{ |
189 |
QueryTerm term = (QueryTerm)queryTermsWithSameValue.elementAt(i); |
|
190 |
value = term.getValue(); |
|
191 |
String path = term.getPathExpression(); |
|
192 |
if (path != null && !path.equals("")) |
|
193 |
{ |
|
194 |
if (first) |
|
195 |
{ |
|
196 |
first = false; |
|
197 |
sqlBuff.append("'"); |
|
198 |
sqlBuff.append(path); |
|
199 |
sqlBuff.append("'"); |
|
200 |
|
|
201 |
} |
|
202 |
else |
|
203 |
{ |
|
204 |
sqlBuff.append(",'"); |
|
205 |
sqlBuff.append(path); |
|
206 |
sqlBuff.append("'"); |
|
207 |
} |
|
208 |
index++; |
|
209 |
} |
|
210 |
} |
|
211 |
sqlBuff.append(")"); |
|
191 |
|
|
192 |
Vector queryTermVector = (Vector)queryTermsWithSameValue.elementAt(j); |
|
193 |
QueryTerm term1 = (QueryTerm)queryTermVector.elementAt(0); |
|
194 |
value = term1.getValue(); |
|
195 |
boolean first = true; |
|
196 |
if (firstVector) |
|
197 |
{ |
|
198 |
firstVector = false; |
|
199 |
} |
|
200 |
else |
|
201 |
{ |
|
202 |
sqlBuff.append(" "+operator+" "); |
|
203 |
} |
|
204 |
sqlBuff.append("SELECT DISTINCT docid FROM xml_path_index WHERE UPPER(nodedata) LIKE '%"); |
|
205 |
sqlBuff.append(value); |
|
206 |
sqlBuff.append("%' AND path IN ("); |
|
207 |
//gets every path in query term object |
|
208 |
for (int i=0; i<queryTermVector.size(); i++) |
|
209 |
{ |
|
210 |
QueryTerm term = (QueryTerm)queryTermVector.elementAt(i); |
|
211 |
value = term.getValue(); |
|
212 |
String path = term.getPathExpression(); |
|
213 |
if (path != null && !path.equals("")) |
|
214 |
{ |
|
215 |
if (first) |
|
216 |
{ |
|
217 |
first = false; |
|
218 |
sqlBuff.append("'"); |
|
219 |
sqlBuff.append(path); |
|
220 |
sqlBuff.append("'"); |
|
221 |
|
|
222 |
} |
|
223 |
else |
|
224 |
{ |
|
225 |
sqlBuff.append(",'"); |
|
226 |
sqlBuff.append(path); |
|
227 |
sqlBuff.append("'"); |
|
228 |
} |
|
229 |
index++; |
|
230 |
if (value != null && (value.equals("%") || value.equals("%%%"))) |
|
231 |
{ |
|
232 |
countPercentageSearchItem++; |
|
233 |
} |
|
234 |
} |
|
235 |
} |
|
236 |
sqlBuff.append(")"); |
|
212 | 237 |
|
238 |
} |
|
213 | 239 |
} |
214 | 240 |
if (index >0) |
215 | 241 |
{ |
... | ... | |
250 | 276 |
*/ |
251 | 277 |
private void handleNewQueryTerms(QueryTerm newTerm) |
252 | 278 |
{ |
253 |
if (newTerm != null) |
|
279 |
// currently we only handle UNION group |
|
280 |
if (newTerm != null ) |
|
254 | 281 |
{ |
255 |
for (int i=0; i<queryTerms.size(); i++) |
|
256 |
{ |
|
257 |
QueryTerm term = (QueryTerm)queryTerms.elementAt(i); |
|
258 |
if (term != null && term.hasSameSearchValue(newTerm)) |
|
259 |
{ |
|
260 |
// find a target which has same search value |
|
261 |
Vector newSameValueVector = new Vector(); |
|
262 |
newSameValueVector.add(term); |
|
263 |
newSameValueVector.addElement(newTerm); |
|
264 |
queryTermsWithSameValue.add(newSameValueVector); |
|
265 |
queryTerms.remove(i); |
|
266 |
return; |
|
267 |
} |
|
268 |
} |
|
269 |
// no same search value was found in queryTerms. |
|
270 |
// then we need search queryTermsWithSameValue |
|
271 |
for (int i=0; i<queryTermsWithSameValue.size(); i++) |
|
272 |
{ |
|
273 |
Vector sameValueVec = (Vector)queryTermsWithSameValue.elementAt(i); |
|
274 |
// we only compare the first query term |
|
275 |
QueryTerm term = (QueryTerm)sameValueVec.elementAt(0); |
|
276 |
if (term != null && term.hasSameSearchValue(newTerm)) |
|
277 |
{ |
|
278 |
sameValueVec.add(newTerm); |
|
279 |
return; |
|
280 |
} |
|
281 |
} |
|
282 |
//we only handle union operator now. |
|
283 |
if (operator != null && operator.equalsIgnoreCase(UNION)) |
|
284 |
{ |
|
285 |
for (int i=0; i<queryTerms.size(); i++) |
|
286 |
{ |
|
287 |
QueryTerm term = (QueryTerm)queryTerms.elementAt(i); |
|
288 |
if (term != null && term.hasSameSearchValue(newTerm)) |
|
289 |
{ |
|
290 |
// find a target which has same search value |
|
291 |
Vector newSameValueVector = new Vector(); |
|
292 |
newSameValueVector.add(term); |
|
293 |
newSameValueVector.addElement(newTerm); |
|
294 |
queryTermsWithSameValue.add(newSameValueVector); |
|
295 |
queryTerms.remove(i); |
|
296 |
return; |
|
297 |
} |
|
298 |
} |
|
299 |
// no same search value was found in queryTerms. |
|
300 |
// then we need search queryTermsWithSameValue |
|
301 |
for (int i=0; i<queryTermsWithSameValue.size(); i++) |
|
302 |
{ |
|
303 |
Vector sameValueVec = (Vector)queryTermsWithSameValue.elementAt(i); |
|
304 |
// we only compare the first query term |
|
305 |
QueryTerm term = (QueryTerm)sameValueVec.elementAt(0); |
|
306 |
if (term != null && term.hasSameSearchValue(newTerm)) |
|
307 |
{ |
|
308 |
sameValueVec.add(newTerm); |
|
309 |
return; |
|
310 |
} |
|
311 |
} |
|
312 |
} |
|
282 | 313 |
// both queryTerms and queryTermsWithSameValue don't have the search value, |
283 | 314 |
// add this newTerm to queryTerms |
284 | 315 |
queryTerms.add(newTerm); |
Also available in: Unified diff
Add method to handle union operator.