/*
* 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;
import java.util.HashSet;
import java.util.Set;
import org.apache.flink.annotation.Internal;
import org.apache.flink.api.common.operators.util.FieldSet;
/**
* A class encapsulating compiler hints describing the behavior of the user function.
* If set, the optimizer will use them to estimate the sizes of the intermediate results.
* Note that these values are optional hints, the optimizer will always generate a valid plan without
* them as well. The hints may help, however, to improve the plan choice.
*/
@Internal
public class CompilerHints {
private long outputSize = -1;
private long outputCardinality = -1;
private float avgOutputRecordSize = -1.0f;
private float filterFactor = -1.0f;
private Set<FieldSet> uniqueFields;
// --------------------------------------------------------------------------------------------
// Basic Record Statistics
// --------------------------------------------------------------------------------------------
public long getOutputSize() {
return outputSize;
}
public void setOutputSize(long outputSize) {
if (outputSize < 0) {
throw new IllegalArgumentException("The output size cannot be smaller than zero.");
}
this.outputSize = outputSize;
}
public long getOutputCardinality() {
return this.outputCardinality;
}
public void setOutputCardinality(long outputCardinality) {
if (outputCardinality < 0) {
throw new IllegalArgumentException("The output cardinality cannot be smaller than zero.");
}
this.outputCardinality = outputCardinality;
}
public float getAvgOutputRecordSize() {
return this.avgOutputRecordSize;
}
public void setAvgOutputRecordSize(float avgOutputRecordSize) {
if (avgOutputRecordSize <= 0) {
throw new IllegalArgumentException("The size of produced records must be positive.");
}
this.avgOutputRecordSize = avgOutputRecordSize;
}
public float getFilterFactor() {
return filterFactor;
}
public void setFilterFactor(float filterFactor) {
if (filterFactor < 0) {
throw new IllegalArgumentException("The filter factor cannot be smaller than zero.");
}
this.filterFactor = filterFactor;
}
// --------------------------------------------------------------------------------------------
// Uniqueness
// --------------------------------------------------------------------------------------------
/**
* Gets the FieldSets that are unique
*
* @return List of FieldSet that are unique
*/
public Set<FieldSet> getUniqueFields() {
return this.uniqueFields;
}
/**
* Adds a FieldSet to be unique
*
* @param uniqueFieldSet The unique FieldSet
*/
public void addUniqueField(FieldSet uniqueFieldSet) {
if (this.uniqueFields == null) {
this.uniqueFields = new HashSet<FieldSet>();
}
this.uniqueFields.add(uniqueFieldSet);
}
/**
* Adds a field as having only unique values.
*
* @param field The field with unique values.
*/
public void addUniqueField(int field) {
if (this.uniqueFields == null) {
this.uniqueFields = new HashSet<FieldSet>();
}
this.uniqueFields.add(new FieldSet(field));
}
/**
* Adds multiple FieldSets to be unique
*
* @param uniqueFieldSets A set of unique FieldSet
*/
public void addUniqueFields(Set<FieldSet> uniqueFieldSets) {
if (this.uniqueFields == null) {
this.uniqueFields = new HashSet<FieldSet>();
}
this.uniqueFields.addAll(uniqueFieldSets);
}
public void clearUniqueFields() {
this.uniqueFields = null;
}
// --------------------------------------------------------------------------------------------
// Miscellaneous
// --------------------------------------------------------------------------------------------
protected void copyFrom(CompilerHints source) {
this.outputSize = source.outputSize;
this.outputCardinality = source.outputCardinality;
this.avgOutputRecordSize = source.avgOutputRecordSize;
this.filterFactor = source.filterFactor;
if (source.uniqueFields != null && source.uniqueFields.size() > 0) {
if (this.uniqueFields == null) {
this.uniqueFields = new HashSet<FieldSet>();
} else {
this.uniqueFields.clear();
}
this.uniqueFields.addAll(source.uniqueFields);
}
}
}