javeme commented on code in PR #2262:
URL: 
https://github.com/apache/incubator-hugegraph/pull/2262#discussion_r1292183556


##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KneighborAPI.java:
##########
@@ -111,15 +123,18 @@ public String post(@Context GraphManager manager,
         E.checkArgument(request.step != null,
                         "The steps of request can't be null");
         if (request.countOnly) {
-            E.checkArgument(!request.withVertex && !request.withPath,
-                            "Can't return vertex or path when count only");
+            E.checkArgument(!request.withVertex && !request.withPath && 
!request.withEdge,
+                            "Can't return vertex or path or edge when count 
only");

Review Comment:
   `Can't return vertex, edge or path...`



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/FusiformSimilarityAPI.java:
##########
@@ -94,28 +95,38 @@ public String post(@Context GraphManager manager,
                   request.minNeighbors, request.alpha, request.minSimilars,
                   request.groupProperty, request.minGroups);
 
+        ApiMeasurer measure = new ApiMeasurer();
         HugeGraph g = graph(manager, graph);
         Iterator<Vertex> sources = request.sources.vertices(g);
         E.checkArgument(sources != null && sources.hasNext(),
                         "The source vertices can't be empty");
 
         FusiformSimilarityTraverser traverser =
-                                    new FusiformSimilarityTraverser(g);
+                new FusiformSimilarityTraverser(g);

Review Comment:
   seems one line is ok



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/SameNeighborsAPI.java:
##########
@@ -77,6 +89,81 @@ public String get(@Context GraphManager manager,
         SameNeighborTraverser traverser = new SameNeighborTraverser(g);
         Set<Id> neighbors = traverser.sameNeighbors(sourceId, targetId, dir,
                                                     edgeLabel, maxDegree, 
limit);
-        return manager.serializer(g).writeList("same_neighbors", neighbors);
+
+        measure.addIterCount(traverser.vertexIterCounter.get(),
+                             traverser.edgeIterCounter.get());
+
+        return manager.serializer(g, measure.measures())
+                      .writeList("same_neighbors", neighbors);
+    }
+
+    @POST
+    @Timed
+    @Produces(APPLICATION_JSON_WITH_CHARSET)
+    public String sameNeighbors(@Context GraphManager manager,
+                                @PathParam("graph") String graph,
+                                Request request) {
+        LOG.debug("Graph [{}] get same neighbors among batch, '{}'", graph, 
request.toString());
+
+        ApiMeasurer measure = new ApiMeasurer();
+
+        Directions dir = 
Directions.convert(EdgeAPI.parseDirection(request.direction));
+        HugeGraph g = graph(manager, graph);
+        SameNeighborTraverser traverser = new SameNeighborTraverser(g);
+
+        List<Object> vertexList = request.vertexList;
+        E.checkArgument(vertexList.size() >= 2, "vertex_list size can't " +
+                                                "be less than 2");
+
+        List<Id> vertexIds = new ArrayList<>();
+        for (Object obj : vertexList) {
+            vertexIds.add(HugeVertex.getIdValue(obj));
+        }
+
+        Set<Id> neighbors = traverser.sameNeighbors(vertexIds, dir, 
request.labels,
+                                                    request.maxDegree, 
request.limit);
+        measure.addIterCount(traverser.vertexIterCounter.get(),
+                             traverser.edgeIterCounter.get());
+
+        Iterator<?> iterVertex;
+        Set<Id> ids = new HashSet<>(neighbors);
+        ids.addAll(vertexIds);
+        if (request.withVertex && !ids.isEmpty()) {
+            iterVertex = g.vertices(ids.toArray());
+        } else {
+            iterVertex = ids.iterator();
+        }
+        return manager.serializer(g, measure.measures())
+                      .writeMap(ImmutableMap.of("same_neighbors", neighbors,
+                                                "vertices", iterVertex));
+    }
+
+    private static class Request {
+        @JsonProperty("max_degree")
+        public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
+        @JsonProperty("limit")
+        public int limit = Integer.parseInt(DEFAULT_ELEMENTS_LIMIT);
+        @JsonProperty("vertex_list")
+        private List<Object> vertexList;
+        @JsonProperty("direction")
+        private String direction;
+        @JsonProperty("labels")
+        private List<String> labels;
+        @JsonProperty("with_vertex")
+        private boolean withVertex = false;
+
+        @Override
+        public String toString() {

Review Comment:
   the way of this method implement is expected to keep the same style as other 
Request class



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/records/SingleWayMultiPathsRecords.java:
##########
@@ -44,7 +45,7 @@ public abstract class SingleWayMultiPathsRecords extends 
AbstractRecords {
     private final int sourceCode;
     private final boolean nearest;
     private final IntSet accessedVertices;
-
+    private final HugeTraverser.EdgeRecord edgeRecord;

Review Comment:
   prefer to rename to edgeResults



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/CustomizePathsTraverser.java:
##########
@@ -22,25 +22,54 @@
 import java.util.List;
 import java.util.Map;
 
-import jakarta.ws.rs.core.MultivaluedMap;
-
 import org.apache.hugegraph.HugeGraph;
 import org.apache.hugegraph.backend.id.Id;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
 import org.apache.hugegraph.structure.HugeEdge;
 import org.apache.hugegraph.structure.HugeVertex;
 import org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep;
 import org.apache.hugegraph.util.CollectionUtil;
 import org.apache.hugegraph.util.E;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import jakarta.ws.rs.core.MultivaluedMap;
+
 public class CustomizePathsTraverser extends HugeTraverser {
+    private final EdgeRecord edgeRecord;

Review Comment:
   expect a blank line, and prefer to rename to edgeResults.
   



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/CustomizePathsTraverser.java:
##########
@@ -133,36 +171,13 @@ public List<Path> customizedPaths(Iterator<Vertex> 
vertices,
         return paths;
     }
 
-    public static List<Path> topNPath(List<Path> paths,
-                                      boolean incr, long limit) {
-        paths.sort((p1, p2) -> {
-            WeightPath wp1 = (WeightPath) p1;
-            WeightPath wp2 = (WeightPath) p2;
-            int result = Double.compare(wp1.totalWeight(), wp2.totalWeight());
-            return incr ? result : -result;
-        });
-
-        if (limit == NO_LIMIT || paths.size() <= limit) {
-            return paths;
-        }
-        return paths.subList(0, (int) limit);
-    }
-
-    private static List<Node> sample(List<Node> nodes, long sample) {
-        if (nodes.size() <= sample) {
-            return nodes;
-        }
-        List<Node> result = newList((int) sample);
-        int size = nodes.size();
-        for (int random : CollectionUtil.randomSet(0, size, (int) sample)) {
-            result.add(nodes.get(random));
-        }
-        return result;
+    public EdgeRecord getEdgeRecord() {

Review Comment:
   ditto



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java:
##########
@@ -224,8 +220,7 @@ protected void addCount(String key, long value) {
             if (current == null) {
                 measures.put(key, new MutableLong(value));
             } else if (current instanceof MutableLong) {
-                MutableLong currentMutableLong = (MutableLong) current;
-                currentMutableLong.add(value);
+                ((MutableLong) measures.computeIfAbsent(key, 
MutableLong::new)).add(value);
             } else if (current instanceof Long) {

Review Comment:
   add else branch then throw an exception



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/CustomizedCrosspointsTraverser.java:
##########
@@ -24,26 +24,82 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import jakarta.ws.rs.core.MultivaluedMap;
-
 import org.apache.hugegraph.HugeGraph;
 import org.apache.hugegraph.backend.id.Id;
+import org.apache.hugegraph.structure.HugeEdge;
+import org.apache.hugegraph.structure.HugeVertex;
 import org.apache.hugegraph.traversal.algorithm.steps.EdgeStep;
 import org.apache.hugegraph.type.define.Directions;
+import org.apache.hugegraph.util.CollectionUtil;
+import org.apache.hugegraph.util.E;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
-import org.apache.hugegraph.structure.HugeEdge;
-import org.apache.hugegraph.structure.HugeVertex;
-import org.apache.hugegraph.util.CollectionUtil;
-import org.apache.hugegraph.util.E;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import jakarta.ws.rs.core.MultivaluedMap;
+
 public class CustomizedCrosspointsTraverser extends HugeTraverser {
 
+    private final EdgeRecord edgeRecord;

Review Comment:
   ditto



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/TemplatePathsAPI.java:
##########
@@ -74,50 +90,50 @@ public String post(@Context GraphManager manager,
 
         LOG.debug("Graph [{}] get template paths from source vertices '{}', " +
                   "target vertices '{}', with steps '{}', " +
-                  "capacity '{}', limit '{}' and with_vertex '{}'",
+                  "capacity '{}', limit '{}', with vertex '{}' and with edge 
'{}'",

Review Comment:
   ditto



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/CustomizedPathsAPI.java:
##########
@@ -30,40 +30,50 @@
 import java.util.Map;
 import java.util.Set;
 
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.inject.Singleton;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.Context;
-
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.hugegraph.core.GraphManager;
-import org.slf4j.Logger;
-
 import org.apache.hugegraph.HugeGraph;
 import org.apache.hugegraph.api.API;
 import org.apache.hugegraph.backend.id.Id;
-import org.apache.hugegraph.backend.query.QueryResults;
+import org.apache.hugegraph.core.GraphManager;
 import org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser;
 import org.apache.hugegraph.traversal.algorithm.HugeTraverser;
 import org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep;
 import org.apache.hugegraph.type.define.Directions;
 import org.apache.hugegraph.util.E;
 import org.apache.hugegraph.util.Log;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.slf4j.Logger;
+
 import com.codahale.metrics.annotation.Timed;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.Context;
+
 @Path("graphs/{graph}/traversers/customizedpaths")
 @Singleton
 @Tag(name = "CustomizedPathsAPI")
 public class CustomizedPathsAPI extends API {
 
     private static final Logger LOG = Log.logger(CustomizedPathsAPI.class);
 
+    private static List<WeightedEdgeStep> step(HugeGraph graph,
+                                               PathRequest req) {

Review Comment:
   also keep request name style?



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/PathsAPI.java:
##########
@@ -120,35 +125,51 @@ public String post(@Context GraphManager manager,
 
         LOG.debug("Graph [{}] get paths from source vertices '{}', target " +
                   "vertices '{}', with step '{}', max depth '{}', " +
-                  "capacity '{}', limit '{}' and with_vertex '{}'",
+                  "capacity '{}', limit '{}', with vertex '{}' and with edge 
'{}'",

Review Comment:
   keep the unified style `with_vertex`, the same to other places



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java:
##########
@@ -116,32 +129,35 @@ public String post(@Context GraphManager manager,
         E.checkArgument(request.step != null,
                         "The steps of request can't be null");
         if (request.countOnly) {
-            E.checkArgument(!request.withVertex && !request.withPath,
-                            "Can't return vertex or path when count only");
+            E.checkArgument(!request.withVertex && !request.withPath && 
!request.withEdge,
+                            "Can't return vertex or path or edge when count 
only");

Review Comment:
   ditto, also check other places



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java:
##########
@@ -44,29 +44,25 @@
 
 public class API {
 
-    protected static final Logger LOG = Log.logger(API.class);
-
     public static final String CHARSET = "UTF-8";
-
     public static final String TEXT_PLAIN = MediaType.TEXT_PLAIN;
     public static final String APPLICATION_JSON = MediaType.APPLICATION_JSON;
     public static final String APPLICATION_JSON_WITH_CHARSET =
-                               APPLICATION_JSON + ";charset=" + CHARSET;
+            APPLICATION_JSON + ";charset=" + CHARSET;
     public static final String JSON = MediaType.APPLICATION_JSON_TYPE
-                                               .getSubtype();
-
+            .getSubtype();

Review Comment:
   can we keep the origin style



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/PathTraverser.java:
##########
@@ -52,10 +50,11 @@ public abstract class PathTraverser {
     protected Set<HugeTraverser.Path> paths;
 
     protected TraverseStrategy traverseStrategy;
+    protected HugeTraverser.EdgeRecord edgeRecord;

Review Comment:
   just import EdgeRecord to keep the same style?



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/SameNeighborsAPI.java:
##########
@@ -77,6 +89,81 @@ public String get(@Context GraphManager manager,
         SameNeighborTraverser traverser = new SameNeighborTraverser(g);
         Set<Id> neighbors = traverser.sameNeighbors(sourceId, targetId, dir,
                                                     edgeLabel, maxDegree, 
limit);
-        return manager.serializer(g).writeList("same_neighbors", neighbors);
+
+        measure.addIterCount(traverser.vertexIterCounter.get(),
+                             traverser.edgeIterCounter.get());
+
+        return manager.serializer(g, measure.measures())
+                      .writeList("same_neighbors", neighbors);
+    }
+
+    @POST
+    @Timed
+    @Produces(APPLICATION_JSON_WITH_CHARSET)
+    public String sameNeighbors(@Context GraphManager manager,
+                                @PathParam("graph") String graph,
+                                Request request) {
+        LOG.debug("Graph [{}] get same neighbors among batch, '{}'", graph, 
request.toString());
+
+        ApiMeasurer measure = new ApiMeasurer();
+
+        Directions dir = 
Directions.convert(EdgeAPI.parseDirection(request.direction));
+        HugeGraph g = graph(manager, graph);
+        SameNeighborTraverser traverser = new SameNeighborTraverser(g);
+
+        List<Object> vertexList = request.vertexList;
+        E.checkArgument(vertexList.size() >= 2, "vertex_list size can't " +
+                                                "be less than 2");
+
+        List<Id> vertexIds = new ArrayList<>();
+        for (Object obj : vertexList) {
+            vertexIds.add(HugeVertex.getIdValue(obj));
+        }
+
+        Set<Id> neighbors = traverser.sameNeighbors(vertexIds, dir, 
request.labels,
+                                                    request.maxDegree, 
request.limit);
+        measure.addIterCount(traverser.vertexIterCounter.get(),
+                             traverser.edgeIterCounter.get());
+
+        Iterator<?> iterVertex;
+        Set<Id> ids = new HashSet<>(neighbors);
+        ids.addAll(vertexIds);
+        if (request.withVertex && !ids.isEmpty()) {
+            iterVertex = g.vertices(ids.toArray());
+        } else {
+            iterVertex = ids.iterator();
+        }
+        return manager.serializer(g, measure.measures())
+                      .writeMap(ImmutableMap.of("same_neighbors", neighbors,
+                                                "vertices", iterVertex));
+    }
+
+    private static class Request {

Review Comment:
   expect a blank line



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/ShortestPathTraverser.java:
##########
@@ -126,27 +135,36 @@ public PathSet allShortestPaths(Id sourceV, Id targetV, 
Directions dir,
             checkCapacity(traverser.capacity, traverser.accessed(),
                           "shortest path");
         }
+
+        this.vertexIterCounter.addAndGet(traverser.vertexCount);
+        this.edgeIterCounter.addAndGet(traverser.record.accessed());
+
+        paths.setEdges(traverser.edgeRecord.getEdges(paths));
         return paths;
     }
 
     private class Traverser {
 
         private final ShortestPathRecords record;
+        private final EdgeRecord edgeRecord;

Review Comment:
   rename to pathResults and edgeResults



##########
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/algorithm/records/SingleWayMultiPathsRecords.java:
##########
@@ -176,6 +178,10 @@ protected final Stack<Record> records() {
         return this.records;
     }
 
+    public HugeTraverser.EdgeRecord getEdgeIdRecord() {

Review Comment:
   rename to edgeResults()?



##########
hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java:
##########
@@ -99,8 +105,15 @@ public String get(@Context GraphManager manager,
         try (KoutTraverser traverser = new KoutTraverser(g)) {
             ids = traverser.kout(sourceId, dir, edgeLabel, depth,
                                  nearest, maxDegree, capacity, limit);
+            measure.addIterCount(traverser.vertexIterCounter.get(),
+                                 traverser.edgeIterCounter.get());
+        }
+
+        if (count_only) {
+            return manager.serializer(g, 
measure.measures()).writeMap(ImmutableMap.of(

Review Comment:
   prefer to wrap line before writeMap()



##########
hugegraph-api/src/main/java/org/apache/hugegraph/config/ServerOptions.java:
##########
@@ -256,12 +218,24 @@ public static synchronized ServerOptions instance() {
                     null,
                     "hugegraph"
             );
-
     public static final ConfigOption<Boolean> ENABLE_DYNAMIC_CREATE_DROP =
             new ConfigOption<>(
                     "graphs.enable_dynamic_create_drop",
                     "Whether to enable create or drop graph dynamically.",
                     disallowEmpty(),
                     true
             );
+    private static volatile ServerOptions instance;
+
+    private ServerOptions() {
+        super();
+    }
+
+    public static synchronized ServerOptions instance() {
+        if (instance == null) {
+            instance = new ServerOptions();
+            instance.registerOptions();
+        }
+        return instance;
+    }

Review Comment:
   prefer to don't update style of this file



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to