public String getTypeAsString() { return QueryImpl.getColumTypeName(type); }
private Query testExecute(PageContext pc, SQL sql, Query qr, ZQuery query, int maxrows) throws PageException { int recCount = qr.getRecordcount(); Vector vSelects = query.getSelect(); int selCount = vSelects.size(); Map selects = new HashTable(); boolean isSMS = false; // headers for (int i = 0; i < selCount; i++) { ZSelectItem select = (ZSelectItem) vSelects.get(i); if (select.isWildcard() || (isSMS = select.getColumn().equals(SQLPrettyfier.PLACEHOLDER_ASTERIX))) { if (!isSMS && !select.getColumn().equals("*")) throw new DatabaseException( "can't execute this type of query at the moment", null, sql, null); String[] keys = qr.keysAsString(); for (int y = 0; y < keys.length; y++) { selects.put(keys[y], keys[y]); } isSMS = false; } else { // if(SQLPrettyfier.PLACEHOLDER_COUNT.equals(select.getAlias())) select.setAlias("count"); // if(SQLPrettyfier.PLACEHOLDER_COUNT.equals(select.getColumn())) select.setExpression(new // ZConstant("count",ZConstant.COLUMNNAME)); String alias = select.getAlias(); String column = select.getColumn(); if (alias == null) alias = column; alias = alias.toLowerCase(); selects.put(alias, select); } } String[] headers = (String[]) selects.keySet().toArray(new String[selects.size()]); // aHeaders.toArray(new String[aHeaders.size()]); QueryImpl rtn = new QueryImpl(headers, 0, "query"); rtn.setSql(sql); // loop records Vector orders = query.getOrderBy(); ZExp where = query.getWhere(); // print.out(headers); // int newRecCount=0; boolean hasMaxrow = maxrows > -1 && (orders == null || orders.size() == 0); for (int row = 1; row <= recCount; row++) { sql.setPosition(0); if (hasMaxrow && maxrows <= rtn.getRecordcount()) break; boolean useRow = where == null || Caster.toBooleanValue(executeExp(pc, sql, qr, where, row)); if (useRow) { rtn.addRow(1); for (int cell = 0; cell < headers.length; cell++) { Object value = selects.get(headers[cell]); rtn.setAt( headers[cell], rtn.getRecordcount(), getValue(pc, sql, qr, row, headers[cell], value) // executeExp(qr, selects[cell].getExpression(),row) ); } } } // Group By if (query.getGroupBy() != null) throw new DatabaseException("group by are not supported at the moment", null, sql, null); // Order By if (orders != null && orders.size() > 0) { int len = orders.size(); for (int i = len - 1; i >= 0; i--) { ZOrderBy order = (ZOrderBy) orders.get(i); ZConstant name = (ZConstant) order.getExpression(); rtn.sort( name.getValue().toLowerCase(), order.getAscOrder() ? Query.ORDER_ASC : Query.ORDER_DESC); } if (maxrows > -1) { rtn.cutRowsTo(maxrows); } } // Distinct if (query.isDistinct()) { String[] keys = rtn.getColumns(); QueryColumn[] columns = new QueryColumn[keys.length]; for (int i = 0; i < columns.length; i++) { columns[i] = rtn.getColumn(keys[i]); } int i; outer: for (int row = rtn.getRecordcount(); row > 1; row--) { for (i = 0; i < columns.length; i++) { if (!Operator.equals(columns[i].get(row), columns[i].get(row - 1), true)) continue outer; } rtn.removeRow(row); } } // UNION // TODO support it ZExpression set = query.getSet(); if (set != null) { ZExp op = set.getOperand(0); if (op instanceof ZQuery) throw new DatabaseException("union is not supported at the moment", null, sql, null); // getInvokedTables((ZQuery)op, tablesNames); } return rtn; }