Project

General

Profile

« Previous | Next » 

Revision 6602

uses prepared statement parameter binding for queries
http://bugzilla.ecoinformatics.org/show_bug.cgi?id=5527

View differences:

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