/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.calc.impl;
import mondrian.calc.*;
import mondrian.olap.Evaluator;
import mondrian.olap.Exp;
import mondrian.olap.type.SetType;
/**
* Adapter which computes a set expression and converts it to any list or
* iterable type.
*
* @author jhyde
* @since Nov 7, 2008
*/
public abstract class GenericIterCalc
extends AbstractCalc
implements ListCalc, IterCalc
{
/**
* Creates a GenericIterCalc without specifying child calculated
* expressions.
*
* <p>Subclass should override {@link #getCalcs()}.
*
* @param exp Source expression
*/
protected GenericIterCalc(Exp exp) {
super(exp, null);
}
/**
* Creates an GenericIterCalc.
*
* @param exp Source expression
* @param calcs Child compiled expressions
*/
protected GenericIterCalc(Exp exp, Calc[] calcs) {
super(exp, calcs);
}
public SetType getType() {
return (SetType) type;
}
public TupleList evaluateList(Evaluator evaluator) {
Object o = evaluate(evaluator);
if (o instanceof TupleList) {
return (TupleList) o;
} else {
// Iterable
final TupleIterable iterable = (TupleIterable) o;
TupleList tupleList =
TupleCollections.createList(iterable.getArity());
TupleCursor cursor = iterable.tupleCursor();
while (cursor.forward()) {
tupleList.addCurrent(cursor);
}
return tupleList;
}
}
public TupleIterable evaluateIterable(Evaluator evaluator) {
Object o = evaluate(evaluator);
return (TupleIterable) o;
}
}
// End GenericIterCalc.java