ch.epfl.data.squall.components.AbstractComponent.java Source code

Java tutorial

Introduction

Here is the source code for ch.epfl.data.squall.components.AbstractComponent.java

Source

/*
 * Copyright (c) 2011-2015 EPFL DATA Laboratory
 * Copyright (c) 2014-2015 The Squall Collaboration (see NOTICE)
 *
 * All rights reserved.
 *
 * Licensed 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 ch.epfl.data.squall.components;

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

import ch.epfl.data.squall.expressions.ValueExpression;
import ch.epfl.data.squall.operators.ChainOperator;
import ch.epfl.data.squall.operators.Operator;
import ch.epfl.data.squall.types.Type;
import ch.epfl.data.squall.storm_components.StormEmitter;

public abstract class AbstractComponent<C extends Component> implements Component {

    protected abstract C getThis();

    private final String _componentName;

    private long _batchOutputMillis;
    private final ChainOperator _chain = new ChainOperator();
    private Component _child;

    private List<ValueExpression> _hashExpressions;
    private List<Integer> _hashIndexes;
    private List<String> _fullHashList;

    private boolean _printOut;
    private boolean _printOutSet; // whether printOut condition is already set

    private StormEmitter _stormEmitter;

    private Component[] _parents;

    public AbstractComponent(Component parent, String componentName) {
        _componentName = componentName;
        _parents = new Component[] { parent };
        parent.setChild(this);
    }

    public AbstractComponent(Component[] parents, String componentName) {
        _componentName = componentName;
        _parents = null;
        if (parents != null) {
            _parents = parents.clone();
            for (Component parent : parents) {
                parent.setChild(this);
            }
        }
    }

    public AbstractComponent(List<Component> parents, String componentName) {
        this((Component[]) parents.toArray(new Component[parents.size()]), componentName);
    }

    public AbstractComponent(Component[] parents) {
        this(parents, makeName(parents));
    }

    public AbstractComponent(List<Component> parents) {
        this((Component[]) parents.toArray());
    }

    private static String makeName(Component[] parents) {
        ArrayList<String> names = new ArrayList<String>();
        for (Component parent : parents) {
            names.add(parent.getName());
        }
        return StringUtils.join(names, "_");
    }

    @Override
    public String getName() {
        return _componentName;
    }

    @Override
    public Component[] getParents() {
        return _parents;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Component)
            return getName().equals(((Component) obj).getName());
        else
            return false;
    }

    @Override
    public long getBatchOutputMillis() {
        return _batchOutputMillis;
    }

    // Operations with chaining
    @Override
    public C setBatchOutputMillis(long millis) {
        _batchOutputMillis = millis;
        return getThis();
    }

    @Override
    public C add(Operator operator) {
        _chain.addOperator(operator);
        return getThis();
    }

    @Override
    public ChainOperator getChainOperator() {
        return _chain;
    }

    @Override
    public Component getChild() {
        return _child;
    }

    @Override
    public void setChild(Component child) {
        _child = child;
    }

    @Override
    public List<ValueExpression> getHashExpressions() {
        return _hashExpressions;
    }

    @Override
    public C setHashExpressions(List<ValueExpression> hashExpressions) {
        _hashExpressions = hashExpressions;
        return getThis();
    }

    @Override
    public List<Integer> getHashIndexes() {
        return _hashIndexes;
    }

    @Override
    public boolean getPrintOut() {
        return _printOut;
    }

    protected boolean getPrintOutSet() {
        return _printOutSet;
    }

    @Override
    public C setPrintOut(boolean printOut) {
        _printOutSet = true;
        _printOut = printOut;
        return getThis();
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + (getName() != null ? getName().hashCode() : 0);
        return hash;
    }

    @Override
    public C setContentSensitiveThetaJoinWrapper(Type wrapper) {
        return getThis();
    }

    @Override
    public C setOutputPartKey(int... hashIndexes) {
        return setOutputPartKey(Arrays.asList(ArrayUtils.toObject(hashIndexes)));
    }

    @Override
    public C setOutputPartKey(List<Integer> hashIndexes) {
        _hashIndexes = hashIndexes;
        return getThis();
    }

    // from StormEmitter interface
    @Override
    public String[] getEmitterIDs() {
        return _stormEmitter.getEmitterIDs();
    }

    @Override
    public String getInfoID() {
        return _stormEmitter.getInfoID();
    }

    protected void setStormEmitter(StormEmitter emitter) {
        _stormEmitter = emitter;
    }

    protected StormEmitter getStormEmitter(StormEmitter emitter) {
        return _stormEmitter;
    }

    @Override
    public List<DataSourceComponent> getAncestorDataSources() {
        final List<DataSourceComponent> list = new ArrayList<DataSourceComponent>();
        for (final Component parent : getParents())
            list.addAll(parent.getAncestorDataSources());
        return list;
    }

    @Override
    public List<String> getFullHashList() {
        return _fullHashList;
    }

    // list of distinct keys, used for direct stream grouping and load-balancing
    // ()
    @Override
    public C setFullHashList(List<String> fullHashList) {
        _fullHashList = fullHashList;
        return getThis();
    }
}