/*
 * 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.common.constraints;

import edu.uci.ics.hyracks.api.constraints.PartitionConstraintHelper;
import edu.uci.ics.hyracks.api.dataflow.IOperatorDescriptor;
import edu.uci.ics.hyracks.api.job.JobSpecification;

public class AlgebricksPartitionConstraintHelper {

    public static void setPartitionConstraintInJobSpec(JobSpecification jobSpec, IOperatorDescriptor opDesc,
            AlgebricksPartitionConstraint apc) {
        switch (apc.getPartitionConstraintType()) {
            case ABSOLUTE: {
                AlgebricksAbsolutePartitionConstraint absPc = (AlgebricksAbsolutePartitionConstraint) apc;
                PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, opDesc, absPc.getLocations());
                break;
            }
            case COUNT: {
                AlgebricksCountPartitionConstraint cntPc = (AlgebricksCountPartitionConstraint) apc;
                PartitionConstraintHelper.addPartitionCountConstraint(jobSpec, opDesc, cntPc.getCount());
                break;
            }
            default: {
                throw new IllegalStateException();
            }
        }
    }

    public static int getPartitionCount(AlgebricksPartitionConstraint partitionConstraint) {
        switch (partitionConstraint.getPartitionConstraintType()) {
            case COUNT: {
                AlgebricksCountPartitionConstraint pcc = (AlgebricksCountPartitionConstraint) partitionConstraint;
                return pcc.getCount();
            }
            case ABSOLUTE: {
                AlgebricksAbsolutePartitionConstraint epc = (AlgebricksAbsolutePartitionConstraint) partitionConstraint;
                return epc.getLocations().length;
            }
            default: {
                throw new IllegalStateException();
            }
        }
    }

}
