Revision 3308
Added by Jing Tao almost 17 years ago
QuerySpecification.java | ||
---|---|---|
114 | 114 |
|
115 | 115 |
public static final char PREDICATE_END = ']'; |
116 | 116 |
|
117 |
private boolean hasAttributeReturnField = false; |
|
117 |
//private boolean hasAttributeReturnField = false;
|
|
118 | 118 |
|
119 |
private Hashtable attributeReturnList = new Hashtable(); |
|
119 |
//private Hashtable attributeReturnList = new Hashtable();
|
|
120 | 120 |
|
121 |
private int countAttributeReturnField = 0; |
|
121 |
//private int countAttributeReturnField = 0;
|
|
122 | 122 |
|
123 | 123 |
private StringBuffer textBuffer = new StringBuffer(); |
124 | 124 |
|
... | ... | |
393 | 393 |
} |
394 | 394 |
} |
395 | 395 |
|
396 |
|
|
396 | 397 |
/** |
397 |
* A method to get if the query has an attribute return field |
|
398 |
*/ |
|
399 |
public boolean containsAttributeReturnField() |
|
400 |
{ |
|
401 |
return hasAttributeReturnField; |
|
402 |
} |
|
403 |
|
|
404 |
/** |
|
405 | 398 |
* Accessor method to return the identifier of this Query |
406 | 399 |
*/ |
407 | 400 |
public String getIdentifier() |
... | ... | |
710 | 703 |
} |
711 | 704 |
} |
712 | 705 |
*/ |
713 |
public void handleReturnField(String inputString)
|
|
706 |
private void handleReturnField(String inputString)
|
|
714 | 707 |
{ |
715 | 708 |
int attributePos = inputString.indexOf(ATTRIBUTESYMBOL); |
716 | 709 |
int predicateStart = -1; |
... | ... | |
755 | 748 |
|
756 | 749 |
containsExtendedSQL = true; |
757 | 750 |
|
758 |
// make sure if return fields has an attribute or not |
|
759 |
if (attributePos == -1) |
|
760 |
{ |
|
751 |
|
|
761 | 752 |
// no attribute value will be returned |
762 | 753 |
logMetacat.info("QuerySpecification.handleReturnField(): " ); |
763 | 754 |
logMetacat.info(" there are no attributes in the XPATH statement" ); |
764 | 755 |
returnFieldList.add(inputString); |
765 |
return; |
|
766 |
} |
|
756 |
|
|
767 | 757 |
|
768 |
// case where the return field is solely an attribute |
|
769 |
logMetacat.info("QuerySpecification.handleReturnField(): " ); |
|
770 |
logMetacat.info(" Found an attribute in the XPATH statement." ); |
|
771 |
String returnPath = inputString.substring(0, |
|
772 |
attributePos == 0 ? attributePos : attributePos - 1); |
|
773 |
String attributeName = inputString.substring(attributePos + 1).trim(); |
|
774 |
Vector pathInfo = new Vector(); |
|
775 |
// the vector has the information about return path and |
|
776 |
// attributename |
|
777 |
pathInfo.addElement(returnPath); |
|
778 |
pathInfo.addElement(attributeName); |
|
779 |
// put the vector into a hash table. The reseaon why don't put |
|
780 |
// return path or attributename as a key is because they are not |
|
781 |
// unique |
|
782 |
attributeReturnList.put(new Integer(countAttributeReturnField), |
|
783 |
pathInfo); |
|
784 |
countAttributeReturnField++; |
|
785 |
hasAttributeReturnField = true; |
|
758 |
|
|
786 | 759 |
} |
787 | 760 |
|
788 | 761 |
/** |
... | ... | |
1080 | 1053 |
tempVector.add(it.next()); |
1081 | 1054 |
} |
1082 | 1055 |
|
1083 |
Enumeration attEnum = attributeReturnList.elements(); |
|
1056 |
/*Enumeration attEnum = attributeReturnList.elements();
|
|
1084 | 1057 |
while(attEnum.hasMoreElements()){ |
1085 | 1058 |
Iterator tempIt = ((Vector)attEnum.nextElement()).iterator(); |
1086 | 1059 |
String rfield = ""; |
... | ... | |
1097 | 1070 |
} |
1098 | 1071 |
} |
1099 | 1072 |
tempVector.add(rfield); |
1100 |
} |
|
1073 |
}*/
|
|
1101 | 1074 |
|
1102 | 1075 |
// Sort the temporary vector |
1103 | 1076 |
java.util.Collections.sort(tempVector); |
... | ... | |
1146 | 1119 |
} |
1147 | 1120 |
}*/ |
1148 | 1121 |
|
1149 |
/** |
|
1150 |
* This method prints sql that finds the values of attributes in the xml |
|
1151 |
* documents based upon the whether the returnfield tag in the pathquery |
|
1152 |
* document has an attribute symbol (@). This allows for customization of |
|
1153 |
* the returned fields. |
|
1154 |
* |
|
1155 |
* @param doclist the list of document ids to search |
|
1156 |
* @param useXMLIndex a boolean flag indicating whether to search using |
|
1157 |
* xml_index |
|
1158 |
*/ |
|
1159 |
public String printAttributeQuery(String doclist, boolean useXMLIndex) |
|
1160 |
{ |
|
1161 |
if (useXMLIndex && !containsPredicates) { |
|
1162 |
return printAttributeQuery(doclist); |
|
1163 |
} else { |
|
1164 |
StringBuffer self = new StringBuffer(); |
|
1165 |
boolean firstfield = true; |
|
1166 |
//put the returnfields attributes into the query |
|
1167 |
//the for loop allows for multiple fields and attributes |
|
1168 |
Enumeration returnAttributes = attributeReturnList.elements(); |
|
1169 |
while (returnAttributes.hasMoreElements()) { |
|
1170 |
Vector currentVector = (Vector) returnAttributes.nextElement(); |
|
1171 |
String returnPath = (String) currentVector.elementAt(0); |
|
1172 |
String attributeName = (String) currentVector.elementAt(1); |
|
1173 |
if (firstfield) { |
|
1174 |
firstfield = false; |
|
1175 |
} else { |
|
1176 |
self.append(" UNION "); |
|
1177 |
} |
|
1178 |
self.append("select xml_nodes.docid, '"); |
|
1179 |
self.append(returnPath.replaceAll("'", "''")); |
|
1180 |
self.append("' as path, xml_nodes.nodedata, xml_nodes.nodename "); |
|
1181 |
self.append("from xml_nodes, xml_documents "); |
|
1182 |
self.append("where parentnodeid IN "); |
|
1183 |
self.append(QueryTerm.useNestedStatements(returnPath)); |
|
1184 |
self.append(" AND xml_nodes.nodename like '"); |
|
1185 |
self.append(attributeName); |
|
1186 |
self.append("' AND xml_nodes.docid in ("); |
|
1187 |
self.append(doclist); |
|
1188 |
self.append(") AND xml_nodes.nodetype = 'ATTRIBUTE'"); |
|
1189 |
self.append(" AND xml_nodes.rootnodeid = xml_documents.rootnodeid"); |
|
1190 |
} |
|
1122 |
|
|
1191 | 1123 |
|
1192 |
logMetacat.info("Attribute query: " + self.toString()); |
|
1193 | 1124 |
|
1194 |
return self.toString(); |
|
1195 |
} |
|
1196 |
} |
|
1197 | 1125 |
|
1198 |
/** |
|
1199 |
* This method prints sql that finds the values of attributes in the xml |
|
1200 |
* documents based upon the whether the returnfield tag in the pathquery |
|
1201 |
* document has an attribute symbol (@). This allows for customization of |
|
1202 |
* the returned fields. |
|
1203 |
* |
|
1204 |
* @param doclist the list of document ids to search |
|
1205 |
*/ |
|
1206 |
public String printAttributeQuery(String doclist) |
|
1207 |
{ |
|
1208 |
StringBuffer self = new StringBuffer(); |
|
1209 |
self.append("select xml_nodes.docid, xml_index.path, "); |
|
1210 |
self.append("xml_nodes.nodedata, xml_nodes.nodename "); |
|
1211 |
self.append("from xml_index, xml_nodes where xml_index.nodeid="); |
|
1212 |
self.append("xml_nodes.parentnodeid and ("); |
|
1213 |
boolean firstfield = true; |
|
1214 |
//put the returnfields attributes into the query |
|
1215 |
//the for loop allows for multiple fields and attributes |
|
1216 |
Enumeration returnAttributes = attributeReturnList.elements(); |
|
1217 |
while (returnAttributes.hasMoreElements()) { |
|
1218 |
Vector currentVector = (Vector) returnAttributes.nextElement(); |
|
1219 |
String returnPath = (String) currentVector.elementAt(0); |
|
1220 |
String attributeName = (String) currentVector.elementAt(1); |
|
1221 |
if (firstfield) { |
|
1222 |
firstfield = false; |
|
1223 |
self.append("( "); |
|
1224 |
if(returnPath != null){ |
|
1225 |
self.append("xml_index.path like '"); |
|
1226 |
self.append(returnPath); |
|
1227 |
self.append("' AND "); |
|
1228 |
}else { |
|
1229 |
logMetacat.info("QuerySpecification.printAttributeQuery: " |
|
1230 |
+ "returnPath is: " + returnPath); |
|
1231 |
} |
|
1232 |
self.append("xml_nodes.nodename like '"); |
|
1233 |
self.append(attributeName); |
|
1234 |
self.append("') "); |
|
1235 |
} else { |
|
1236 |
self.append(" or ("); |
|
1237 |
if(returnPath != null){ |
|
1238 |
self.append("xml_index.path like '"); |
|
1239 |
self.append(returnPath); |
|
1240 |
self.append("' AND "); |
|
1241 |
}else { |
|
1242 |
logMetacat.info("QuerySpecification.printAttributeQuery: " |
|
1243 |
+ "returnPath is null: " + returnPath); |
|
1244 |
} |
|
1245 |
self.append("xml_nodes.nodename like '"); |
|
1246 |
self.append(attributeName); |
|
1247 |
self.append("') "); |
|
1248 |
} |
|
1249 |
} |
|
1250 |
self.append(") AND xml_nodes.docid in ("); |
|
1251 |
self.append(doclist); |
|
1252 |
self.append(") AND xml_nodes.nodetype = 'ATTRIBUTE'"); |
|
1253 |
logMetacat.warn("Attribute query: " + self.toString()); |
|
1254 |
|
|
1255 |
return self.toString(); |
|
1256 |
} |
|
1257 |
|
|
1258 | 1126 |
public static String printRelationSQL(String docid) |
1259 | 1127 |
{ |
1260 | 1128 |
StringBuffer self = new StringBuffer(); |
Also available in: Unified diff
Merge the getting return fields for both elements and attributes.