Revision 6602
Added by ben leinfelder over 12 years ago
QueryGroup.java | ||
---|---|---|
35 | 35 |
import edu.ucsb.nceas.metacat.util.SystemUtil; |
36 | 36 |
|
37 | 37 |
import java.io.*; |
38 |
import java.util.ArrayList; |
|
38 | 39 |
import java.util.Hashtable; |
40 |
import java.util.List; |
|
39 | 41 |
import java.util.Stack; |
40 | 42 |
import java.util.Vector; |
41 | 43 |
import java.util.Enumeration; |
... | ... | |
51 | 53 |
//will hold query terms which has same search value. |
52 | 54 |
private Vector queryTermsInPathIndex = null; //this vector holds query terms without same value |
53 | 55 |
// and search path is in path index. |
54 |
private Vector queryTerms = null;//this vector only holds query terms without same search value. |
|
56 |
private Vector<QueryTerm> queryTerms = null;//this vector only holds query terms without same search value.
|
|
55 | 57 |
// and search path is NOT in path index. |
56 | 58 |
private Vector queryGroupsChildren = null; |
57 | 59 |
private static Logger logMetacat = Logger.getLogger(QueryGroup.class); |
... | ... | |
70 | 72 |
children = new Vector(); |
71 | 73 |
queryTermsWithSameValue = new Vector(); |
72 | 74 |
queryTermsInPathIndex = new Vector(); |
73 |
queryTerms = new Vector(); |
|
75 |
queryTerms = new Vector<QueryTerm>();
|
|
74 | 76 |
queryGroupsChildren = new Vector(); |
75 | 77 |
} |
76 | 78 |
|
... | ... | |
110 | 112 |
/** |
111 | 113 |
* create a SQL serialization of the query that this instance represents |
112 | 114 |
*/ |
113 |
public String printSQL(boolean useXMLIndex) { |
|
115 |
public String printSQL(boolean useXMLIndex, List<Object> parameterValues) { |
|
116 |
|
|
114 | 117 |
StringBuffer self = new StringBuffer(); |
115 | 118 |
StringBuffer queryString = new StringBuffer(); |
116 | 119 |
|
... | ... | |
118 | 121 |
|
119 | 122 |
if (!queryTermsWithSameValue.isEmpty() || !queryTermsInPathIndex.isEmpty()) |
120 | 123 |
{ |
121 |
String pathIndexQueryString = printSQLStringInPathIndex(); |
|
124 |
// keep track of the values we add as prepared statement question marks (?) |
|
125 |
List<Object> groupValues = new ArrayList<Object>(); |
|
126 |
String pathIndexQueryString = printSQLStringInPathIndex(groupValues); |
|
127 |
parameterValues.addAll(groupValues); |
|
122 | 128 |
queryString.append(pathIndexQueryString); |
123 | 129 |
if (queryString != null) |
124 | 130 |
{ |
... | ... | |
129 | 135 |
for (int i=0; i<queryGroupsChildren.size(); i++) |
130 | 136 |
{ |
131 | 137 |
|
132 |
|
|
133 |
QueryGroup qg = (QueryGroup)queryGroupsChildren.elementAt(i); |
|
134 |
String queryGroupSQL = qg.printSQL(useXMLIndex); |
|
135 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " |
|
136 |
+ queryGroupSQL); |
|
138 |
// keep track of the values we add as prepared statement question marks (?) |
|
139 |
List<Object> childrenValues = new ArrayList<Object>(); |
|
140 |
// get the group |
|
141 |
QueryGroup qg = (QueryGroup) queryGroupsChildren.elementAt(i); |
|
142 |
String queryGroupSQL = qg.printSQL(useXMLIndex, childrenValues); |
|
143 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " + queryGroupSQL); |
|
137 | 144 |
if (first) { |
138 | 145 |
first = false; |
139 | 146 |
} else { |
... | ... | |
141 | 148 |
queryString.append(" " + operator + " "); |
142 | 149 |
} |
143 | 150 |
} |
151 |
// add the sql |
|
144 | 152 |
queryString.append(queryGroupSQL); |
153 |
// add the parameter values |
|
154 |
parameterValues.addAll(childrenValues); |
|
145 | 155 |
|
146 |
// count percerntage number
|
|
156 |
// count percentage number |
|
147 | 157 |
int count = qg.getPercentageSymbolCount(); |
148 | 158 |
countPercentageSearchItem = countPercentageSearchItem + count; |
149 | 159 |
} |
150 | 160 |
|
151 | 161 |
for (int i=0; i<queryTerms.size(); i++) |
152 | 162 |
{ |
153 |
QueryTerm qt = (QueryTerm)queryTerms.elementAt(i); |
|
154 |
String termQueryString = qt.printSQL(useXMLIndex); |
|
155 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " |
|
156 |
+ termQueryString); |
|
157 |
if(!(qt.getSearchMode().equals("contains") && qt.getValue().equals("%"))){ |
|
163 |
// keep track of the values we add as prepared statement question marks (?) |
|
164 |
List<Object> termValues = new ArrayList<Object>(); |
|
165 |
// get the term |
|
166 |
QueryTerm qt = (QueryTerm)queryTerms.elementAt(i); |
|
167 |
String termQueryString = qt.printSQL(useXMLIndex, termValues); |
|
168 |
logMetacat.info("In QueryGroup.printSQL.. found a QueryGroup: " + termQueryString); |
|
169 |
if (!(qt.getSearchMode().equals("contains") && qt.getValue().equals("%"))){ |
|
158 | 170 |
if (first) { |
159 | 171 |
first = false; |
160 | 172 |
} else { |
... | ... | |
162 | 174 |
queryString.append(" " + operator + " "); |
163 | 175 |
} |
164 | 176 |
} |
177 |
// include the sql |
|
165 | 178 |
queryString.append(termQueryString); |
166 |
|
|
179 |
// include the parameter values |
|
180 |
parameterValues.addAll(termValues); |
|
181 |
|
|
167 | 182 |
// count percerntage number |
168 | 183 |
int count = qt.getPercentageSymbolCount(); |
169 | 184 |
countPercentageSearchItem = countPercentageSearchItem + count; |
... | ... | |
191 | 206 |
* we still use "OR" to replace UNION action (we only handle union operator in the query group). |
192 | 207 |
* |
193 | 208 |
*/ |
194 |
private String printSQLStringInPathIndex() |
|
209 |
private String printSQLStringInPathIndex(List<Object> parameterValues)
|
|
195 | 210 |
{ |
196 | 211 |
String sql =""; |
197 | 212 |
String value =""; |
... | ... | |
221 | 236 |
|
222 | 237 |
sqlBuff.append(" ("); |
223 | 238 |
|
239 |
// keep track of parameter values |
|
240 |
List<Object> searchValues = new ArrayList<Object>(); |
|
241 |
|
|
224 | 242 |
// get the general search criteria (no path info) |
225 |
String searchTermSQL = term1.printSearchExprSQL(); |
|
243 |
String searchTermSQL = term1.printSearchExprSQL(searchValues); |
|
244 |
|
|
245 |
// add the SQL |
|
226 | 246 |
sqlBuff.append(searchTermSQL); |
227 | 247 |
|
228 |
sqlBuff.append("AND path IN ("); |
|
248 |
// add parameter values |
|
249 |
parameterValues.addAll(searchValues); |
|
250 |
|
|
251 |
sqlBuff.append("AND path IN ( "); |
|
229 | 252 |
|
230 | 253 |
//gets every path in query term object |
231 | 254 |
for (int i=0; i<queryTermVector.size(); i++) |
... | ... | |
238 | 261 |
if (first) |
239 | 262 |
{ |
240 | 263 |
first = false; |
241 |
sqlBuff.append("'"); |
|
242 |
sqlBuff.append(path); |
|
243 |
sqlBuff.append("'"); |
|
244 |
|
|
264 |
sqlBuff.append("?"); |
|
265 |
parameterValues.add(path); |
|
245 | 266 |
} |
246 | 267 |
else |
247 | 268 |
{ |
248 |
sqlBuff.append(",'"); |
|
249 |
sqlBuff.append(path); |
|
250 |
sqlBuff.append("'"); |
|
269 |
sqlBuff.append(", ?"); |
|
270 |
parameterValues.add(path); |
|
251 | 271 |
} |
252 | 272 |
index++; |
253 | 273 |
if (value != null && (value.equals("%") || value.equals("%%%"))) |
... | ... | |
256 | 276 |
} |
257 | 277 |
} |
258 | 278 |
} |
259 |
sqlBuff.append("))"); |
|
279 |
sqlBuff.append(" ))");
|
|
260 | 280 |
|
261 | 281 |
} |
262 | 282 |
} |
... | ... | |
273 | 293 |
sqlBuff.append(" "+"OR"+" "); |
274 | 294 |
} |
275 | 295 |
sqlBuff.append("("); |
276 |
sqlBuff.append(term.printSQL(true)); |
|
296 |
// keep track of the parameter values for this sql |
|
297 |
List<Object> termParameterValues = new ArrayList<Object>(); |
|
298 |
String termSQL = term.printSQL(true, termParameterValues); |
|
299 |
sqlBuff.append(termSQL); |
|
277 | 300 |
sqlBuff.append(")"); |
301 |
// add the param values |
|
302 |
parameterValues.addAll(termParameterValues); |
|
278 | 303 |
index++; |
279 | 304 |
} |
280 | 305 |
} |
... | ... | |
338 | 363 |
// new query term into search value in handle new |
339 | 364 |
// query term"); |
340 | 365 |
// find a target which has same search value |
341 |
Vector newSameValueVector = new Vector();
|
|
366 |
Vector<QueryTerm> newSameValueVector = new Vector<QueryTerm>();
|
|
342 | 367 |
newSameValueVector.add(term); |
343 | 368 |
newSameValueVector.addElement(newTerm); |
344 | 369 |
queryTermsWithSameValue.add(newSameValueVector); |
... | ... | |
349 | 374 |
// no same search value was found in queryTerms. |
350 | 375 |
// then we need search queryTermsWithSameValue |
351 | 376 |
for (int i = 0; i < queryTermsWithSameValue.size(); i++) { |
352 |
Vector sameValueVec = (Vector) queryTermsWithSameValue |
|
353 |
.elementAt(i); |
|
377 |
Vector sameValueVec = (Vector) queryTermsWithSameValue.elementAt(i); |
|
354 | 378 |
// we only compare the first query term |
355 | 379 |
QueryTerm term = (QueryTerm) sameValueVec.elementAt(0); |
356 | 380 |
if (term != null && term.hasSameSearchValue(newTerm)) { |
Also available in: Unified diff
uses prepared statement parameter binding for queries
http://bugzilla.ecoinformatics.org/show_bug.cgi?id=5527