blob: 34c7b6aada09e995599e88b1146a917fa40b0d17 [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.function;
import java.util.function.Function;
import org.apache.wayang.core.optimizer.costs.LoadEstimator;
import org.apache.wayang.core.optimizer.costs.LoadProfileEstimator;
import org.apache.wayang.core.optimizer.costs.NestableLoadProfileEstimator;
import org.apache.wayang.core.types.BasicDataUnitType;
/**
* This descriptor pertains to functions that consume a single data unit and output a single data unit.
*
* @param <Input> input type of the transformation function
* @param <Output> output type of the transformation function
*/
public class TransformationDescriptor<Input, Output> extends FunctionDescriptor {
protected final BasicDataUnitType<Input> inputType;
protected final BasicDataUnitType<Output> outputType;
private final FunctionDescriptor.SerializableFunction<Input, Output> javaImplementation;
public TransformationDescriptor(FunctionDescriptor.SerializableFunction<Input, Output> javaImplementation,
Class<Input> inputTypeClass,
Class<Output> outputTypeClass) {
this(javaImplementation,
BasicDataUnitType.createBasic(inputTypeClass),
BasicDataUnitType.createBasic(outputTypeClass));
}
public TransformationDescriptor(FunctionDescriptor.SerializableFunction<Input, Output> javaImplementation,
Class<Input> inputTypeClass,
Class<Output> outputTypeClass,
LoadProfileEstimator loadProfileEstimator) {
this(javaImplementation,
BasicDataUnitType.createBasic(inputTypeClass),
BasicDataUnitType.createBasic(outputTypeClass),
loadProfileEstimator);
}
public TransformationDescriptor(FunctionDescriptor.SerializableFunction<Input, Output> javaImplementation,
BasicDataUnitType<Input> inputType,
BasicDataUnitType<Output> outputType) {
this(javaImplementation, inputType, outputType,
new NestableLoadProfileEstimator(
LoadEstimator.createFallback(1, 1),
LoadEstimator.createFallback(1, 1)
)
);
}
public TransformationDescriptor(FunctionDescriptor.SerializableFunction<Input, Output> javaImplementation,
BasicDataUnitType<Input> inputType,
BasicDataUnitType<Output> outputType,
LoadProfileEstimator loadProfileEstimator) {
super(loadProfileEstimator);
this.javaImplementation = javaImplementation;
this.inputType = inputType;
this.outputType = outputType;
}
/**
* This is function is not built to last. It is thought to help out devising programs while we are still figuring
* out how to express functions in a platform-independent way.
*
* @return a function that can perform the reduce
*/
public Function<Input, Output> getJavaImplementation() {
return this.javaImplementation;
}
/**
* In generic code, we do not have the type parameter values of operators, functions etc. This method avoids casting issues.
*
* @return this instance with type parameters set to {@link Object}
*/
@SuppressWarnings("unchecked")
public TransformationDescriptor<Object, Object> unchecked() {
return (TransformationDescriptor<Object, Object>) this;
}
public BasicDataUnitType<Input> getInputType() {
return this.inputType;
}
public BasicDataUnitType<Output> getOutputType() {
return this.outputType;
}
@Override
public String toString() {
return String.format("%s[%s]", this.getClass().getSimpleName(), this.javaImplementation);
}
}