@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; }