Exemple #1
0
  @SuppressWarnings({"unchecked", "rawtypes"})
  private Select create() {
    Select subselect = null;
    groupedSelectFields = null;

    boolean aggregatedRoot = !aggregateBy.isEmpty();

    if (aggregatedRoot) {
      groupedSelectFields = getAggregatedFieldsFromRoot();

      Collection<Query> from = new LinkedHashSet<Query>();
      from.addAll(action.getQueries(groupedSelectFields));
      from.addAll(action.getFilterQueries());

      Collection<ILink> links = getLinks(from, true);
      SqlToken filter = action.getFilter();

      subselect = new Select();
      subselect.setFields(groupedSelectFields);
      subselect.setRootQuery(action.getRootQuery());
      subselect.setLinks(links);
      subselect.setWhere(filter);
      subselect.setGroupBy((Collection) aggregateBy);

      // if(isCounter && !isGrouped())
      // {
      // return new CountingSelect(subselect);
      // }
    }

    selectFields = getSelectFields();
    Collection<Query> usedQueries = new LinkedHashSet<Query>();
    usedQueries.addAll(action.getQueries(selectFields));
    usedQueries.addAll(action.getQueries(getGroupFields()));
    usedQueries.addAll(action.getQueries(getSortFields()));
    usedQueries.addAll(action.getGroupFilterQueries());

    if (aggregateBy.isEmpty()) usedQueries.addAll(action.getFilterQueries());
    else usedQueries.remove(action.getRootQuery());

    usedQueries = filterUsedQueries(usedQueries);

    Collection<ILink> links = getLinks(usedQueries, false);
    SqlToken filter =
        aggregatedRoot ? (!isGrouped() ? action.getGroupFilter() : null) : action.getFilter();
    SqlToken groupFilter = isGrouped() ? action.getGroupFilter() : null;

    Select result = new Select();
    result.setFields(selectFields);
    result.setRootQuery(action.getRootQuery());
    result.setLinks(links);
    result.setSubselect(subselect);
    result.setWhere(filter);
    result.setGroupBy(getGroupFields());
    result.setHaving(groupFilter);

    if (isCounter) return new CountingSelect(result);

    result.setOrderBy(getSortFields());
    return isFramed
        ? new FramedSelect(result, getStart(), getLimit())
        : isAggregated ? new AggregatingSelect(result) : result;
  }
  @Override
  public List<?> translateCommand(Command command, ExecutionContext context) {
    if (command instanceof Insert) {
      try {
        handleInsertSequences((Insert) command);
      } catch (TranslatorException e) {
        throw new RuntimeException(e);
      }
    }

    if (!(command instanceof QueryExpression)) {
      return null;
    }
    QueryExpression queryCommand = (QueryExpression) command;
    if (queryCommand.getLimit() == null) {
      return null;
    }
    Limit limit = queryCommand.getLimit();
    queryCommand.setLimit(null);

    if (command instanceof Select) {
      Select select = (Select) command;

      TableReference tr = select.getFrom().get(0);
      if (tr instanceof NamedTable && isDual((NamedTable) tr)) {
        if (limit.getRowOffset() > 0 || limit.getRowLimit() == 0) {
          // no data
          select.setWhere(
              new Comparison(
                  new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER),
                  new Literal(0, TypeFacility.RUNTIME_TYPES.INTEGER),
                  Operator.EQ));
          return null;
        }
        return null; // dual does not allow a limit
      }
    }

    List<Object> parts = new ArrayList<Object>();
    parts.add("SELECT "); // $NON-NLS-1$
    /*
     * if all of the columns are aliased, assume that names matter - it actually only seems to matter for
     * the first query of a set op when there is a order by.  Rather than adding logic to traverse up,
     * we just use the projected names
     */
    boolean allAliased = true;
    for (DerivedColumn selectSymbol : queryCommand.getProjectedQuery().getDerivedColumns()) {
      if (selectSymbol.getAlias() == null) {
        allAliased = false;
        break;
      }
    }
    if (allAliased) {
      String[] columnNames = queryCommand.getColumnNames();
      for (int i = 0; i < columnNames.length; i++) {
        if (i > 0) {
          parts.add(", "); // $NON-NLS-1$
        }
        parts.add(columnNames[i]);
      }
    } else {
      parts.add("*"); // $NON-NLS-1$
    }
    if (limit.getRowOffset() > 0) {
      parts.add(" FROM (SELECT VIEW_FOR_LIMIT.*, ROWNUM ROWNUM_ FROM ("); // $NON-NLS-1$
    } else {
      parts.add(" FROM ("); // $NON-NLS-1$
    }
    parts.add(queryCommand);
    if (limit.getRowOffset() > 0) {
      parts.add(") VIEW_FOR_LIMIT WHERE ROWNUM <= "); // $NON-NLS-1$
      parts.add(limit.getRowLimit() + limit.getRowOffset());
      parts.add(") WHERE ROWNUM_ > "); // $NON-NLS-1$
      parts.add(limit.getRowOffset());
    } else {
      parts.add(") WHERE ROWNUM <= "); // $NON-NLS-1$
      parts.add(limit.getRowLimit());
    }
    return parts;
  }