package org.vertexium.query; import org.vertexium.*; import org.vertexium.util.FilterIterable; import org.vertexium.util.JoinIterable; import java.util.EnumSet; import java.util.List; public class DefaultVertexQuery extends VertexQueryBase implements VertexQuery { public DefaultVertexQuery(Graph graph, Vertex sourceVertex, String queryString, Authorizations authorizations) { super(graph, sourceVertex, queryString, authorizations); } @Override public QueryResultsIterable<Vertex> vertices(EnumSet<FetchHint> fetchHints) { Iterable<Vertex> vertices = allVertices(fetchHints); return new DefaultGraphQueryIterableWithAggregations<>(getParameters(), vertices, true, true, true, getAggregations()); } private Iterable<Vertex> allVertices(EnumSet<FetchHint> fetchHints) { List<String> edgeLabels = getParameters().getEdgeLabels(); String[] edgeLabelsArray = edgeLabels == null || edgeLabels.size() == 0 ? null : edgeLabels.toArray(new String[edgeLabels.size()]); Iterable<Vertex> results = getSourceVertex().getVertices( getDirection(), edgeLabelsArray, fetchHints, getParameters().getAuthorizations() ); if (getOtherVertexId() != null) { results = new FilterIterable<Vertex>(results) { @Override protected boolean isIncluded(Vertex otherVertex) { return otherVertex.getId().equals(getOtherVertexId()); } }; } return results; } @Override public QueryResultsIterable<Edge> edges(EnumSet<FetchHint> fetchHints) { Iterable<Edge> edges = allEdges(fetchHints); return new DefaultGraphQueryIterableWithAggregations<>(getParameters(), edges, true, true, true, getAggregations()); } private Iterable<Edge> allEdges(EnumSet<FetchHint> fetchHints) { Iterable<Edge> results = getSourceVertex().getEdges(getDirection(), fetchHints, getParameters().getAuthorizations()); if (getOtherVertexId() != null) { results = new FilterIterable<Edge>(results) { @Override protected boolean isIncluded(Edge edge) { return edge.getOtherVertexId(getSourceVertex().getId()).equals(getOtherVertexId()); } }; } return results; } @Override protected QueryResultsIterable<? extends VertexiumObject> extendedData(EnumSet<FetchHint> extendedDataFetchHints) { EnumSet<FetchHint> fetchHints = EnumSet.of(FetchHint.EXTENDED_DATA_TABLE_NAMES); return extendedData(extendedDataFetchHints, new JoinIterable<>( allVertices(fetchHints), allEdges(fetchHints) )); } }