All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tinkerpop.gremlin.giraph.process.computer.util.SideEffectsMapReduce Maven / Gradle / Ivy

package com.tinkerpop.gremlin.giraph.process.computer.util;

import com.tinkerpop.gremlin.giraph.Constants;
import com.tinkerpop.gremlin.process.computer.MapReduce;
import com.tinkerpop.gremlin.process.computer.SideEffects;
import com.tinkerpop.gremlin.structure.Graph;
import com.tinkerpop.gremlin.structure.Property;
import com.tinkerpop.gremlin.structure.Vertex;
import org.apache.commons.configuration.Configuration;
import org.javatuples.Pair;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Marko A. Rodriguez (http://markorodriguez.com)
 */
public class SideEffectsMapReduce implements MapReduce> {

    public Set sideEffectKeys = new HashSet<>();

    public String getSideEffectKey() {
        return Constants.TILDA_SIDE_EFFECTS;
    }

    public SideEffectsMapReduce() {

    }

    public SideEffectsMapReduce(final Set sideEffectKeys) {
        this.sideEffectKeys = sideEffectKeys;
    }

    @Override
    public void storeState(final Configuration configuration) {
        configuration.setProperty(Constants.GREMLIN_SIDE_EFFECT_KEYS, new ArrayList<>(this.sideEffectKeys.size()));
    }

    @Override
    public void loadState(final Configuration configuration) {
        this.sideEffectKeys = new HashSet((List) configuration.getList(Constants.GREMLIN_SIDE_EFFECT_KEYS));
    }

    @Override
    public boolean doStage(final Stage stage) {
        return true;
    }

    @Override
    public void map(final Vertex vertex, final MapEmitter emitter) {
        for (final String sideEffectKey : this.sideEffectKeys) {
            final Property property = vertex.property(Graph.Key.hide(sideEffectKey));
            if (property.isPresent()) {
                emitter.emit(sideEffectKey, property.value());
            }
        }
    }

    @Override
    public void combine(final String key, final Iterator values, final ReduceEmitter emitter) {
        this.reduce(key, values, emitter);
    }

    @Override
    public void reduce(final String key, final Iterator values, final ReduceEmitter emitter) {
        emitter.emit(key, values.next());
    }

    @Override
    public Map generateSideEffect(final Iterator> keyValues) {
        final Map map = new HashMap<>();
        while (keyValues.hasNext()) {
            final Pair pair = keyValues.next();
            map.put(pair.getValue0(), pair.getValue1());
        }
        return map;
    }

    @Override
    public void addToSideEffects(final SideEffects sideEffects, final Iterator> keyValues) {
        while (keyValues.hasNext()) {
            final Pair keyValue = keyValues.next();
            sideEffects.set(keyValue.getValue0(), keyValue.getValue1());
        }
    }

}