/* * 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.flink.api.common.operators.base; import org.apache.flink.annotation.Internal; import org.apache.flink.annotation.Public; import org.apache.flink.api.common.functions.FlatJoinFunction; import org.apache.flink.api.common.functions.Partitioner; import org.apache.flink.api.common.operators.BinaryOperatorInformation; import org.apache.flink.api.common.operators.DualInputOperator; import org.apache.flink.api.common.operators.util.UserCodeClassWrapper; import org.apache.flink.api.common.operators.util.UserCodeObjectWrapper; import org.apache.flink.api.common.operators.util.UserCodeWrapper; @Internal public abstract class JoinOperatorBase<IN1, IN2, OUT, FT extends FlatJoinFunction<IN1, IN2, OUT>> extends DualInputOperator<IN1, IN2, OUT, FT> { /** * An enumeration of hints, optionally usable to tell the system how exactly execute the join. */ @Public public static enum JoinHint { /** * Leave the choice how to do the join to the optimizer. If in doubt, the * optimizer will choose a repartitioning join. */ OPTIMIZER_CHOOSES, /** * Hint that the first join input is much smaller than the second. This results in * broadcasting and hashing the first input, unless the optimizer infers that * prior existing partitioning is available that is even cheaper to exploit. */ BROADCAST_HASH_FIRST, /** * Hint that the second join input is much smaller than the first. This results in * broadcasting and hashing the second input, unless the optimizer infers that * prior existing partitioning is available that is even cheaper to exploit. */ BROADCAST_HASH_SECOND, /** * Hint that the first join input is a bit smaller than the second. This results in * repartitioning both inputs and hashing the first input, unless the optimizer infers that * prior existing partitioning and orders are available that are even cheaper to exploit. */ REPARTITION_HASH_FIRST, /** * Hint that the second join input is a bit smaller than the first. This results in * repartitioning both inputs and hashing the second input, unless the optimizer infers that * prior existing partitioning and orders are available that are even cheaper to exploit. */ REPARTITION_HASH_SECOND, /** * Hint that the join should repartitioning both inputs and use sorting and merging * as the join strategy. */ REPARTITION_SORT_MERGE } private JoinHint joinHint = JoinHint.OPTIMIZER_CHOOSES; private Partitioner<?> partitioner; public JoinOperatorBase(UserCodeWrapper<FT> udf, BinaryOperatorInformation<IN1, IN2, OUT> operatorInfo, int[] keyPositions1, int[] keyPositions2, String name) { super(udf, operatorInfo, keyPositions1, keyPositions2, name); } public JoinOperatorBase(FT udf, BinaryOperatorInformation<IN1, IN2, OUT> operatorInfo, int[] keyPositions1, int[] keyPositions2, String name) { super(new UserCodeObjectWrapper<>(udf), operatorInfo, keyPositions1, keyPositions2, name); } public JoinOperatorBase(Class<? extends FT> udf, BinaryOperatorInformation<IN1, IN2, OUT> operatorInfo, int[] keyPositions1, int[] keyPositions2, String name) { super(new UserCodeClassWrapper<>(udf), operatorInfo, keyPositions1, keyPositions2, name); } public void setJoinHint(JoinHint joinHint) { if (joinHint == null) { throw new IllegalArgumentException("Join Hint must not be null."); } this.joinHint = joinHint; } public JoinHint getJoinHint() { return joinHint; } public void setCustomPartitioner(Partitioner<?> partitioner) { this.partitioner = partitioner; } public Partitioner<?> getCustomPartitioner() { return partitioner; } }