1818
1919import java .util .*;
2020import java .util .stream .Collectors ;
21+ import java .util .stream .Stream ;
2122
2223import com .arangodb .*;
2324import com .arangodb .entity .*;
2829import com .arangodb .serde .jackson .JacksonSerde ;
2930import com .arangodb .tinkerpop .gremlin .persistence .*;
3031import com .arangodb .tinkerpop .gremlin .persistence .serde .SerdeModule ;
32+ import com .arangodb .tinkerpop .gremlin .process .filter .ArangoFilter ;
33+ import com .arangodb .tinkerpop .gremlin .process .filter .EmptyFilter ;
34+ import com .arangodb .tinkerpop .gremlin .process .filter .FilterSupport ;
3135import com .arangodb .tinkerpop .gremlin .structure .*;
3236import com .arangodb .tinkerpop .gremlin .utils .AqlDeserializer ;
3337import com .fasterxml .jackson .databind .*;
3438import org .apache .tinkerpop .gremlin .process .traversal .util .TraversalInterruptedException ;
3539import org .apache .tinkerpop .gremlin .structure .Direction ;
36- import org .apache .tinkerpop .gremlin .util .iterator .IteratorUtils ;
3740import org .slf4j .Logger ;
3841import org .slf4j .LoggerFactory ;
3942
@@ -110,15 +113,25 @@ public void updateGraphVariables(VariablesData document) {
110113 }
111114 }
112115
116+ public Stream <VertexData > getGraphVertices (List <ElementId > ids , ArangoFilter filter , Set <String > colNames ) {
117+ logger .debug ("Get all {} graph vertices, filtered by AQL filters" , config .graphName );
118+ return getGraphDocuments (ids , filter , colNames , VertexData .class );
119+ }
120+
121+ public Stream <EdgeData > getGraphEdges (List <ElementId > ids , ArangoFilter filter , Set <String > colNames ) {
122+ logger .debug ("Get all {} graph edges, filtered by AQL filters" , config .graphName );
123+ return getGraphDocuments (ids , filter , colNames , EdgeData .class );
124+ }
125+
113126 /**
114127 * Get vertices of a graph. If no ids are provided, get all vertices.
115128 *
116129 * @param ids the ids to match
117130 * @return the documents
118131 */
119- public ArangoIterable <VertexData > getGraphVertices (final List <ElementId > ids ) {
132+ public Stream <VertexData > getGraphVertices (final List <ElementId > ids ) {
120133 logger .debug ("Get all {} graph vertices, filtered by ids: {}" , config .graphName , ids );
121- return getGraphDocuments (ids , config .vertices , VertexData .class );
134+ return getGraphDocuments (ids , EmptyFilter . instance (), config .vertices , VertexData .class );
122135 }
123136
124137 /**
@@ -127,19 +140,28 @@ public ArangoIterable<VertexData> getGraphVertices(final List<ElementId> ids) {
127140 * @param ids the ids to match
128141 * @return the documents
129142 */
130- public ArangoIterable <EdgeData > getGraphEdges (List <ElementId > ids ) {
143+ public Stream <EdgeData > getGraphEdges (List <ElementId > ids ) {
131144 logger .debug ("Get all {} graph edges, filtered by ids: {}" , config .graphName , ids );
132- return getGraphDocuments (ids , config .edges , EdgeData .class );
145+ return getGraphDocuments (ids , EmptyFilter . instance (), config .edges , EdgeData .class );
133146 }
134147
135- private <V > ArangoIterable <V > getGraphDocuments (List <ElementId > ids , Set <String > colNames , Class <V > clazz ) {
148+ private <V > Stream <V > getGraphDocuments (List <ElementId > ids , ArangoFilter filter , Set <String > colNames , Class <V > clazz ) {
136149 if (ids .isEmpty ()) {
137- return query (ArangoDBQueryBuilder .readAllDocuments (colNames ), clazz , null );
150+ if (colNames .isEmpty ()) {
151+ return Stream .empty ();
152+ }
153+ return query (ArangoDBQueryBuilder .readAllDocuments (colNames , filter ), clazz , null );
138154 } else {
139155 List <ElementId > prunedIds = ids .stream ()
140156 .filter (it -> colNames .contains (it .getCollection ()))
141157 .collect (Collectors .toList ());
142- return query ("FOR d IN DOCUMENT(@ids) RETURN d" , clazz , Collections .singletonMap ("ids" , prunedIds ));
158+ StringBuilder query = new StringBuilder ();
159+ query .append ("FOR d IN DOCUMENT(@ids)" );
160+ if (filter .getSupport () != FilterSupport .NONE ) {
161+ query .append (" FILTER " ).append (filter .toAql ("d" ));
162+ }
163+ query .append (" RETURN d" );
164+ return query (query .toString (), clazz , Collections .singletonMap ("ids" , prunedIds ));
143165 }
144166 }
145167
@@ -191,19 +213,19 @@ public ArangoDB getArangoDriver() {
191213 return db .arango ();
192214 }
193215
194- public Iterator <Object > query (final String query , final Map <String , ?> parameters , final AqlQueryOptions options ) {
195- Iterator < JsonNode > res = query (query , JsonNode .class , parameters , options );
196- return IteratorUtils .map (res , aqlDeserializer ::deserialize );
216+ public Stream <Object > query (final String query , final Map <String , ?> parameters , final AqlQueryOptions options ) {
217+ return query (query , JsonNode .class , parameters , options )
218+ .map (aqlDeserializer ::deserialize );
197219 }
198220
199- private <V > ArangoCursor <V > query (String query , Class <V > type , Map <String , ?> parameters ) {
221+ private <V > Stream <V > query (String query , Class <V > type , Map <String , ?> parameters ) {
200222 return query (query , type , parameters , new AqlQueryOptions ());
201223 }
202224
203- private <V > ArangoCursor <V > query (String query , Class <V > type , Map <String , ?> parameters , AqlQueryOptions options ) {
225+ private <V > Stream <V > query (String query , Class <V > type , Map <String , ?> parameters , AqlQueryOptions options ) {
204226 logger .debug ("Executing AQL query: {}, with parameters: {}, with options: {}" , query , parameters , options );
205227 try {
206- return db .query (query , type , parameters , options );
228+ return db .query (query , type , parameters , options ). stream () ;
207229 } catch (ArangoDBException e ) {
208230 throw mapException (e );
209231 }
@@ -303,7 +325,7 @@ public void updateVertex(ArangoDBVertex vertex) {
303325 logger .debug ("Document updated, new rev {}" , vertexEntity .getRev ());
304326 }
305327
306- public Iterator <VertexData > getVertexNeighbors (ElementId vertexId , Set <String > edgeCollections , Direction direction , String [] labels ) {
328+ public Stream <VertexData > getVertexNeighbors (ElementId vertexId , Set <String > edgeCollections , Direction direction , String [] labels ) {
307329 logger .debug ("Get vertex {}:{} Neighbors, in {}, from collections {}" , vertexId , direction , config .graphName , edgeCollections );
308330 String query = ArangoDBQueryBuilder .readVertexNeighbors (config .graphName , direction , config , labels );
309331 Map <String , Object > params = new HashMap <>();
@@ -315,7 +337,7 @@ public Iterator<VertexData> getVertexNeighbors(ElementId vertexId, Set<String> e
315337 return query (query , VertexData .class , params );
316338 }
317339
318- public Iterator <EdgeData > getVertexEdges (ElementId vertexId , Set <String > edgeCollections , Direction direction , String [] labels ) {
340+ public Stream <EdgeData > getVertexEdges (ElementId vertexId , Set <String > edgeCollections , Direction direction , String [] labels ) {
319341 logger .debug ("Get vertex {}:{} Edges, in {}, from collections {}" , vertexId , direction , config .graphName , edgeCollections );
320342 String query = ArangoDBQueryBuilder .readVertexEdges (config .graphName , direction , config , labels );
321343 Map <String , Object > params = new HashMap <>();
0 commit comments