/*
 * Copyright 2009-2010 by The Regents of the University of California
 * Licensed 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 from
 * 
 *     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.hyracks.algebricks.core.jobgen.impl;

import java.util.HashMap;
import java.util.Map;

import edu.uci.ics.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
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.base.ILogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionEvalSizeComputer;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionRuntimeProvider;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionTypeComputer;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.INullableTypeComputer;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IPartialAggregationTypeComputer;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext;
import edu.uci.ics.hyracks.algebricks.data.IBinaryBooleanInspectorFactory;
import edu.uci.ics.hyracks.algebricks.data.IBinaryComparatorFactoryProvider;
import edu.uci.ics.hyracks.algebricks.data.IBinaryHashFunctionFactoryProvider;
import edu.uci.ics.hyracks.algebricks.data.IBinaryHashFunctionFamilyProvider;
import edu.uci.ics.hyracks.algebricks.data.IBinaryIntegerInspectorFactory;
import edu.uci.ics.hyracks.algebricks.data.INormalizedKeyComputerFactoryProvider;
import edu.uci.ics.hyracks.algebricks.data.IPrinterFactoryProvider;
import edu.uci.ics.hyracks.algebricks.data.ISerializerDeserializerProvider;
import edu.uci.ics.hyracks.algebricks.data.ITypeTraitProvider;
import edu.uci.ics.hyracks.api.dataflow.value.INullWriterFactory;
import edu.uci.ics.hyracks.api.dataflow.value.IPredicateEvaluatorFactory;
import edu.uci.ics.hyracks.api.dataflow.value.IPredicateEvaluatorFactoryProvider;

public class JobGenContext {
	private final IOperatorSchema outerFlowSchema;
	private final Map<ILogicalOperator, IOperatorSchema> schemaMap = new HashMap<ILogicalOperator, IOperatorSchema>();
	private final ISerializerDeserializerProvider serializerDeserializerProvider;
	private final IBinaryHashFunctionFactoryProvider hashFunctionFactoryProvider;
	private final IBinaryHashFunctionFamilyProvider hashFunctionFamilyProvider;
	private final IBinaryComparatorFactoryProvider comparatorFactoryProvider;
	private final IPrinterFactoryProvider printerFactoryProvider;
	private final ITypeTraitProvider typeTraitProvider;
	private final IMetadataProvider<?, ?> metadataProvider;
	private final INullWriterFactory nullWriterFactory;
	private final INormalizedKeyComputerFactoryProvider normalizedKeyComputerFactoryProvider;
	private final Object appContext;
	private final IBinaryBooleanInspectorFactory booleanInspectorFactory;
	private final IBinaryIntegerInspectorFactory integerInspectorFactory;
	private final IExpressionRuntimeProvider expressionRuntimeProvider;
	private final IExpressionTypeComputer expressionTypeComputer;
	private final IExpressionEvalSizeComputer expressionEvalSizeComputer;
	private final IPartialAggregationTypeComputer partialAggregationTypeComputer;
	private final IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider;
	private final int frameSize;
	private AlgebricksPartitionConstraint clusterLocations;
	private int varCounter;
	private final ITypingContext typingContext;

	public JobGenContext(
			IOperatorSchema outerFlowSchema,
			IMetadataProvider<?, ?> metadataProvider,
			Object appContext,
			ISerializerDeserializerProvider serializerDeserializerProvider,
			IBinaryHashFunctionFactoryProvider hashFunctionFactoryProvider,
			IBinaryHashFunctionFamilyProvider hashFunctionFamilyProvider,
			IBinaryComparatorFactoryProvider comparatorFactoryProvider,
			ITypeTraitProvider typeTraitProvider,
			IBinaryBooleanInspectorFactory booleanInspectorFactory,
			IBinaryIntegerInspectorFactory integerInspectorFactory,
			IPrinterFactoryProvider printerFactoryProvider,
			INullWriterFactory nullWriterFactory,
			INormalizedKeyComputerFactoryProvider normalizedKeyComputerFactoryProvider,
			IExpressionRuntimeProvider expressionRuntimeProvider,
			IExpressionTypeComputer expressionTypeComputer,
			INullableTypeComputer nullableTypeComputer,
			ITypingContext typingContext,
			IExpressionEvalSizeComputer expressionEvalSizeComputer,
			IPartialAggregationTypeComputer partialAggregationTypeComputer,
			IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider, int frameSize, AlgebricksPartitionConstraint clusterLocations) {
		this.outerFlowSchema = outerFlowSchema;
		this.metadataProvider = metadataProvider;
		this.appContext = appContext;
		this.serializerDeserializerProvider = serializerDeserializerProvider;
		this.hashFunctionFactoryProvider = hashFunctionFactoryProvider;
		this.hashFunctionFamilyProvider = hashFunctionFamilyProvider;
		this.comparatorFactoryProvider = comparatorFactoryProvider;
		this.typeTraitProvider = typeTraitProvider;
		this.booleanInspectorFactory = booleanInspectorFactory;
		this.integerInspectorFactory = integerInspectorFactory;
		this.printerFactoryProvider = printerFactoryProvider;
		this.clusterLocations = clusterLocations;
		this.normalizedKeyComputerFactoryProvider = normalizedKeyComputerFactoryProvider;
		this.nullWriterFactory = nullWriterFactory;
		this.expressionRuntimeProvider = expressionRuntimeProvider;
		this.expressionTypeComputer = expressionTypeComputer;
		this.typingContext = typingContext;
		this.expressionEvalSizeComputer = expressionEvalSizeComputer;
		this.partialAggregationTypeComputer = partialAggregationTypeComputer;
		this.predEvaluatorFactoryProvider = predEvaluatorFactoryProvider;
		this.frameSize = frameSize;
		this.varCounter = 0;
	}

	public IOperatorSchema getOuterFlowSchema() {
		return outerFlowSchema;
	}

	public AlgebricksPartitionConstraint getClusterLocations() {
		return clusterLocations;
	}

	public IMetadataProvider<?, ?> getMetadataProvider() {
		return metadataProvider;
	}

	public Object getAppContext() {
		return appContext;
	}

	public ISerializerDeserializerProvider getSerializerDeserializerProvider() {
		return serializerDeserializerProvider;
	}

	public IBinaryHashFunctionFactoryProvider getBinaryHashFunctionFactoryProvider() {
		return hashFunctionFactoryProvider;
	}

	public IBinaryHashFunctionFamilyProvider getBinaryHashFunctionFamilyProvider() {
		return hashFunctionFamilyProvider;
	}

	public IBinaryComparatorFactoryProvider getBinaryComparatorFactoryProvider() {
		return comparatorFactoryProvider;
	}

	public ITypeTraitProvider getTypeTraitProvider() {
		return typeTraitProvider;
	}

	public IBinaryBooleanInspectorFactory getBinaryBooleanInspectorFactory() {
		return booleanInspectorFactory;
	}

	public IBinaryIntegerInspectorFactory getBinaryIntegerInspectorFactory() {
		return integerInspectorFactory;
	}

	public IPrinterFactoryProvider getPrinterFactoryProvider() {
		return printerFactoryProvider;
	}
	
	public IPredicateEvaluatorFactoryProvider getPredicateEvaluatorFactoryProvider(){
		return predEvaluatorFactoryProvider;
	}

	public IExpressionRuntimeProvider getExpressionRuntimeProvider() {
		return expressionRuntimeProvider;
	}

	public IOperatorSchema getSchema(ILogicalOperator op) {
		return schemaMap.get(op);
	}

	public void putSchema(ILogicalOperator op, IOperatorSchema schema) {
		schemaMap.put(op, schema);
	}

	public LogicalVariable createNewVar() {
		varCounter++;
		LogicalVariable var = new LogicalVariable(-varCounter);
		return var;
	}

	public Object getType(ILogicalExpression expr, IVariableTypeEnvironment env)
			throws AlgebricksException {
		return expressionTypeComputer.getType(expr,
				typingContext.getMetadataProvider(), env);
	}

	public INullWriterFactory getNullWriterFactory() {
		return nullWriterFactory;
	}

	public INormalizedKeyComputerFactoryProvider getNormalizedKeyComputerFactoryProvider() {
		return normalizedKeyComputerFactoryProvider;
	}

	public IExpressionEvalSizeComputer getExpressionEvalSizeComputer() {
		return expressionEvalSizeComputer;
	}

	public int getFrameSize() {
		return frameSize;
	}

	public IPartialAggregationTypeComputer getPartialAggregationTypeComputer() {
		return partialAggregationTypeComputer;
	}

	public IVariableTypeEnvironment getTypeEnvironment(ILogicalOperator op) {
		return typingContext.getOutputTypeEnvironment(op);
	}

}
