blob: 0e03e6d3119d1abfec4e5485df13e4d2e9101225 [file] [log] [blame]
package edu.uci.ics.asterix.om.typecomputer.impl;
import java.util.ArrayList;
import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
import edu.uci.ics.asterix.om.types.ATypeTag;
import edu.uci.ics.asterix.om.types.AUnionType;
import edu.uci.ics.asterix.om.types.AUnorderedListType;
import edu.uci.ics.asterix.om.types.BuiltinType;
import edu.uci.ics.asterix.om.types.IAType;
import edu.uci.ics.asterix.om.util.NonTaggedFormatUtil;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
public class UnorderedListConstructorResultType implements IResultTypeComputer {
public static final UnorderedListConstructorResultType INSTANCE = new UnorderedListConstructorResultType();
@Override
public AUnorderedListType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
boolean openType = TypeComputerUtilities.isOpenType(f);
int n = f.getArguments().size();
if (n == 0 || openType) {
return new AUnorderedListType(BuiltinType.ANY, null);
} else {
ArrayList<IAType> types = new ArrayList<IAType>();
for (int k = 0; k < f.getArguments().size(); k++) {
IAType type = (IAType) env.getType(f.getArguments().get(k).getValue());
if (type.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) type))
type = ((AUnionType) type).getUnionList()
.get(NonTaggedFormatUtil.OPTIONAL_TYPE_INDEX_IN_UNION_LIST);
if (types.indexOf(type) < 0) {
types.add(type);
}
}
if (types.size() == 1) {
return new AUnorderedListType(types.get(0), null);
} else {
throw new AlgebricksException("You can not construct a heterogenous list.");
}
}
}
}