/**
 * 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 edu.uci.ics.hivesterix.serde.lazy.objectinspector.primitive;

import java.util.HashMap;

import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;

/**
 * PrimitiveObjectInspectorFactory is the primary way to create new
 * PrimitiveObjectInspector instances.
 * 
 * The reason of having caches here is that ObjectInspector is because
 * ObjectInspectors do not have an internal state - so ObjectInspectors with the
 * same construction parameters should result in exactly the same
 * ObjectInspector.
 */
public final class PrimitiveObjectInspectorFactory {

	public static final LazyBooleanObjectInspector LazyBooleanObjectInspector = new LazyBooleanObjectInspector();
	public static final LazyByteObjectInspector LazyByteObjectInspector = new LazyByteObjectInspector();
	public static final LazyShortObjectInspector LazyShortObjectInspector = new LazyShortObjectInspector();
	public static final LazyIntObjectInspector LazyIntObjectInspector = new LazyIntObjectInspector();
	public static final LazyLongObjectInspector LazyLongObjectInspector = new LazyLongObjectInspector();
	public static final LazyFloatObjectInspector LazyFloatObjectInspector = new LazyFloatObjectInspector();
	public static final LazyDoubleObjectInspector LazyDoubleObjectInspector = new LazyDoubleObjectInspector();
	public static final LazyStringObjectInspector LazyStringObjectInspector = new LazyStringObjectInspector(
			false, (byte) '\\');
	public static final LazyVoidObjectInspector LazyVoidObjectInspector = new LazyVoidObjectInspector();

	private static HashMap<PrimitiveCategory, AbstractPrimitiveLazyObjectInspector<?>> cachedPrimitiveLazyInspectorCache = new HashMap<PrimitiveCategory, AbstractPrimitiveLazyObjectInspector<?>>();

	static {
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.BOOLEAN,
				LazyBooleanObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.BYTE,
				LazyByteObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.SHORT,
				LazyShortObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.INT,
				LazyIntObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.LONG,
				LazyLongObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.FLOAT,
				LazyFloatObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.DOUBLE,
				LazyDoubleObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.STRING,
				LazyStringObjectInspector);
		cachedPrimitiveLazyInspectorCache.put(PrimitiveCategory.VOID,
				LazyVoidObjectInspector);
	}

	/**
	 * Returns the PrimitiveWritableObjectInspector for the PrimitiveCategory.
	 * 
	 * @param primitiveCategory
	 */
	public static AbstractPrimitiveLazyObjectInspector<?> getPrimitiveLazyObjectInspector(
			PrimitiveCategory primitiveCategory) {
		AbstractPrimitiveLazyObjectInspector<?> result = cachedPrimitiveLazyInspectorCache
				.get(primitiveCategory);
		if (result == null) {
			throw new RuntimeException(
					"Internal error: Cannot find ObjectInspector " + " for "
							+ primitiveCategory);
		}
		return result;
	}

	private PrimitiveObjectInspectorFactory() {
		// prevent instantiation
	}
}
