Skip to content

Commit cf2cb06

Browse files
committed
[GIE Compiler] parse gremlin result for 'elementMap'
1 parent 4e38bdb commit cf2cb06

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/integration/graph/RemoteTestGraph.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -1036,10 +1036,10 @@
10361036
// method = "g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_selectXhereX",
10371037
// test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest",
10381038
// reason = "returned label is id")
1039-
@Graph.OptOut(
1040-
method = "g_VX1X_outE_asXhereX_inV_hasXname_vadasX_selectXhereX",
1041-
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest",
1042-
reason = "returned label is id")
1039+
// @Graph.OptOut(
1040+
// method = "g_VX1X_outE_asXhereX_inV_hasXname_vadasX_selectXhereX",
1041+
// test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest",
1042+
// reason = "returned label is id")
10431043

10441044
// add more ignored tests which are out of ir range
10451045
@Graph.OptOut(
@@ -1507,6 +1507,14 @@
15071507
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest",
15081508
method = "g_EX11X",
15091509
reason = "unsupported")
1510+
@Graph.OptOut(
1511+
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ElementMapTest",
1512+
method = "g_EX11X_elementMap",
1513+
reason = "cannot get label and id for out and in vertices")
1514+
@Graph.OptOut(
1515+
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ElementMapTest",
1516+
method = "g_V_elementMap",
1517+
reason = "cannot get label and id for out and in vertices")
15101518
// @Graph.OptOut(
15111519
// test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest",
15121520
// method = "g_V_valueMapXname_ageX",

interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/result/LabelParser.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ public Object parseLabel(Object values, String tag, Object stepOrTraversal, Step
7474
Iterator<Map.Entry> valuesIterator = ((Map) values).entrySet().iterator();
7575
while (valuesIterator.hasNext()) {
7676
Map.Entry valuesEntry = valuesIterator.next();
77-
if (!(stepOrTraversal instanceof ElementMapStep)
78-
|| valuesEntry.getKey().equals(T.label.getAccessor())) {
77+
if (valuesEntry.getValue() instanceof Map) {
78+
parseLabel(valuesEntry.getValue(), tag, stepOrTraversal, parent);
79+
} else if (!(stepOrTraversal instanceof ElementMapStep)
80+
|| valuesEntry.getKey().equals(T.label)) {
7981
valuesEntry.setValue(
8082
parseLabelByType(
8183
valuesEntry.getValue(),

interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/result/ProjectResultParser.java

+18-14
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import com.alibaba.graphscope.gremlin.transform.alias.AliasManager;
2424

2525
import org.apache.tinkerpop.gremlin.process.traversal.Step;
26+
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
27+
import org.apache.tinkerpop.gremlin.structure.T;
2628

2729
import java.util.*;
28-
import java.util.stream.*;
2930

3031
// values("name") -> key: head, value: "marko"
3132
// valueMap("name") -> key: head, value: {name, "marko"}
@@ -47,7 +48,7 @@ public static ProjectResultParser create(Step step) {
4748
@Override
4849
public Object parseFrom(IrResult.Results results) {
4950
IrResult.Record record = results.getRecord();
50-
Map<String, Object> projectResult = new LinkedHashMap<>();
51+
Map<Object, Object> projectResult = new LinkedHashMap<>();
5152
record.getColumnsList()
5253
.forEach(
5354
column -> {
@@ -59,7 +60,7 @@ public Object parseFrom(IrResult.Results results) {
5960
Map tagEntry =
6061
(Map)
6162
projectResult.computeIfAbsent(
62-
tag, k1 -> new HashMap<>());
63+
tag, k1 -> new LinkedHashMap<>());
6364
tagEntry.putAll(flatMap(projectTags));
6465
} else {
6566
if (!(parseEntry instanceof EmptyValue)) {
@@ -78,8 +79,8 @@ public Object parseFrom(IrResult.Results results) {
7879
}
7980

8081
// {~label: "person", ~all: {name: "marko"}} -> {~label: "person", name: "marko"}
81-
private Map<String, Object> flatMap(Map<String, Object> map) {
82-
Map<String, Object> result = new HashMap<>();
82+
private Map<Object, Object> flatMap(Map<String, Object> map) {
83+
Map<Object, Object> result = new LinkedHashMap<>();
8384
for (Map.Entry<String, Object> entry : map.entrySet()) {
8485
Object k = entry.getKey();
8586
Object v = entry.getValue();
@@ -90,23 +91,26 @@ private Map<String, Object> flatMap(Map<String, Object> map) {
9091
String nameOrId = null;
9192
if (k instanceof List) { // valueMap("name") -> Map<["", "name"], value>
9293
nameOrId = (String) ((List) k).get(1);
93-
} else if (k
94-
instanceof
95-
String) { // valueMap() -> Map<"name",
94+
} else if (k instanceof String) { // valueMap() -> Map<"name",
9695
// value>
9796
nameOrId = (String) k;
98-
} else if (k
99-
instanceof
100-
Number) { // valueMap() -> Map<1, value>
97+
} else if (k instanceof Number) { // valueMap() -> Map<1, value>
10198
nameOrId = String.valueOf(k);
10299
}
103100
if (nameOrId == null || nameOrId.isEmpty()) {
104101
throw new GremlinResultParserException(
105-
"map value should have property"
106-
+ " key");
102+
"map value should have property" + " key");
107103
}
108104
String property = getPropertyName(nameOrId);
109-
result.put(property, Collections.singletonList(v));
105+
if (step instanceof PropertyMapStep) {
106+
result.put(property, Collections.singletonList(v));
107+
} else if (property.equals(T.id.getAccessor())) {
108+
result.put(T.id, v);
109+
} else if (property.equals(T.label.getAccessor())) {
110+
result.put(T.label, v);
111+
} else {
112+
result.put(property, v);
113+
}
110114
}
111115
}
112116
}

interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/transform/TraversalParentTransform.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ default ExprResult getSubTraversalAsExpr(ExprArg exprArg) {
9494
} else if (step instanceof IdStep) {
9595
return (new ExprResult())
9696
.addTagExpr("", Optional.of("@." + T.id.getAccessor())); // @.~id
97-
} else if (step instanceof ElementMapStep) { // elementMap(..)
97+
} else if (step instanceof ElementMapStep) { // elementMap(..)
9898
StringBuilder stringBuilder = new StringBuilder();
9999
stringBuilder.append("{");
100100
// id
@@ -105,18 +105,17 @@ default ExprResult getSubTraversalAsExpr(ExprArg exprArg) {
105105
String[] mapKeys = ((ElementMapStep) step).getPropertyKeys();
106106
if (mapKeys.length > 0) {
107107
for (int i = 0; i < mapKeys.length; ++i) {
108-
if (i > 0) {
109-
stringBuilder.append(",");
110-
}
111-
stringBuilder.append("@." + mapKeys[i]);
108+
if (i > 0) {
109+
stringBuilder.append(",");
110+
}
111+
stringBuilder.append("@." + mapKeys[i]);
112112
}
113113
} else {
114114
// elementMap() -> @.~all
115-
stringBuilder.append("@." + ArgUtils.PROPERTY_ALL);
115+
stringBuilder.append("@." + ArgUtils.PROPERTY_ALL);
116116
}
117117
stringBuilder.append("}");
118-
return (new ExprResult())
119-
.addTagExpr("", Optional.of(stringBuilder.toString()));
118+
return (new ExprResult()).addTagExpr("", Optional.of(stringBuilder.toString()));
120119
} else if (step instanceof SelectOneStep || step instanceof SelectStep) {
121120
// select('a'), select('a').by()
122121
// select('a').by('name'/values/valueMap)

0 commit comments

Comments
 (0)