/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.asterix.om.types;

import org.apache.asterix.om.utils.RecordUtil;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;

public class TypeTagUtil {

    public static IAType getBuiltinTypeByTag(ATypeTag typeTag) throws HyracksDataException {
        switch (typeTag) {
            case TINYINT:
                return BuiltinType.AINT8;
            case SMALLINT:
                return BuiltinType.AINT16;
            case INTEGER:
                return BuiltinType.AINT32;
            case BIGINT:
                return BuiltinType.AINT64;
            case BINARY:
                return BuiltinType.ABINARY;
            case BITARRAY:
                return BuiltinType.ABITARRAY;
            case FLOAT:
                return BuiltinType.AFLOAT;
            case DOUBLE:
                return BuiltinType.ADOUBLE;
            case STRING:
                return BuiltinType.ASTRING;
            case MISSING:
                return BuiltinType.AMISSING;
            case NULL:
                return BuiltinType.ANULL;
            case BOOLEAN:
                return BuiltinType.ABOOLEAN;
            case DATETIME:
                return BuiltinType.ADATETIME;
            case DATE:
                return BuiltinType.ADATE;
            case TIME:
                return BuiltinType.ATIME;
            case DURATION:
                return BuiltinType.ADURATION;
            case POINT:
                return BuiltinType.APOINT;
            case POINT3D:
                return BuiltinType.APOINT3D;
            case TYPE:
                return BuiltinType.ASTERIX_TYPE;
            case ANY:
                return BuiltinType.ANY;
            case LINE:
                return BuiltinType.ALINE;
            case POLYGON:
                return BuiltinType.APOLYGON;
            case CIRCLE:
                return BuiltinType.ACIRCLE;
            case RECTANGLE:
                return BuiltinType.ARECTANGLE;
            case INTERVAL:
                return BuiltinType.AINTERVAL;
            case YEARMONTHDURATION:
                return BuiltinType.AYEARMONTHDURATION;
            case DAYTIMEDURATION:
                return BuiltinType.ADAYTIMEDURATION;
            case UUID:
                return BuiltinType.AUUID;
            case OBJECT:
                return RecordUtil.FULLY_OPEN_RECORD_TYPE;
            case MULTISET:
                return AUnorderedListType.FULLY_OPEN_UNORDEREDLIST_TYPE;
            case ARRAY:
                return AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
            case GEOMETRY:
                return BuiltinType.AGEOMETRY;
            default:
                // TODO(tillw) should be an internal error
                throw new HyracksDataException("Typetag " + typeTag + " is not a built-in type");
        }
    }

    public static boolean isType(ITupleReference tuple, int fieldIdx, byte tag) {
        return tuple.getFieldData(fieldIdx)[tuple.getFieldStart(fieldIdx)] == tag;
    }
}
