/*********************************************************************************************************************** * Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu) * * 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 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 eu.stratosphere.compiler.operators; import java.util.List; import eu.stratosphere.api.common.operators.util.FieldList; import eu.stratosphere.compiler.dag.TwoInputNode; import eu.stratosphere.compiler.dataproperties.GlobalProperties; import eu.stratosphere.compiler.dataproperties.LocalProperties; import eu.stratosphere.compiler.dataproperties.RequestedGlobalProperties; import eu.stratosphere.compiler.dataproperties.RequestedLocalProperties; import eu.stratosphere.compiler.plan.Channel; import eu.stratosphere.compiler.plan.DualInputPlanNode; /** * */ public abstract class OperatorDescriptorDual implements AbstractOperatorDescriptor { protected final FieldList keys1; protected final FieldList keys2; private List<GlobalPropertiesPair> globalProps; private List<LocalPropertiesPair> localProps; protected OperatorDescriptorDual() { this(null, null); } protected OperatorDescriptorDual(FieldList keys1, FieldList keys2) { this.keys1 = keys1; this.keys2 = keys2; } public List<GlobalPropertiesPair> getPossibleGlobalProperties() { if (this.globalProps == null) { this.globalProps = createPossibleGlobalProperties(); } return this.globalProps; } public List<LocalPropertiesPair> getPossibleLocalProperties() { if (this.localProps == null) { this.localProps = createPossibleLocalProperties(); } return this.localProps; } protected abstract List<GlobalPropertiesPair> createPossibleGlobalProperties(); protected abstract List<LocalPropertiesPair> createPossibleLocalProperties(); public abstract boolean areCoFulfilled(RequestedLocalProperties requested1, RequestedLocalProperties requested2, LocalProperties produced1, LocalProperties produced2); public abstract DualInputPlanNode instantiate(Channel in1, Channel in2, TwoInputNode node); public abstract GlobalProperties computeGlobalProperties(GlobalProperties in1, GlobalProperties in2); public abstract LocalProperties computeLocalProperties(LocalProperties in1, LocalProperties in2); // -------------------------------------------------------------------------------------------- public static final class GlobalPropertiesPair { private final RequestedGlobalProperties props1, props2; public GlobalPropertiesPair(RequestedGlobalProperties props1, RequestedGlobalProperties props2) { this.props1 = props1; this.props2 = props2; } public RequestedGlobalProperties getProperties1() { return this.props1; } public RequestedGlobalProperties getProperties2() { return this.props2; } @Override public int hashCode() { return (this.props1 == null ? 0 : this.props1.hashCode()) ^ (this.props2 == null ? 0 : this.props2.hashCode()); } @Override public boolean equals(Object obj) { if (obj.getClass() == GlobalPropertiesPair.class) { final GlobalPropertiesPair other = (GlobalPropertiesPair) obj; return (this.props1 == null ? other.props1 == null : this.props1.equals(other.props1)) && (this.props2 == null ? other.props2 == null : this.props2.equals(other.props2)); } return false; } @Override public String toString() { return "{" + this.props1 + " / " + this.props2 + "}"; } } public static final class LocalPropertiesPair { private final RequestedLocalProperties props1, props2; public LocalPropertiesPair(RequestedLocalProperties props1, RequestedLocalProperties props2) { this.props1 = props1; this.props2 = props2; } public RequestedLocalProperties getProperties1() { return this.props1; } public RequestedLocalProperties getProperties2() { return this.props2; } @Override public int hashCode() { return (this.props1 == null ? 0 : this.props1.hashCode()) ^ (this.props2 == null ? 0 : this.props2.hashCode()); } @Override public boolean equals(Object obj) { if (obj.getClass() == LocalPropertiesPair.class) { final LocalPropertiesPair other = (LocalPropertiesPair) obj; return (this.props1 == null ? other.props1 == null : this.props1.equals(other.props1)) && (this.props2 == null ? other.props2 == null : this.props2.equals(other.props2)); } return false; } @Override public String toString() { return "{" + this.props1 + " / " + this.props2 + "}"; } } }