예제 #1
0
 public String getTypeAsString() {
   return QueryImpl.getColumTypeName(type);
 }
예제 #2
0
파일: Executer.java 프로젝트: ringgi/railo
  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;
  }