1 16 package org.pentaho.data.connection.xquery; 17 18 import java.math.BigDecimal ; 19 import java.sql.Date ; 20 import java.sql.Timestamp ; 21 import java.util.Iterator ; 22 import java.util.Map ; 23 import net.sf.saxon.om.Axis; 24 import net.sf.saxon.om.AxisIterator; 25 import net.sf.saxon.query.DynamicQueryContext; 26 import net.sf.saxon.query.XQueryExpression; 27 import net.sf.saxon.tinytree.TinyNodeImpl; 28 import net.sf.saxon.trans.XPathException; 29 import net.sf.saxon.type.Type; 30 import org.apache.commons.collections.OrderedMap; 31 import org.apache.commons.collections.map.ListOrderedMap; 32 import org.pentaho.core.connection.IPentahoMetaData; 33 import org.pentaho.core.connection.IPentahoResultSet; 34 import org.pentaho.core.connection.memory.MemoryMetaData; 35 import org.pentaho.core.connection.memory.MemoryResultSet; 36 37 43 public class XQResultSet implements IPentahoResultSet { 44 protected XQueryExpression exp = null; 45 46 protected DynamicQueryContext dynamicContext = null; 47 48 protected XQMetaData metaData = null; 49 50 protected static final String DELIM = ", "; 52 protected static final String EMPTY_STR = ""; 54 Iterator iter = null; 55 56 protected String columnTypes[] = null; 57 58 64 public XQResultSet(XQueryExpression exp, DynamicQueryContext dynamicContext, String columnTypes[]) throws XPathException { 65 super(); 66 this.columnTypes = columnTypes; 67 this.exp = exp; 68 this.dynamicContext = dynamicContext; 69 init(); 70 } 71 72 protected void init() throws XPathException { 73 iter = this.exp.evaluate(this.dynamicContext).iterator(); 74 metaData = new XQMetaData(iter); 75 iter = this.exp.evaluate(this.dynamicContext).iterator(); 77 } 78 79 84 public IPentahoMetaData getMetaData() { 85 return metaData; 86 } 87 88 93 public Object [] next() { 94 OrderedMap resultList = new ListOrderedMap(); 96 for (int i = 0; i < metaData.getColumnCount(); i++) { 97 resultList.put(metaData.getColumnHeaders()[0][i], EMPTY_STR); 98 } 99 if (iter.hasNext()) { 101 Object o = iter.next(); 102 decodeNode(o, resultList); 103 } 104 Object [] retArray = new Object [resultList.size()]; 106 Iterator keyIter = resultList.keySet().iterator(); 107 int i = 0; 108 while (keyIter.hasNext()) { 109 retArray[i] = resultList.get(keyIter.next()); 110 i++; 111 } 112 boolean done = true; 114 for (int j = 0; j < retArray.length; j++) { 115 if (!("".equals(retArray[j]))) { done = false; 117 } 118 } 119 if (done) { 120 return null; 121 } 122 return retArray; 123 } 124 125 protected void decodeNode(Object obj, Map retValue) { 126 if (obj instanceof TinyNodeImpl) { 127 AxisIterator aIter = ((TinyNodeImpl) obj).iterateAxis(Axis.DESCENDANT); 128 Object descendent = aIter.next(); 129 boolean processedChildren = false; 130 int columnIndex = 0; 131 while (descendent != null) { 132 if (descendent instanceof TinyNodeImpl && ((TinyNodeImpl) descendent).getNodeKind() == Type.ELEMENT) { 133 TinyNodeImpl descNode = (TinyNodeImpl) descendent; 134 Object value = retValue.get(descNode.getDisplayName()); 135 if (value == null) { 136 value = EMPTY_STR; 137 } 138 if (!(EMPTY_STR.equals(value))) { 139 value = value.toString() + DELIM; 140 } 141 value = value.toString() + descNode.getStringValue(); 142 if (value != null && !value.equals("") && columnTypes != null && columnIndex >= 0 && columnIndex < columnTypes.length) { String columnType = columnTypes[columnIndex].trim(); 144 if (columnType.equals("java.math.BigDecimal")) { value = new BigDecimal (value.toString()); 146 } else if (columnType.equals("java.sql.Timestamp")) { value = new Timestamp (Long.parseLong(value.toString())); 148 } else if (columnType.equals("java.sql.Date")) { value = new Date (Long.parseLong(value.toString())); 150 } else if (columnType.equals("java.lang.Integer")) { value = new Integer (Integer.parseInt(value.toString())); 152 } else if (columnType.equals("java.lang.Double")) { value = new Double (Double.parseDouble(value.toString())); 154 } else if (columnType.equals("java.lang.Long")) { value = new Long (Long.parseLong(value.toString())); 156 } 157 } 158 retValue.put(descNode.getDisplayName(), value); 159 processedChildren = true; 160 columnIndex++; 161 } 162 descendent = aIter.next(); 163 } 164 if (!processedChildren) { 165 Object key = ((TinyNodeImpl) obj).getDisplayName(); 166 Object value = ((TinyNodeImpl) obj).getStringValue(); 167 retValue.put(key, value); 168 } 169 } else { 170 retValue.put(XQMetaData.DEFAULT_COLUMN_NAME, obj.toString()); 171 } 172 } 173 174 179 public void close() { 180 } 182 183 188 public void closeConnection() { 189 } 191 192 197 public boolean isScrollable() { 198 return false; 200 } 201 202 207 public Object getValueAt(int row, int column) { 208 return null; 210 } 211 212 217 public int getRowCount() { 218 return metaData.getRowCount(); 219 } 220 221 226 public int getColumnCount() { 227 return metaData.getColumnCount(); 228 } 229 230 235 public void dispose() { 236 } 238 239 public IPentahoResultSet memoryCopy() { 240 try { 241 IPentahoMetaData metadata = getMetaData(); 242 Object columnHeaders[][] = metadata.getColumnHeaders(); 243 MemoryMetaData cachedMetaData = new MemoryMetaData(columnHeaders, null); 244 MemoryResultSet cachedResultSet = new MemoryResultSet(cachedMetaData); 245 Object [] rowObjects = next(); 246 while (rowObjects != null) { 247 cachedResultSet.addRow(rowObjects); 248 rowObjects = next(); 249 } 250 return cachedResultSet; 251 } finally { 252 close(); 253 } 254 } 255 256 public void beforeFirst() { 257 try { 258 init(); 259 } catch (Throwable t) { 260 t.printStackTrace(); 261 } 262 } 263 264 271 public Object [] getDataColumn(int column) { 272 beforeFirst(); Object [] result = new Object [getRowCount()]; 275 int rowIndex = 0; 276 Object [] rowData = next(); 277 while (rowData != null) { 278 result[rowIndex] = rowData[column]; 279 rowIndex++; 280 rowData = next(); 281 } 282 beforeFirst(); 283 return result; 284 } 285 286 public Object [] getDataRow(int row) { 287 beforeFirst(); int count = 0; 289 while (count < row) { 290 next(); 291 } 292 Object [] dataRow = next(); 293 beforeFirst(); 294 return dataRow; 295 } 296 } 297 | Popular Tags |