use of com.alibaba.maxgraph.sdkcommon.graph.ElementId in project GraphScope by alibaba.
the class RemoteRpcConnector method queryVertices.
public void queryVertices(Map<Integer, Map<ElementId, Integer>> classified, GraphSchema schema, TinkerMaxGraph graph, Context context, int batchSize, List<Object> resultList, boolean vertexCacheFlag, RpcProcessorType rpcProcessorType, Map<CompositeId, Map<String, Object>> existPropMap) {
List<RpcAddress> remoteAddressList = addressFetcher.getAddressList();
if (classified.size() > remoteAddressList.size()) {
throw new IllegalArgumentException("classified=>" + classified.keySet() + " count > remote address list=>" + remoteAddressList.toString());
}
int classifiedCount = classified.size();
CountDownLatch latch = new CountDownLatch(classifiedCount);
ExceptionHolder exceptionHolder = new ExceptionHolder();
List<RemoteRpcProcessor> remoteRpcProcessorList = Lists.newArrayListWithCapacity(classifiedCount);
for (Map.Entry<Integer, Map<ElementId, Integer>> entry : classified.entrySet()) {
if (entry.getKey() < 0) {
throw new RuntimeException("Invalid key in " + classified + " when get detail of vertex");
}
RpcAddress rpcAddress = remoteAddressList.get(entry.getKey());
LOG.info("Get rpc address " + rpcAddress + " for store id " + entry.getKey());
try {
ManagedChannel managedChannel = channels.get(rpcAddress);
GremlinServiceGrpc.GremlinServiceStub gremlinServiceStub = GremlinServiceGrpc.newStub(managedChannel);
GremlinQuery.VertexRequest.Builder reqBuilder = GremlinQuery.VertexRequest.newBuilder();
Map<ElementId, Integer> vertexCountList = entry.getValue();
for (ElementId elementId : vertexCountList.keySet()) {
reqBuilder.addIds(GremlinQuery.VertexId.newBuilder().setId(elementId.id()).setTypeId(elementId.typeId()).build());
}
RemoteRpcProcessor remoteRpcProcessor = createRemoteRpcProcessor(rpcProcessorType, context, batchSize);
remoteRpcProcessorList.add(remoteRpcProcessor);
VertexStreamObserver vertexStreamObserver = new VertexStreamObserver(remoteRpcProcessor, schema, graph, exceptionHolder, latch, vertexCountList, vertexCacheFlag, existPropMap);
gremlinServiceStub.getVertexs(reqBuilder.build(), vertexStreamObserver);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
try {
if (!latch.await(rpcConfig.getQueryTimeoutSec(), TimeUnit.SECONDS)) {
throw new RuntimeException("Wait query vertex complete time out");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (exceptionHolder.getException() != null) {
LOG.error("query vertex from store service fail", exceptionHolder.getException());
throw new RuntimeException(exceptionHolder.getException());
}
if (null != resultList) {
for (RemoteRpcProcessor remoteRpcProcessor : remoteRpcProcessorList) {
resultList.addAll(remoteRpcProcessor.getResultList());
}
}
}
use of com.alibaba.maxgraph.sdkcommon.graph.ElementId in project GraphScope by alibaba.
the class GremlinResultTransform method parseResultValue.
private Object parseResultValue(QueryResult queryResult, GraphSchema schema, Graph graph, Map<Integer, String> labelIndexNameList, Context context, int batchSize, String queryId) {
if (queryResult instanceof VertexPropertyResult || queryResult instanceof PropertyResult) {
return queryResult;
} else if (queryResult instanceof MapValueResult) {
Map<Object, Object> resultMap = Maps.newLinkedHashMap();
for (Map.Entry<QueryResult, QueryResult> entry : ((MapValueResult) queryResult).getValueMap().entrySet()) {
resultMap.put(parseResultValue(entry.getKey(), schema, graph, labelIndexNameList, context, batchSize, queryId), parseResultValue(entry.getValue(), schema, graph, labelIndexNameList, context, batchSize, queryId));
}
return resultMap;
} else if (queryResult instanceof EdgeResult) {
return DetachedFactory.detach((Edge) queryResult, true);
} else if (queryResult instanceof ListResult) {
List<QueryResult> resultList = ((ListResult) queryResult).getResultList();
if (resultList.isEmpty()) {
return Lists.newArrayList();
}
if (resultList.get(0) instanceof PathValueResult) {
Path path = MutablePath.make();
resultList.forEach(v -> {
PathValueResult pathValueResult = PathValueResult.class.cast(v);
Set<String> labelNameList = Sets.newHashSet();
pathValueResult.getLabelIdList().forEach(labelId -> labelNameList.add(labelIndexNameList.get(labelId)));
path.extend(parseResultValue(pathValueResult.getValue(), schema, graph, labelIndexNameList, context, batchSize, queryId), labelNameList);
});
return DetachedFactory.detach(path, true);
} else {
List<Object> listValue = Lists.newArrayList();
resultList.forEach(v -> listValue.add(parseResultValue(v, schema, graph, labelIndexNameList, context, batchSize, queryId)));
return listValue;
}
} else if (queryResult instanceof EntryValueResult) {
Map<Object, Object> mapValue = Maps.newHashMap();
mapValue.put(parseResultValue(((EntryValueResult) queryResult).getKey(), schema, graph, labelIndexNameList, context, batchSize, queryId), parseResultValue(((EntryValueResult) queryResult).getValue(), schema, graph, labelIndexNameList, context, batchSize, queryId));
return mapValue.entrySet().iterator().next();
} else if (queryResult instanceof PropertyValueResult) {
return ((PropertyValueResult) queryResult).getValue();
} else if (queryResult instanceof VertexResult) {
VertexResult vertexResult = (VertexResult) queryResult;
CompositeId compositeId = CompositeId.class.cast(vertexResult.id());
org.apache.tinkerpop.gremlin.structure.Vertex cachedVertex = vertexCache.getIfPresent(compositeId);
if (null == cachedVertex) {
List<Object> resultList = Lists.newArrayList();
Map<ElementId, Integer> elementIdIntegerMap = Maps.newHashMap();
elementIdIntegerMap.put(compositeId, 1);
Map<CompositeId, Map<String, Object>> existPropMap = Maps.newHashMap();
extractExistProp(existPropMap, vertexResult, compositeId);
Map<Integer, Set<ElementId>> storeVertexList = Maps.newHashMap();
storeVertexList.put(vertexResult.getStoreId(), Sets.newHashSet(compositeId));
queryVertices(schema, context, batchSize, resultList, elementIdIntegerMap, storeVertexList, existPropMap, RpcProcessorType.MEMORY, queryId);
cachedVertex = org.apache.tinkerpop.gremlin.structure.Vertex.class.cast(resultList.get(0));
}
return cachedVertex;
} else {
return queryResult;
}
}
use of com.alibaba.maxgraph.sdkcommon.graph.ElementId in project GraphScope by alibaba.
the class VertexStreamObserver method onCompleted.
@Override
public void onCompleted() {
if (!vertexCountList.isEmpty()) {
for (Map.Entry<ElementId, Integer> entry : vertexCountList.entrySet()) {
ElementId elementId = entry.getKey();
MxVertex vertex = new MxVertex(new Vertex(elementId, schema.getElement(elementId.typeId()).getLabel(), Maps.newHashMap(), this.graph.getBaseGraph()), this.graph);
if (vertexCacheFlag) {
vertexCache.put(elementId, vertex);
}
for (int i = 0; i < entry.getValue(); i++) {
resultProcessor.process(vertex);
}
}
}
resultProcessor.finish();
latch.countDown();
}
Aggregations