blob: 95590a8787e0a8feb081d4072cd747dbf9990f81 [file] [log] [blame]
/*
* 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.wayang.core.optimizer.channels;
import org.apache.wayang.core.api.Configuration;
import org.apache.wayang.core.optimizer.OptimizationContext;
import org.apache.wayang.core.optimizer.ProbabilisticDoubleInterval;
import org.apache.wayang.core.optimizer.cardinality.CardinalityEstimate;
import org.apache.wayang.core.plan.executionplan.Channel;
import org.apache.wayang.core.plan.wayangplan.Operator;
import org.apache.wayang.core.platform.ChannelDescriptor;
import java.util.Collection;
import java.util.Collections;
/**
* Can convert a given {@link Channel} to another {@link Channel}.
*/
public abstract class ChannelConversion {
private final ChannelDescriptor sourceChannelDescriptor;
private final ChannelDescriptor targetChannelDescriptor;
public ChannelConversion(ChannelDescriptor sourceChannelDescriptor, ChannelDescriptor targetChannelDescriptor) {
this.sourceChannelDescriptor = sourceChannelDescriptor;
this.targetChannelDescriptor = targetChannelDescriptor;
}
/**
* Converts the given {@code sourceChannel} into a new {@link Channel} according to {@link #targetChannelDescriptor}.
*
* @param sourceChannel the {@link Channel} to be converted
* @param configuration can provide additional information for setting up {@link Channel}s etc.
* @return the newly created {@link Channel}
*/
public Channel convert(final Channel sourceChannel, Configuration configuration) {
return this.convert(sourceChannel, configuration, Collections.emptyList(), null);
}
/**
* Converts the given {@code sourceChannel} into a new {@link Channel} according to {@link #targetChannelDescriptor}.
*
* @param sourceChannel the {@link Channel} to be converted
* @param configuration can provide additional information for setting up {@link Channel}s etc.
* @param optimizationContexts to which estimates of the newly added {@link Operator} should be added
* @param cardinality optional {@link CardinalityEstimate} of the {@link Channel}
* @return the newly created {@link Channel}
*/
public abstract Channel convert(final Channel sourceChannel,
final Configuration configuration,
final Collection<OptimizationContext> optimizationContexts,
final CardinalityEstimate cardinality);
/**
* Update an already existing {@link ChannelConversion}.
*
* @param sourceChannel the {@link Channel} to be converted
* @param targetChannel the converted {@link Channel}
* @param optimizationContexts to which estimates of the newly added {@link Operator} should be updated
* @param cardinality optional {@link CardinalityEstimate} of the {@link Channel}s
*/
public abstract void update(final Channel sourceChannel,
final Channel targetChannel,
final Collection<OptimizationContext> optimizationContexts,
final CardinalityEstimate cardinality);
public ChannelDescriptor getSourceChannelDescriptor() {
return this.sourceChannelDescriptor;
}
public ChannelDescriptor getTargetChannelDescriptor() {
return this.targetChannelDescriptor;
}
/**
* Estimate the required cost to carry out the conversion for a given {@code cardinality}.
*
* @param cardinality the {@link CardinalityEstimate} of data to be converted
* @param numExecutions expected number of executions of this instance
* @param optimizationContext provides a {@link Configuration} and keeps around generated optimization information
* @return the cost estimate
*/
public abstract ProbabilisticDoubleInterval estimateConversionCost(CardinalityEstimate cardinality,
int numExecutions,
OptimizationContext optimizationContext);
/**
* Determine whether this instance is suitable to handle the given conversion.
*
* @param cardinality the {@link CardinalityEstimate} of data to be converted
* @param numExecutions expected number of executions of this instance
* @param optimizationContext provides a {@link Configuration} and keeps around generated optimization information
* @return whether this instance should be filtered
*/
public abstract boolean isFiltered(CardinalityEstimate cardinality,
int numExecutions,
OptimizationContext optimizationContext);
@Override
public String toString() {
return String.format("%s[%s->%s]",
this.getClass().getSimpleName(),
this.getSourceChannelDescriptor().getChannelClass().getSimpleName(),
this.getTargetChannelDescriptor().getChannelClass().getSimpleName()
);
}
}