blob: b3507bc81c842f84aca5e967ee673061b47caf93 [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.Optional;
import org.apache.wayang.core.optimizer.ProbabilisticDoubleInterval;
import org.apache.wayang.core.optimizer.costs.LoadProfileEstimator;
import org.apache.wayang.core.types.BasicDataUnitType;
/**
* Created by bertty on 13-07-17.
*/
public class ConsumerDescriptor<T> extends FunctionDescriptor {
protected final BasicDataUnitType<T> inputType;
private final SerializableConsumer<T> javaImplementation;
/**
* The selectivity ({code 0..1}) of this instance or {@code null} if unspecified.
*/
private ProbabilisticDoubleInterval selectivity;
public ConsumerDescriptor(SerializableConsumer<T> javaImplementation, Class<T> inputTypeClass) {
this(javaImplementation, inputTypeClass, (ProbabilisticDoubleInterval) null);
}
public ConsumerDescriptor(SerializableConsumer<T> javaImplementation,
Class<T> inputTypeClass,
ProbabilisticDoubleInterval selectivity) {
this(javaImplementation, inputTypeClass, selectivity, null);
}
public ConsumerDescriptor(SerializableConsumer<T> javaImplementation,
Class<T> inputTypeClass,
LoadProfileEstimator loadProfileEstimator) {
this(javaImplementation, inputTypeClass, null, loadProfileEstimator);
}
public ConsumerDescriptor(SerializableConsumer<T> javaImplementation,
Class<T> inputTypeClass,
ProbabilisticDoubleInterval selectivity,
LoadProfileEstimator loadProfileEstimator) {
this(javaImplementation, BasicDataUnitType.createBasic(inputTypeClass), selectivity, loadProfileEstimator);
}
public ConsumerDescriptor(SerializableConsumer<T> javaImplementation,
BasicDataUnitType<T> inputType,
ProbabilisticDoubleInterval selectivity,
LoadProfileEstimator loadProfileEstimator) {
super(loadProfileEstimator);
this.javaImplementation = javaImplementation;
this.inputType = inputType;
this.selectivity = selectivity;
}
/**
* This 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 SerializableConsumer<T> 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 SerializableConsumer<Object> unchecked() {
return (SerializableConsumer<Object>) this;
}
public BasicDataUnitType<T> getInputType() {
return this.inputType;
}
/**
* Get the selectivity of this instance.
*
* @return an {@link java.util.Optional} with the selectivity or an empty one if no selectivity was specified
*/
public Optional<ProbabilisticDoubleInterval> getSelectivity() {
return Optional.ofNullable(this.selectivity);
}
@Override
public String toString() {
return String.format("%s[%s]", this.getClass().getSimpleName(), this.javaImplementation);
}
}