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

com.arangodb.model.TraversalOptions Maven / Gradle / Ivy

There is a newer version: 7.15.0
Show newest version
/*
 * DISCLAIMER
 *
 * Copyright 2016 ArangoDB GmbH, Cologne, Germany
 *
 * 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.
 *
 * Copyright holder is ArangoDB GmbH, Cologne, Germany
 */

package com.arangodb.model;

/**
 * @author Mark Vollmary
 * 
 * @see API Documentation
 */
public class TraversalOptions {

	public enum Direction {
		outbound, inbound, any
	}

	public enum ItemOrder {
		forward, backward
	}

	public enum Strategy {
		depthfirst, breadthfirst
	}

	public enum UniquenessType {
		none, global, path
	}

	public enum Order {
		preorder, postorder, preorder_expander
	}

	private String sort;
	private Direction direction;
	private Integer minDepth;
	private String startVertex;
	private String visitor;
	private ItemOrder itemOrder;
	private Strategy strategy;
	private String filter;
	private String init;
	private Integer maxIterations;
	private Integer maxDepth;
	private Uniqueness uniqueness;
	private Order order;
	private String graphName;
	private String expander;
	private String edgeCollection;

	public String getSort() {
		return sort;
	}

	/**
	 * 
	 * @param sort
	 *            JavaScript code of a custom comparison function for the edges. The signature of this function is (l,
	 *            r) -> integer (where l and r are edges) and must return -1 if l is smaller than, +1 if l is greater
	 *            than, and 0 if l and r are equal. The reason for this is the following: The order of edges returned
	 *            for a certain vertex is undefined. This is because there is no natural order of edges for a vertex
	 *            with multiple connected edges. To explicitly define the order in which edges on the vertex are
	 *            followed, you can specify an edge comparator function with this attribute. Note that the value here
	 *            has to be a string to conform to the JSON standard, which in turn is parsed as function body on the
	 *            server side. Furthermore note that this attribute is only used for the standard expanders. If you use
	 *            your custom expander you have to do the sorting yourself within the expander code.
	 * @return options
	 */
	public TraversalOptions sort(final String sort) {
		this.sort = sort;
		return this;
	}

	public Direction getDirection() {
		return direction;
	}

	/**
	 * 
	 * @param direction
	 *            direction for traversal
	 * 
	 *            if set, must be either "outbound", "inbound", or "any"
	 * 
	 *            if not set, the expander attribute must be specified
	 * @return options
	 */
	public TraversalOptions direction(final Direction direction) {
		this.direction = direction;
		return this;
	}

	public Integer getMinDepth() {
		return minDepth;
	}

	/**
	 * 
	 * @param minDepth
	 *            ANDed with any existing filters): visits only nodes in at least the given depth
	 * @return options
	 */
	public TraversalOptions minDepth(final Integer minDepth) {
		this.minDepth = minDepth;
		return this;
	}

	public String getStartVertex() {
		return startVertex;
	}

	/**
	 * 
	 * @param startVertex
	 *            The id of the startVertex, e.g. "users/foo".
	 * @return options
	 */
	public TraversalOptions startVertex(final String startVertex) {
		this.startVertex = startVertex;
		return this;
	}

	public String getVisitor() {
		return visitor;
	}

	/**
	 * 
	 * @param visitor
	 *            JavaScript code of custom visitor function function signature: (config, result, vertex, path,
	 *            connected) -> void The visitor function can do anything, but its return value is ignored. To populate
	 *            a result, use the result variable by reference. Note that the connected argument is only populated
	 *            when the order attribute is set to "preorder-expander".
	 * @return options
	 */
	public TraversalOptions visitor(final String visitor) {
		this.visitor = visitor;
		return this;
	}

	public ItemOrder getItemOrder() {
		return itemOrder;
	}

	/**
	 * 
	 * @param itemOrder
	 *            The item iteration order can be "forward" or "backward"
	 * @return options
	 */
	public TraversalOptions itemOrder(final ItemOrder itemOrder) {
		this.itemOrder = itemOrder;
		return this;
	}

	public Strategy getStrategy() {
		return strategy;
	}

	/**
	 * 
	 * @param strategy
	 *            The traversal strategy can be "depthfirst" or "breadthfirst"
	 * @return options
	 */
	public TraversalOptions strategy(final Strategy strategy) {
		this.strategy = strategy;
		return this;
	}

	public String getFilter() {
		return filter;
	}

	/**
	 * 
	 * @param filter
	 *            default is to include all nodes: body (JavaScript code) of custom filter function function signature:
	 *            (config, vertex, path) -> mixed can return four different string values:
	 * 
	 *            "exclude" -> this vertex will not be visited.
	 * 
	 *            "prune" -> the edges of this vertex will not be followed.
	 * 
	 *            "" or undefined -> visit the vertex and follow it's edges.
	 * 
	 *            Array -> containing any combination of the above.
	 * 
	 *            If there is at least one "exclude" or "prune" respectivly is contained, it's effect will occur.
	 * @return options
	 */
	public TraversalOptions filter(final String filter) {
		this.filter = filter;
		return this;
	}

	public String getInit() {
		return init;
	}

	/**
	 * 
	 * @param init
	 *            JavaScript code of custom result initialization function function signature: (config, result) -> void
	 *            initialize any values in result with what is required
	 * @return options
	 */
	public TraversalOptions init(final String init) {
		this.init = init;
		return this;
	}

	public Integer getMaxIterations() {
		return maxIterations;
	}

	/**
	 * 
	 * @param maxIterations
	 *            Maximum number of iterations in each traversal. This number can be set to prevent endless loops in
	 *            traversal of cyclic graphs. When a traversal performs as many iterations as the maxIterations value,
	 *            the traversal will abort with an error. If maxIterations is not set, a server-defined value may be
	 *            used.
	 * @return options
	 */
	public TraversalOptions maxIterations(final Integer maxIterations) {
		this.maxIterations = maxIterations;
		return this;
	}

	public Integer getMaxDepth() {
		return maxDepth;
	}

	/**
	 * 
	 * @param maxDepth
	 *            ANDed with any existing filters visits only nodes in at most the given depth.
	 * @return options
	 */
	public TraversalOptions maxDepth(final Integer maxDepth) {
		this.maxDepth = maxDepth;
		return this;
	}

	public UniquenessType getVerticesUniqueness() {
		return uniqueness != null ? uniqueness.vertices : null;
	}

	/**
	 * 
	 * @param vertices
	 *            Specifies uniqueness for vertices can be "none", "global" or "path"
	 * @return options
	 */
	public TraversalOptions verticesUniqueness(final UniquenessType vertices) {
		getUniqueness().setVertices(vertices);
		return this;
	}

	public UniquenessType getEdgesUniqueness() {
		return uniqueness != null ? uniqueness.edges : null;
	}

	/**
	 * 
	 * @param edges
	 *            Specifies uniqueness for edges can be "none", "global" or "path"
	 * @return options
	 */
	public TraversalOptions edgesUniqueness(final UniquenessType edges) {
		getUniqueness().setEdges(edges);
		return this;
	}

	public Order getOrder() {
		return order;
	}

	/**
	 * 
	 * @param order
	 *            The traversal order can be "preorder", "postorder" or "preorder-expander"
	 * @return options
	 */
	public TraversalOptions order(final Order order) {
		this.order = order;
		return this;
	}

	public String getGraphName() {
		return graphName;
	}

	/**
	 * 
	 * @param graphName
	 *            The name of the graph that contains the edges. Either edgeCollection or graphName has to be given. In
	 *            case both values are set the graphName is prefered.
	 * @return options
	 */
	public TraversalOptions graphName(final String graphName) {
		this.graphName = graphName;
		return this;
	}

	public String getExpander() {
		return expander;
	}

	/**
	 * 
	 * @param expander
	 *            JavaScript code of custom expander function must be set if direction attribute is not set function
	 *            signature: (config, vertex, path) -> array expander must return an array of the connections for vertex
	 *            each connection is an object with the attributes edge and vertex
	 * @return options
	 */
	public TraversalOptions expander(final String expander) {
		this.expander = expander;
		return this;
	}

	public String getEdgeCollection() {
		return edgeCollection;
	}

	/**
	 * 
	 * @param edgeCollection
	 *            The name of the collection that contains the edges.
	 * @return options
	 */
	public TraversalOptions edgeCollection(final String edgeCollection) {
		this.edgeCollection = edgeCollection;
		return this;
	}

	public static class Uniqueness {

		private UniquenessType vertices;
		private UniquenessType edges;

		public UniquenessType getVertices() {
			return vertices;
		}

		public void setVertices(final UniquenessType vertices) {
			this.vertices = vertices;
		}

		public UniquenessType getEdges() {
			return edges;
		}

		public void setEdges(final UniquenessType edges) {
			this.edges = edges;
		}
	}

	private Uniqueness getUniqueness() {
		if (uniqueness == null) {
			uniqueness = new Uniqueness();
			uniqueness.vertices = UniquenessType.none;
			uniqueness.edges = UniquenessType.none;
		}

		return uniqueness;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy