blob: 09bb233d7ae411383f911643985e57eb9dcb7c12 [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.plan.wayangplan;
import java.util.Collection;
import org.apache.wayang.core.optimizer.cardinality.CardinalityEstimate;
import org.apache.wayang.core.types.DataSetType;
/**
* Abstract class for inputs and outputs to operators.
*/
abstract public class Slot<T> {
/**
* Identifies this slot within its operator.
*/
private final String name;
/**
* The operator that is being decorated by this slot.
*/
private final Operator owner;
/**
* <i>Lazy initialized.</i> The index of this instance within its {@link #owner}.
*/
protected int index = -1;
/**
* Type of data passed through this slot, expressed as a {@link DataSetType} so as to define not only the types of
* elements that are passed but also capture their structure (e.g., flat, grouped, sorted, ...).
*/
private final DataSetType<T> type;
protected Slot(String name, Operator owner, DataSetType<T> type) {
assert owner != null;
this.name = name;
this.owner = owner;
this.type = type;
}
public String getName() {
return this.name;
}
public Operator getOwner() {
return this.owner;
}
public DataSetType<T> getType() {
return this.type;
}
/**
* @return whether this is an {@link OutputSlot}
*/
public boolean isOutputSlot() {
return this instanceof OutputSlot;
}
/**
* @return whether this is an input slot
*/
public boolean isInputSlot() {
return this instanceof InputSlot;
}
public boolean isCompatibleWith(Slot<?> that) {
return this.type.equals(that.type);
}
@Override
public String toString() {
return String.format("%s@%s", this.name, this.owner == null ? "no owner" : this.owner.toString());
}
/**
* @return the index of this slot within its owner
* @throws IllegalStateException if this slot does not have an owner
* @see #getOwner()
*/
public abstract int getIndex() throws IllegalStateException;
/**
* Assign a {@link CardinalityEstimate} to this instance.
*
* @param cardinalityEstimate the {@link CardinalityEstimate} to assign
* @deprecated This method does not do anything, anymore.
*/
@Deprecated
public void setCardinalityEstimate(CardinalityEstimate cardinalityEstimate) {
// boolean isUpdate = this.cardinalityEstimate == null || !this.cardinalityEstimate.equals(cardinalityEstimate);
// if (isUpdate) {
// LoggerFactory.getLogger(this.getClass())
// .trace("Updating cardinality of {} from {} to {}.", this, this.cardinalityEstimate, cardinalityEstimate);
// this.cardinalityEstimate = cardinalityEstimate;
// this.mark();
// }
}
/**
* @deprecated These method does not do anything, anymore.
*/
@Deprecated
public CardinalityEstimate getCardinalityEstimate() {
return new CardinalityEstimate(42, 42, 0.42);
}
//
// /**
// * Set the mark of this instance. Used to communicate changes in the {@link CardinalityEstimate}.
// * Will also be triggered by {@link #setCardinalityEstimate(CardinalityEstimate)}.
// */
// public void mark() {
// this.isMarked = true;
// }
// /**
// * Retrieves the mark of this instance, then clears it.
// * Used to communicate changes in the {@link CardinalityEstimate}.
// */
// public boolean getAndClearMark() {
// boolean wasMarked = this.isMarked;
// this.isMarked = false;
// return wasMarked;
// }
//
// public boolean isMarked() {
// return this.isMarked;
// }
/**
* Creates an {@code int[]} of the indices of the {@code slots}.
*/
public static int[] toIndices(Collection<? extends Slot<?>> slots) {
int[] indices = new int[slots.size()];
int i = 0;
for (Slot<?> slot : slots) indices[i++] = slot.getIndex();
return indices;
}
}