/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.querydsl.core.group; import java.util.ArrayList; import java.util.List; import com.querydsl.core.ResultTransformer; import com.querydsl.core.Tuple; import com.querydsl.core.types.*; /** * Base class for GroupBy result transformers * * @author tiwe * * @param <K> * @param <T> */ abstract class AbstractGroupByTransformer<K, T> implements ResultTransformer<T> { private static final class FactoryExpressionAdapter<T> extends ExpressionBase<T> implements FactoryExpression<T> { private final FactoryExpression<T> expr; private final List<Expression<?>> args; private FactoryExpressionAdapter(FactoryExpression<T> expr, List<Expression<?>> args) { super(expr.getType()); this.expr = expr; this.args = args; } @Override public <R, C> R accept(Visitor<R, C> v, C context) { return expr.accept(v, context); } @Override public List<Expression<?>> getArgs() { return args; } @Override public T newInstance(Object... args) { return expr.newInstance(args); } } protected final List<GroupExpression<?, ?>> groupExpressions = new ArrayList<GroupExpression<?, ?>>(); protected final List<QPair<?,?>> maps = new ArrayList<QPair<?,?>>(); protected final Expression<?>[] expressions; @SuppressWarnings("unchecked") AbstractGroupByTransformer(Expression<K> key, Expression<?>... expressions) { List<Expression<?>> projection = new ArrayList<Expression<?>>(expressions.length); groupExpressions.add(new GOne<K>(key)); projection.add(key); for (Expression<?> expr : expressions) { if (expr instanceof GroupExpression<?,?>) { GroupExpression<?,?> groupExpr = (GroupExpression<?,?>) expr; groupExpressions.add(groupExpr); Expression<?> colExpression = groupExpr.getExpression(); if (colExpression instanceof Operation && ((Operation) colExpression).getOperator() == Ops.ALIAS) { projection.add(((Operation) colExpression).getArg(0)); } else { projection.add(colExpression); } if (groupExpr instanceof GMap) { maps.add((QPair<?, ?>) colExpression); } } else { groupExpressions.add(new GOne(expr)); projection.add(expr); } } this.expressions = projection.toArray(new Expression[projection.size()]); } protected static FactoryExpression<Tuple> withoutGroupExpressions(final FactoryExpression<Tuple> expr) { List<Expression<?>> args = new ArrayList<Expression<?>>(expr.getArgs().size()); for (Expression<?> arg : expr.getArgs()) { if (arg instanceof GroupExpression) { args.add(((GroupExpression) arg).getExpression()); } else { args.add(arg); } } return new FactoryExpressionAdapter<Tuple>(expr, args); } }