diff --git a/fuse-core/pom.xml b/fuse-core/pom.xml index bca0a2cb0..0c61a55f4 100644 --- a/fuse-core/pom.xml +++ b/fuse-core/pom.xml @@ -47,6 +47,10 @@ org.elasticsearch.client transport + + org.reflections + reflections + diff --git a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/cursor/CursorFactory.java b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/cursor/CursorFactory.java index 0597af3ae..893a14447 100644 --- a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/cursor/CursorFactory.java +++ b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/cursor/CursorFactory.java @@ -9,9 +9,9 @@ * 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. @@ -21,7 +21,15 @@ */ import com.yangdb.fuse.dispatcher.resource.QueryResource; +import com.yangdb.fuse.model.transport.CreatePageRequest; import com.yangdb.fuse.model.transport.cursor.CreateCursorRequest; +import com.yangdb.fuse.model.transport.cursor.LogicalGraphCursorRequest; +import org.reflections.Reflections; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Optional; +import java.util.Set; /** * Created by Roman on 02/04/2017. @@ -29,9 +37,10 @@ public interface CursorFactory { interface Context { QueryResource getQueryResource(); + CreateCursorRequest getCursorRequest(); - class Impl implements Context{ + class Impl implements Context { //region Constructors public Impl(QueryResource queryResource, CreateCursorRequest cursorRequest) { this.queryResource = queryResource; @@ -57,4 +66,37 @@ public CreateCursorRequest getCursorRequest() { } Cursor createCursor(Context context); + + /** + * resolve cursor request class name by CursorType value + * @param cursorTypeName + * @return + */ + static Class resolve(String cursorTypeName) { + Reflections reflections = new Reflections("com.yangdb.fuse"); + Set> allClasses = reflections.getSubTypesOf(CreateCursorRequest.class); + Optional> cursorType = allClasses.stream().filter(clazz -> { + try { + //get value of static field member + return clazz.getField("CursorType").get(null).equals(cursorTypeName); + } catch (IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + return false; + }).findFirst(); + + return cursorType.isPresent() ? cursorType.get() : LogicalGraphCursorRequest.class; + } + + /** + * generate cursor request based on given params + * @param cursorTypeName + * @return + */ + static CreateCursorRequest request(String cursorTypeName, CreatePageRequest pageRequest) throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException { + Class cursor = resolve(cursorTypeName); + Constructor constructor = cursor.getConstructor(pageRequest.getClass()); + return constructor.newInstance(pageRequest); + } + } diff --git a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriver.java b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriver.java index 9af2b10e4..dc6be9b35 100644 --- a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriver.java +++ b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriver.java @@ -51,7 +51,7 @@ public interface QueryDriver { Optional createAndFetch(CreateQueryRequest queryRequest); - Optional run(Query query); + Optional run(Query query, int pageSize, String cursorType); Optional run(String cypher, String ontology); diff --git a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriverBase.java b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriverBase.java index 645fb7288..7076f2616 100644 --- a/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriverBase.java +++ b/fuse-core/src/main/java/com/yangdb/fuse/dispatcher/driver/QueryDriverBase.java @@ -47,16 +47,19 @@ import com.yangdb.fuse.model.results.AssignmentsQueryResult; import com.yangdb.fuse.model.transport.*; import com.yangdb.fuse.model.transport.cursor.CreateCursorRequest; -import com.yangdb.fuse.model.transport.cursor.CreateGraphCursorRequest; +import com.yangdb.fuse.model.transport.cursor.CreatePathsCursorRequest; import com.yangdb.fuse.model.transport.cursor.LogicalGraphCursorRequest; import com.yangdb.fuse.model.validation.ValidationResult; import javaslang.collection.Stream; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import javaslang.control.Option; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.stream.Collectors; +import static com.yangdb.fuse.dispatcher.cursor.CursorFactory.request; +import static com.yangdb.fuse.dispatcher.cursor.CursorFactory.resolve; import static com.yangdb.fuse.model.Utils.getOrCreateId; import static com.yangdb.fuse.model.asgQuery.AsgCompositeQuery.hasInnerQuery; import static java.util.Collections.EMPTY_LIST; @@ -93,10 +96,10 @@ public Optional createAndFetch(CreateQueryRequest request) { } @Override - public Optional run(Query query) { + public Optional run(Query query, int pageSize, String cursorType) { String id = UUID.randomUUID().toString(); try { - CreateQueryRequest queryRequest = createQueryRequest(query, id); + CreateQueryRequest queryRequest = new CreateQueryRequest(id, id, query, request(cursorType,new CreatePageRequest(pageSize))); Optional resourceInfo = create(queryRequest); if (!resourceInfo.isPresent()) return Optional.empty(); @@ -105,6 +108,9 @@ public Optional run(Query query) { return Optional.of(resourceInfo.get().getError()); return Optional.of(resourceInfo.get()); + } catch (Throwable e) { + return Optional.of(new QueryResourceInfo().error( + new FuseError(Query.class.getSimpleName(), "failed building the cursor request " + cursorType))); } finally { //remove stateless query // delete(id); @@ -112,10 +118,6 @@ public Optional run(Query query) { } - protected CreateQueryRequest createQueryRequest(Query query, String id) { - return new CreateQueryRequest(id, id, query, new LogicalGraphCursorRequest(new CreatePageRequest())); - } - @Override public Optional run(String cypher, String ontology) { String id = UUID.randomUUID().toString(); diff --git a/fuse-domain/fuse-domain-dragons/fuse-domain-dragons-test/src/test/java/com/yangdb/fuse/services/dispatcher/driver/MockDriver.java b/fuse-domain/fuse-domain-dragons/fuse-domain-dragons-test/src/test/java/com/yangdb/fuse/services/dispatcher/driver/MockDriver.java index 0ad95944d..be555975b 100644 --- a/fuse-domain/fuse-domain-dragons/fuse-domain-dragons-test/src/test/java/com/yangdb/fuse/services/dispatcher/driver/MockDriver.java +++ b/fuse-domain/fuse-domain-dragons/fuse-domain-dragons-test/src/test/java/com/yangdb/fuse/services/dispatcher/driver/MockDriver.java @@ -1,7 +1,6 @@ package com.yangdb.fuse.services.dispatcher.driver; import com.google.inject.Inject; -import com.yangdb.fuse.client.export.GraphWriter; import com.yangdb.fuse.client.export.GraphWriterStrategy; import com.yangdb.fuse.dispatcher.cursor.CursorFactory; import com.yangdb.fuse.dispatcher.driver.*; @@ -20,10 +19,8 @@ import com.yangdb.fuse.model.results.QueryResultBase; import com.yangdb.fuse.model.transport.CreateQueryRequest; import com.yangdb.fuse.model.transport.cursor.CreateCursorRequest; -import com.yangdb.fuse.model.transport.cursor.LogicalGraphCursorRequest; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; -import java.util.Map; import java.util.Optional; /** @@ -57,7 +54,7 @@ protected AsgQuery rewrite(AsgQuery asgQuery) { } @Override - public Optional run(com.yangdb.fuse.model.query.Query query) { + public Optional run(com.yangdb.fuse.model.query.Query query, int pageSize, String cursorType) { return Optional.empty(); } diff --git a/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/ext/driver/ExtensionQueryDriver.java b/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/ext/driver/ExtensionQueryDriver.java index ddb3e8eed..a745a3fd3 100644 --- a/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/ext/driver/ExtensionQueryDriver.java +++ b/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/ext/driver/ExtensionQueryDriver.java @@ -117,7 +117,7 @@ protected CreateJsonQueryRequest createJsonQueryRequest(String cypher, String on return new CreateJsonQueryRequest(id, id, cypher, ontology, new LogicalGraphCursorRequest(new CreatePageRequest())); } - protected CreateQueryRequest createQueryRequest(Query query, String id) { + protected CreateQueryRequest createQueryRequest(Query query, String id, long pageSize) { return new CreateQueryRequest(id, id, query, new LogicalGraphCursorRequest(new CreatePageRequest())); } diff --git a/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/services/KnowledgeExtensionQueryController.java b/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/services/KnowledgeExtensionQueryController.java index d2ba65f61..dc294d735 100644 --- a/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/services/KnowledgeExtensionQueryController.java +++ b/fuse-domain/fuse-domain-knowledge/fuse-domain-knowledge-ext/src/main/java/com/yangdb/fuse/services/KnowledgeExtensionQueryController.java @@ -66,8 +66,8 @@ public ContentResponse create(CreateJsonQueryRequest request) } @Override - public ContentResponse run(Query query) { - return controller.run(query); + public ContentResponse run(Query query, int pageSize, String cursorType) { + return controller.run(query,pageSize,cursorType ); } @Override diff --git a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteElementVertexController.java b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteElementVertexController.java index 804e69edd..c91571dce 100644 --- a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteElementVertexController.java +++ b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteElementVertexController.java @@ -30,7 +30,7 @@ import com.yangdb.fuse.unipop.controller.promise.appender.SizeSearchAppender; import com.yangdb.fuse.unipop.controller.search.SearchBuilder; import com.yangdb.fuse.unipop.controller.search.SearchOrderProviderFactory; -import com.yangdb.fuse.unipop.converter.SearchHitLivePageIterable; +import com.yangdb.fuse.unipop.converter.SearchHitScrollIterable; import com.yangdb.fuse.unipop.predicates.SelectP; import com.yangdb.fuse.unipop.promise.TraversalConstraint; import com.yangdb.fuse.unipop.schemaProviders.GraphElementSchemaProvider; @@ -118,12 +118,14 @@ public Iterator search(SearchQuery searchQuery) { searchAppender.append(searchBuilder, context); SearchRequestBuilder searchRequest = searchBuilder.build(client, false); - SearchHitLivePageIterable searchHits = new SearchHitLivePageIterable( + SearchHitScrollIterable searchHits = new SearchHitScrollIterable( client, searchRequest, orderProviderFactory.build(context), searchBuilder.getLimit(), - searchBuilder.getScrollSize()); + searchBuilder.getScrollSize(), + searchBuilder.getScrollTime() + ); ElementConverter elementConverter = new DiscreteVertexConverter<>(context); diff --git a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexController.java b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexController.java index 7c9f193d4..efde71964 100644 --- a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexController.java +++ b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexController.java @@ -33,7 +33,7 @@ import com.yangdb.fuse.unipop.controller.search.SearchBuilder; import com.yangdb.fuse.unipop.controller.search.SearchOrderProviderFactory; import com.yangdb.fuse.unipop.controller.utils.traversal.TraversalValuesByKeyProvider; -import com.yangdb.fuse.unipop.converter.SearchHitLivePageIterable; +import com.yangdb.fuse.unipop.converter.SearchHitScrollIterable; import com.yangdb.fuse.unipop.predicates.SelectP; import com.yangdb.fuse.unipop.promise.Constraint; import com.yangdb.fuse.unipop.promise.TraversalConstraint; @@ -145,12 +145,14 @@ protected Iterator search(SearchVertexQuery searchVertexQuery, Iterable elementConverter = new CompositeElementConverter<>( new DiscreteEdgeConverter<>(context, this.profiler)); diff --git a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexFilterController.java b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexFilterController.java index beb9127aa..358751398 100644 --- a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexFilterController.java +++ b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/discrete/DiscreteVertexFilterController.java @@ -31,7 +31,7 @@ import com.yangdb.fuse.unipop.controller.promise.appender.SizeSearchAppender; import com.yangdb.fuse.unipop.controller.search.SearchBuilder; import com.yangdb.fuse.unipop.controller.search.SearchOrderProviderFactory; -import com.yangdb.fuse.unipop.converter.SearchHitLivePageIterable; +import com.yangdb.fuse.unipop.converter.SearchHitScrollIterable; import com.yangdb.fuse.unipop.predicates.SelectP; import com.yangdb.fuse.unipop.promise.TraversalConstraint; import com.yangdb.fuse.unipop.schemaProviders.GraphElementSchemaProvider; @@ -131,12 +131,14 @@ private Iterator filterVertices( SearchRequestBuilder searchRequest = searchBuilder.build(client, true); - SearchHitLivePageIterable searchHits = new SearchHitLivePageIterable( + SearchHitScrollIterable searchHits = new SearchHitScrollIterable( client, searchRequest, orderProviderFactory.build(context), searchBuilder.getLimit(), - searchBuilder.getScrollSize()); + searchBuilder.getScrollSize(), + searchBuilder.getScrollTime() + ); ElementConverter converter = new DiscreteVertexFilterConverter(context); diff --git a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseElementVertexController.java b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseElementVertexController.java index 671275594..89c7a26d1 100644 --- a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseElementVertexController.java +++ b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseElementVertexController.java @@ -34,7 +34,7 @@ import com.yangdb.fuse.unipop.controller.search.SearchBuilder; import com.yangdb.fuse.unipop.controller.search.SearchOrderProviderFactory; import com.yangdb.fuse.unipop.controller.utils.CollectionUtil; -import com.yangdb.fuse.unipop.converter.SearchHitLivePageIterable; +import com.yangdb.fuse.unipop.converter.SearchHitScrollIterable; import com.yangdb.fuse.unipop.predicates.SelectP; import com.yangdb.fuse.unipop.promise.Constraint; import com.yangdb.fuse.unipop.promise.Promise; @@ -185,12 +185,14 @@ private Iterator queryPromiseVertices( //build SearchRequestBuilder searchRequest = searchBuilder.build(client, false); - SearchHitLivePageIterable searchHits = new SearchHitLivePageIterable( + SearchHitScrollIterable searchHits = new SearchHitScrollIterable( client, searchRequest, orderProviderFactory.build(context), searchBuilder.getLimit(), - searchBuilder.getScrollSize()); + searchBuilder.getScrollSize(), + searchBuilder.getScrollTime() + ); return convert(searchHits, new SearchHitPromiseVertexConverter(graph)); } diff --git a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseVertexFilterController.java b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseVertexFilterController.java index 275c22bfe..7752db1dc 100644 --- a/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseVertexFilterController.java +++ b/fuse-dv/fuse-dv-unipop/src/main/java/com/yangdb/fuse/unipop/controller/promise/PromiseVertexFilterController.java @@ -35,7 +35,7 @@ import com.yangdb.fuse.unipop.controller.promise.converter.SearchHitPromiseFilterEdgeConverter; import com.yangdb.fuse.unipop.controller.search.SearchBuilder; import com.yangdb.fuse.unipop.controller.search.SearchOrderProviderFactory; -import com.yangdb.fuse.unipop.converter.SearchHitLivePageIterable; +import com.yangdb.fuse.unipop.converter.SearchHitScrollIterable; import com.yangdb.fuse.unipop.predicates.SelectP; import com.yangdb.fuse.unipop.promise.TraversalConstraint; import com.yangdb.fuse.unipop.schemaProviders.GraphElementSchemaProvider; @@ -136,12 +136,14 @@ private Iterator filterPromiseVertices( SearchRequestBuilder searchRequest = searchBuilder.build(client, true).setSize(0); - SearchHitLivePageIterable searchHits = new SearchHitLivePageIterable( + SearchHitScrollIterable searchHits = new SearchHitScrollIterable( client, searchRequest, orderProviderFactory.build(context), searchBuilder.getLimit(), - searchBuilder.getScrollSize()); + searchBuilder.getScrollSize(), + searchBuilder.getScrollTime() + ); ElementConverter converter = new SearchHitPromiseFilterEdgeConverter(graph); return Stream.ofAll(searchHits) diff --git a/fuse-service/src/main/java/com/yangdb/fuse/services/appRegistrars/QueryControllerRegistrar.java b/fuse-service/src/main/java/com/yangdb/fuse/services/appRegistrars/QueryControllerRegistrar.java index 5966d9d8f..b67685c46 100644 --- a/fuse-service/src/main/java/com/yangdb/fuse/services/appRegistrars/QueryControllerRegistrar.java +++ b/fuse-service/src/main/java/com/yangdb/fuse/services/appRegistrars/QueryControllerRegistrar.java @@ -35,11 +35,11 @@ import com.yangdb.fuse.model.query.Query; import com.yangdb.fuse.model.resourceInfo.QueryResourceInfo; import com.yangdb.fuse.model.transport.*; +import com.yangdb.fuse.model.transport.cursor.LogicalGraphCursorRequest; import com.yangdb.fuse.model.validation.ValidationResult; import com.yangdb.fuse.services.controllers.QueryController; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.jooby.*; -import org.jooby.Response; import org.jooby.apitool.ApiTool; import java.util.HashMap; @@ -53,6 +53,12 @@ import static org.jooby.Status.OK; public class QueryControllerRegistrar extends AppControllerRegistrarBase { + /** + * todo get this from application.conf + */ + public static final int TIMEOUT = 1000 * 60 * 10; + public static final int PAGE_SIZE = 1000; + //region Constructors public QueryControllerRegistrar() { super(QueryController.class); @@ -104,7 +110,7 @@ public void register(Jooby app, AppUrlSupplier appUrlSupplier) { app.post(appUrlSupplier.queryStoreUrl() + "/call",req -> API.call(app,req,this.getController(app))); /** call a query */ - app.get(appUrlSupplier.resourceUrl(":queryId") + "/nextPageData", + app.get(appUrlSupplier.resourceUrl(":queryId",":cursorId") + "/nextPageData" , req -> API.nextPage(app,req,this)); /** get the query info */ @@ -209,7 +215,7 @@ public static Result postCypher(Jooby app, final Request req, QueryController co req.set(PlanTraceOptions.class, createQueryRequest.getPlanTraceOptions()); final long maxExecTime = createQueryRequest.getCreateCursorRequest() != null ? createQueryRequest.getCreateCursorRequest().getMaxExecutionTime() : 0; - req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, 1000 * 60 * 10))); + req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, TIMEOUT))); ContentResponse response = createQueryRequest.getCreateCursorRequest() == null ? controller.create(createQueryRequest) : @@ -260,7 +266,7 @@ public static Result postV1(Jooby app, final Request req, QueryController contro req.set(PlanTraceOptions.class, createQueryRequest.getPlanTraceOptions()); final long maxExecTime = createQueryRequest.getCreateCursorRequest() != null ? createQueryRequest.getCreateCursorRequest().getMaxExecutionTime() : 0; - req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, 1000 * 60 * 10))); + req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, TIMEOUT))); ContentResponse response = createQueryRequest.getCreateCursorRequest() == null ? controller.create(createQueryRequest) : @@ -274,9 +280,12 @@ public static Result runV1(Jooby app, final Request req, QueryController control Query query = req.body(Query.class); req.set(Query.class, query); - req.set(ExecutionScope.class, new ExecutionScope(1000 * 60 * 10)); + req.set(ExecutionScope.class, new ExecutionScope(TIMEOUT)); - ContentResponse response = controller.run(query); + ContentResponse response = controller.run(query, + req.param("pageSize").isSet() ? req.param("pageSize").intValue() : PAGE_SIZE, + req.param("cursorType").isSet() ? req.param("cursorType").value() : LogicalGraphCursorRequest.CursorType + ); return Results.with(response, response.status()); } @@ -286,7 +295,7 @@ public static Result runCypher(Jooby app, final Request req, QueryController con String query = req.param("cypher").value(); String ontology = req.param("ontology").value(); - req.set(ExecutionScope.class, new ExecutionScope(1000 * 60 * 10)); + req.set(ExecutionScope.class, new ExecutionScope(TIMEOUT)); ContentResponse response = controller.run(query,ontology); @@ -302,7 +311,7 @@ public static Result call(Jooby app, Request req, QueryController controller) th req.set(PlanTraceOptions.class, callQueryRequest.getPlanTraceOptions()); final long maxExecTime = callQueryRequest.getCreateCursorRequest() != null ? callQueryRequest.getCreateCursorRequest().getMaxExecutionTime() : 0; - req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, 1000 * 60 * 10))); + req.set(ExecutionScope.class, new ExecutionScope(Math.max(maxExecTime, TIMEOUT))); ContentResponse response = controller.callAndFetch(callQueryRequest); // return with(req,response); diff --git a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/CursorController.java b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/CursorController.java index 43f129555..5ae2829d9 100644 --- a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/CursorController.java +++ b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/CursorController.java @@ -25,13 +25,43 @@ import com.yangdb.fuse.model.transport.ContentResponse; import com.yangdb.fuse.model.transport.cursor.CreateCursorRequest; +import java.util.Optional; + /** * Created by lior.perry on 22/02/2017. */ public interface CursorController extends Controller{ + /** + * + * @param queryId + * @param createCursorRequest + * @return + */ ContentResponse create(String queryId, CreateCursorRequest createCursorRequest); + + /** + * + * @param queryId + * @return + */ ContentResponse getInfo(String queryId); + + /** + * + * @param queryId + * @param cursorId + * @return + */ ContentResponse getInfo(String queryId, String cursorId); + + /** + * + * @param queryId + * @param cursorId + * @return + */ ContentResponse delete(String queryId, String cursorId); + + } diff --git a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/QueryController.java b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/QueryController.java index 724e47455..932a2e60b 100644 --- a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/QueryController.java +++ b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/QueryController.java @@ -60,9 +60,11 @@ public interface QueryController extends Controller { * run a stateless query and get immediate graph results (first page only) * type may be volatile or persistent * @param query + * @param pageSize + * @param cursorType * @return */ - ContentResponse run(Query query); + ContentResponse run(Query query, int pageSize, String cursorType); /** * run a stateless query and get immediate graph results (first page only) diff --git a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/StandardQueryController.java b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/StandardQueryController.java index 2b9271154..4eca6bb5f 100644 --- a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/StandardQueryController.java +++ b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/StandardQueryController.java @@ -84,9 +84,9 @@ public ContentResponse create(CreateJsonQueryRequest request) } @Override - public ContentResponse run(Query query) { + public ContentResponse run(Query query, int pageSize, String cursorType) { return Builder.builder(CREATED, SERVER_ERROR ) - .data(driver().run(query)) + .data(driver().run(query,pageSize,cursorType )) .successPredicate(objectContentResponse -> true) .compose(); diff --git a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/logging/LoggingQueryController.java b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/logging/LoggingQueryController.java index 1cbe722a5..8cbf59db7 100644 --- a/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/logging/LoggingQueryController.java +++ b/fuse-service/src/main/java/com/yangdb/fuse/services/controllers/logging/LoggingQueryController.java @@ -114,7 +114,7 @@ public ContentResponse create(CreateJsonQueryRequest request) } @Override - public ContentResponse run(Query query) { + public ContentResponse run(Query query, int pageSize, String cursorType) { return new LoggingSyncMethodDecorator>( this.logger, this.metricRegistry, @@ -127,7 +127,7 @@ public ContentResponse run(Query query) { new LogMessage.Impl(this.logger, debug, "query: {}", Sequence.incr(), LogType.of(log), createAndFetch) .with(this.queryDescriptor.describe(query)).log(); } - return this.controller.run(query); + return this.controller.run(query, pageSize, cursorType); }, this.resultHandler()); } diff --git a/fuse-service/src/main/resources/public/assets/swagger/swagger.json b/fuse-service/src/main/resources/public/assets/swagger/swagger.json index f3af23f0b..50294cb9b 100644 --- a/fuse-service/src/main/resources/public/assets/swagger/swagger.json +++ b/fuse-service/src/main/resources/public/assets/swagger/swagger.json @@ -327,7 +327,7 @@ } } }, - "/query/v1/run": { + "/query/v1/run?pageSize={pageSize};cursorType={cursorType}": { "post": { "tags": [ "query" @@ -335,6 +335,20 @@ "summary": "submit & run V1 query directly ", "description": "submit & run a query to the engine", "parameters": [ + { + "name": "pageSize", + "in": "query", + "description": "page size", + "required": true, + "type": "integer" + }, + { + "name": "cursorType", + "in": "query", + "description": "cursorType", + "required": true, + "type": "string" + }, { "in": "body", "name": "", @@ -644,6 +658,88 @@ } } }, + "/query/{queryId}/cursor/{cursorId}/nextPageData?pageSize={pageSize};deletePage={deletePage}": { + "get": { + "tags": [ + "data" + ], + "summary": "Fetch Next Page data ", + "description": "Fetch Next Page data with given size ", + "parameters": [ + { + "name": "queryId", + "in": "path", + "description": "query ID.", + "required": true, + "type": "string" + }, + { + "name": "cursorId", + "in": "path", + "description": "cursor ID.", + "required": true, + "type": "string" + }, + { + "name": "pageSize", + "in": "query", + "description": "page size.", + "required": true, + "type": "integer" + }, + { + "name": "deletePage", + "in": "query", + "description": "deletePage flag.", + "required": true, + "type": "boolean" + } + ], + "responses": { + "200": { + "description": "Returns 200 with first page of data or 404" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "page" + ], + "summary": "Deletes page data", + "description": "Deletes page data by ID.", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "query ID.", + "required": true, + "type": "string" + }, + { + "name": "cursorId", + "in": "path", + "description": "cursor ID.", + "required": true, + "type": "string" + }, + { + "name": "pageId", + "in": "path", + "description": "page ID.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "A 204" + } + } + } + }, "/query/{id}/cursor/{cursorId}/page/{pageId}/format/{format}/data": { "get": { "tags": [ diff --git a/pom.xml b/pom.xml index cdc2b2919..28f114cbd 100644 --- a/pom.xml +++ b/pom.xml @@ -187,6 +187,8 @@ 1.6.2 + + 0.9.11 @@ -286,6 +288,13 @@ ${jolokia} + + + org.reflections + reflections + ${reflection} + + org.locationtech.jts diff --git a/unipop-core/pom.xml b/unipop-core/pom.xml index 46dcf2769..2582e706d 100644 --- a/unipop-core/pom.xml +++ b/unipop-core/pom.xml @@ -20,7 +20,6 @@ org.apache.tinkerpop gremlin-core - ${tinkerpop.version} org.apache.tinkerpop @@ -45,7 +44,6 @@ org.apache.commons commons-collections4 - 4.0 org.json @@ -55,17 +53,14 @@ org.reflections reflections - 0.9.10 io.javaslang javaslang - 2.0.4 org.jooq jool - 0.9.12 junit