private static List<Expression<?>> expand(List<Expression<?>> exprs) { List<Expression<?>> rv = new ArrayList<Expression<?>>(exprs.size()); for (Expression<?> expr : exprs) { if (expr instanceof ProjectionRole) { expr = ((ProjectionRole) expr).getProjection(); } if (expr instanceof FactoryExpression<?>) { rv.addAll(expand(((FactoryExpression<?>) expr).getArgs())); } else { rv.add(expr); } } return rv; }
public static <T> FactoryExpression<T> wrap(FactoryExpression<T> expr) { for (Expression<?> arg : expr.getArgs()) { if (arg instanceof ProjectionRole) { arg = ((ProjectionRole) arg).getProjection(); } if (arg instanceof FactoryExpression<?>) { return new FactoryExpressionAdapter<T>(expr); } } return expr; }
private static int countArguments(FactoryExpression<?> expr) { int counter = 0; for (Expression<?> arg : expr.getArgs()) { if (arg instanceof ProjectionRole) { arg = ((ProjectionRole) arg).getProjection(); } if (arg instanceof FactoryExpression<?>) { counter += countArguments((FactoryExpression<?>) arg); } else { counter++; } } return counter; }
private static Object[] compress(List<Expression<?>> exprs, Object[] args) { Object[] rv = new Object[exprs.size()]; int offset = 0; for (int i = 0; i < exprs.size(); i++) { Expression<?> expr = exprs.get(i); if (expr instanceof ProjectionRole) { expr = ((ProjectionRole) expr).getProjection(); } if (expr instanceof FactoryExpression<?>) { FactoryExpression<?> fe = (FactoryExpression<?>) expr; int fullArgsLength = countArguments(fe); Object[] compressed = compress(fe.getArgs(), ArrayUtils.subarray(args, offset, offset + fullArgsLength)); rv[i] = fe.newInstance(compressed); offset += fullArgsLength; } else { rv[i] = args[offset]; offset++; } } return rv; }
@SuppressWarnings({"rawtypes", "unchecked"}) public <RT> Expression<RT> convert(Expression<RT> expr, Role role) { if (expandAnyPaths) { if (expr instanceof Path) { expr = (Expression) normalizePath((Path) expr); } else if (expr != null) { expr = (Expression) expr.accept(replaceVisitor, null); } } if (expr instanceof ProjectionRole<?>) { return convert(((ProjectionRole) expr).getProjection(), role); } else if (expr instanceof FactoryExpression<?> && !(expr instanceof FactoryExpressionAdapter<?>)) { return FactoryExpressionUtils.wrap((FactoryExpression<RT>) expr); } else { return expr; } }
private static List<Expression<?>> expand(List<Expression<?>> exprs) { List<Expression<?>> rv = new ArrayList<Expression<?>>(exprs.size()); for (Expression<?> expr : exprs) { if (expr instanceof ProjectionRole) { expr = ((ProjectionRole) expr).getProjection(); } if (expr instanceof FactoryExpression<?>) { rv.addAll(expand(((FactoryExpression<?>) expr).getArgs())); } else { rv.add(expr); } } return rv; }
public static <T> FactoryExpression<T> wrap(FactoryExpression<T> expr) { for (Expression<?> arg : expr.getArgs()) { if (arg instanceof ProjectionRole) { arg = ((ProjectionRole) arg).getProjection(); } if (arg instanceof FactoryExpression<?>) { return new FactoryExpressionAdapter<T>(expr); } } return expr; }
private static int countArguments(FactoryExpression<?> expr) { int counter = 0; for (Expression<?> arg : expr.getArgs()) { if (arg instanceof ProjectionRole) { arg = ((ProjectionRole) arg).getProjection(); } if (arg instanceof FactoryExpression<?>) { counter += countArguments((FactoryExpression<?>) arg); } else { counter++; } } return counter; }
private static Object[] compress(List<Expression<?>> exprs, Object[] args) { Object[] rv = new Object[exprs.size()]; int offset = 0; for (int i = 0; i < exprs.size(); i++) { Expression<?> expr = exprs.get(i); if (expr instanceof ProjectionRole) { expr = ((ProjectionRole) expr).getProjection(); } if (expr instanceof FactoryExpression<?>) { FactoryExpression<?> fe = (FactoryExpression<?>) expr; int fullArgsLength = countArguments(fe); Object[] compressed = compress(fe.getArgs(), ArrayUtils.subarray(args, offset, offset + fullArgsLength)); rv[i] = fe.newInstance(compressed); offset += fullArgsLength; } else { rv[i] = args[offset]; offset++; } } return rv; }
@SuppressWarnings({"rawtypes", "unchecked"}) public <RT> Expression<RT> convert(Expression<RT> expr, Role role) { if (expandAnyPaths) { if (expr instanceof Path) { expr = (Expression) normalizePath((Path) expr); } else if (expr != null) { expr = (Expression) expr.accept(replaceVisitor, null); } } if (expr instanceof ProjectionRole<?>) { return convert(((ProjectionRole) expr).getProjection(), role); } else if (expr instanceof FactoryExpression<?> && !(expr instanceof FactoryExpressionAdapter<?>)) { return FactoryExpressionUtils.wrap((FactoryExpression<RT>) expr); } else { return expr; } }