use of com.alibaba.maxgraph.compiler.dfs.DfsTraversal in project GraphScope by alibaba.
the class MixedTraversalOpProcessor method doProcessTraversal.
private Long doProcessTraversal(Context context, Object object, Graph graph, long timeout, String queryId, Stopwatch timer) {
Pair<GraphSchema, Long> snapshotSchema;
GraphSchema schema;
Long resultNum = 0L;
if (object instanceof GraphTraversal.Admin || object instanceof DfsTraversal) {
QueryStatus queryStatus;
GraphTraversal.Admin traversal = (object instanceof GraphTraversal.Admin) ? GraphTraversal.Admin.class.cast(object) : (DfsTraversal.class.cast(object)).getTraversal();
String queryString = traversal.toString();
logger.info("Receive traversal query=>" + queryString);
if (!traversal.isLocked()) {
traversal.getStrategies().removeStrategies(ProfileStrategy.class, MxGraphStepStrategy.class, FilterRankingStrategy.class);
}
traversal.applyStrategies();
NettyVertexRpcProcessor nettyVertexRpcProcessor;
QueryFlowManager queryFlowManager;
// 保证一查看到snapshotId就开始维护query_status
synchronized (queryCallbackManager) {
snapshotSchema = schemaFetcher.getSchemaSnapshotPair();
queryStatus = queryCallbackManager.beforeExecution(snapshotSchema.getRight());
}
schema = snapshotSchema.getLeft();
LogicalPlanOptimizer planOptimizer = new LogicalPlanOptimizer(new OptimizeConfig(), this.globalPullGraphFlag, schema, snapshotSchema.getRight(), this.lambdaEnableFlag);
final int resultIterationBatchSize = (Integer) context.getRequestMessage().optionalArgs(Tokens.ARGS_BATCH_SIZE).orElse(this.resultIterationBatchSize);
nettyVertexRpcProcessor = new NettyTraverserVertexProcessor(context, resultIterationBatchSize, false);
try {
queryFlowManager = (object instanceof GraphTraversal.Admin) ? planOptimizer.build(GraphTraversal.class.cast(traversal)) : planOptimizer.build(DfsTraversal.class.cast(object));
} catch (IllegalArgumentException iae) {
if (iae.getMessage().contains("MaxGraphIoStep")) {
logger.info("do maxgraph io step");
while (traversal.hasNext()) {
logger.info("maxgraph io hasNext");
}
nettyVertexRpcProcessor.finish(ResponseStatusCode.SUCCESS);
return 0L;
}
throw iae;
}
try {
boolean isLambdaExisted = TraversalHelper.anyStepRecursively(s -> s instanceof LambdaHolder, (Traversal.Admin<?, ?>) traversal);
queryFlowManager.getQueryFlow().setFrontId(serverId);
if (this.lambdaEnableFlag && isLambdaExisted) {
final ObjectMapper mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).addCustomModule(GraphSONXModuleV3d0.build().create(false)).create().createMapper();
Bytecode bytecode = (Bytecode) context.getRequestMessage().getArgs().get(Tokens.ARGS_GREMLIN);
byte[] bytecodeByte = mapper.writeValueAsBytes(bytecode);
queryFlowManager.getQueryFlow().setLambdaExisted(isLambdaExisted).setBytecode(ByteString.copyFrom(bytecodeByte));
}
GremlinResultTransform gremlinResultTransform = new GremlinResultTransform(remoteRpcConnector, nettyVertexRpcProcessor, this.graph, queryFlowManager.getResultValueType(), vertexCacheFlag);
NettyResultProcessor nettyResultProcessor = new NettyResultProcessor(queryId, traversal.toString(), context, new ExecuteConfig().getBatchQuerySize(), resultIterationBatchSize, false);
nettyResultProcessor.setSchema(schema);
nettyResultProcessor.setResultTransform(gremlinResultTransform);
nettyResultProcessor.setLabelIndexNameList(queryFlowManager.getTreeNodeLabelManager().getUserIndexLabelList());
TimelyQuery timelyQuery = new TimelyQuery(queryFlowManager, nettyResultProcessor, this.graph);
Logging.query(this.graphName, FRONTEND, this.serverId, queryId, QueryType.EXECUTE, QueryEvent.PLAN_GENERATED, timer.elapsed(TimeUnit.NANOSECONDS), null, null, "");
timelyExecutor.execute(timelyQuery, schema, timeout, queryId);
resultNum = nettyResultProcessor.total();
} catch (JsonProcessingException e) {
e.printStackTrace();
} finally {
queryCallbackManager.afterExecution(queryStatus);
}
} else {
throw new IllegalArgumentException("Not support to process=>" + object);
}
return resultNum;
}
use of com.alibaba.maxgraph.compiler.dfs.DfsTraversal in project GraphScope by alibaba.
the class MixedOpProcessor method processHttpGraphTraversal.
@Override
public List<Object> processHttpGraphTraversal(String script, Object traversal, long timeout, FullHttpRequest request) throws Exception {
if (traversal instanceof GraphTraversal || traversal instanceof DfsTraversal) {
String queryId = String.valueOf(ThreadLocalRandom.current().nextLong());
Stopwatch timer = Stopwatch.createStarted();
RemoteRpcProcessor remoteRpcProcessor = new DefaultVertexRpcProcessor();
MemoryResultProcessor resultProcessor = new MemoryResultProcessor(executeConfig.getBatchQuerySize(), resultIterationBatchSize, queryId);
processQueryTraversal(script, traversal, timeout, queryId, timer, this.httpRpcConnector, remoteRpcProcessor, resultProcessor);
return resultProcessor.getResultList();
} else {
throw new IllegalArgumentException("Not support " + script + " in http request");
}
}
use of com.alibaba.maxgraph.compiler.dfs.DfsTraversal in project GraphScope by alibaba.
the class MixedOpProcessor method doProcessGraphTraversal.
private Long doProcessGraphTraversal(String script, Context context, Object traversal, long timeout, String queryId, Stopwatch timer) throws Exception {
Long totalResultNum = 0L;
Pair<GraphSchema, Long> snapshotSchema;
GraphSchema schema;
if (traversal instanceof GraphTraversal || traversal instanceof DfsTraversal) {
final int resultIterationBatchSize = (Integer) context.getRequestMessage().optionalArgs(Tokens.ARGS_BATCH_SIZE).orElse(this.resultIterationBatchSize);
NettyVertexRpcProcessor nettyVertexRpcProcessor = new NettyVertexRpcProcessor(context, resultIterationBatchSize, false);
AbstractResultProcessor nettyResultProcessor = new NettyResultProcessor(queryId, script, context, executeConfig.getBatchQuerySize(), resultIterationBatchSize, false);
totalResultNum = processQueryTraversal(script, traversal, timeout, queryId, timer, this.remoteRpcConnector, nettyVertexRpcProcessor, nettyResultProcessor);
} else {
snapshotSchema = this.schemaFetcher.getSchemaSnapshotPair();
schema = snapshotSchema.getLeft();
if (traversal instanceof PreparedTraversal) {
throw new UnsupportedOperationException();
} else if (traversal instanceof PreparedExecuteParam) {
throw new UnsupportedOperationException();
} else if (traversal instanceof ShowProcessListQuery) {
TimelyResultProcessor nettyResultProcessor = newNettyResultProcessor(queryId, script, context, graph, schema);
timelyExecutor.showProcessList(nettyResultProcessor);
} else if (traversal instanceof CancelDataflow) {
NettyResultProcessor nettyResultProcessor = newNettyResultProcessor(queryId, script, context, graph, schema);
timelyExecutor.cancelDataflow(nettyResultProcessor, ((CancelDataflow) traversal).queryId);
} else if (traversal instanceof RecordManager) {
Object result = processRecordManager(RecordManager.class.cast(traversal));
writeResultList(context, Lists.newArrayList(result), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof EstimateRequest) {
writeResultList(context, Lists.newArrayList(processEstimateManager((EstimateRequest) traversal, timeout)), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof StatisticsRequest) {
CostDataStatistics costDataStatistics = CostDataStatistics.getInstance();
writeResultList(context, Lists.newArrayList(costDataStatistics.formatJson()), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof ShowPlanPathListRequest) {
ShowPlanPathListRequest showPlanPathListRequest = (ShowPlanPathListRequest) traversal;
writeResultList(context, Lists.newArrayList(buildCostPathList(showPlanPathListRequest.getTraversal())), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof Element) {
writeResultList(context, Lists.newArrayList((Element) traversal), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof List) {
writeResultList(context, (List) traversal, ResponseStatusCode.SUCCESS);
} else if (traversal instanceof GraphSchema) {
writeResultList(context, Lists.newArrayList(((GraphSchema) traversal).formatJson()), ResponseStatusCode.SUCCESS);
} else if (traversal instanceof String) {
writeResultList(context, Lists.newArrayList(traversal), ResponseStatusCode.SUCCESS);
} else if (traversal != null && (!(traversal instanceof String) || !StringUtils.isEmpty(traversal.toString()))) {
throw new IllegalArgumentException(traversal.toString());
}
}
return totalResultNum;
}
Aggregations