package com.tinkerpop.pipes.transform;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Element;
import com.tinkerpop.blueprints.Predicate;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.pipes.AbstractPipe;
import com.tinkerpop.pipes.util.PipeHelper;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* QueryPipe consolidates the fields and methods required for both VertexQueryPipe and GraphQueryPipe.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public abstract class QueryPipe<S, E extends Element> extends AbstractPipe<S, E> implements TransformPipe<S, E> {
protected List<HasContainer> hasContainers = new ArrayList<HasContainer>();
protected List<IntervalContainer> intervalContainers = new ArrayList<IntervalContainer>();
protected Class<E> elementClass;
protected int lowRange = 0;
protected int highRange = Integer.MAX_VALUE;
protected int count = 0;
protected Iterator<E> currentIterator = PipeHelper.emptyIterator();
public void setResultingElementClass(final Class<? extends Element> elementClass) {
if (!Vertex.class.isAssignableFrom(elementClass) && !Edge.class.isAssignableFrom(elementClass))
throw new IllegalArgumentException("The provided element class must be either Vertex or Edge");
this.elementClass = (Class) elementClass;
}
public Class<? extends Element> getResultElementClass() {
return this.elementClass;
}
public void addHasContainer(final HasContainer container) {
this.hasContainers.add(container);
}
public void addIntervalContainer(final IntervalContainer container) {
this.intervalContainers.add(container);
}
public void setHighRange(final int highRange) {
this.highRange = (highRange == Integer.MAX_VALUE) ? Integer.MAX_VALUE : highRange + 1;
}
public void setLowRange(final int lowRange) {
this.lowRange = (lowRange < 0) ? 0 : lowRange;
}
public void reset() {
super.reset();
this.currentIterator = PipeHelper.emptyIterator();
this.count = 0;
}
public String toString() {
StringBuilder extra = new StringBuilder();
if (null != this.hasContainers && this.hasContainers.size() > 0)
extra.append("has");
if (null != this.intervalContainers && this.intervalContainers.size() > 0) {
if (extra.length() != 0) extra.append(",");
extra.append("interval");
}
if (this.lowRange != 0 || highRange != Integer.MAX_VALUE) {
if (extra.length() != 0) extra.append(",");
extra.append("range:[");
extra.append(this.lowRange);
extra.append(",");
extra.append(this.highRange - 1);
extra.append("]");
}
if (extra.length() != 0) extra.append(",");
extra.append(this.elementClass.getSimpleName().toLowerCase());
return extra.toString();
}
public static class HasContainer {
public String key;
public Object value;
public Predicate predicate;
public HasContainer(final String key, final Predicate predicate, final Object value) {
this.key = key;
this.value = value;
this.predicate = predicate;
}
}
public static class IntervalContainer {
public String key;
public Comparable startValue;
public Comparable endValue;
public IntervalContainer(final String key, final Comparable startValue, final Comparable endValue) {
this.key = key;
this.startValue = startValue;
this.endValue = endValue;
}
}
}