Skip to content

Commit a3fdec4

Browse files
committed
Implement P.typeOf() predicate, added new GType enum, with a small set of tests.
1 parent 83b86a9 commit a3fdec4

File tree

60 files changed

+1417
-26
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1417
-26
lines changed

CHANGELOG.asciidoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ This release also includes changes from <<release-3-7-XXX, 3.7.XXX>>.
101101
* Added optional traversal cache to `GremlinLangScriptEngine`
102102
* Introduced step interfaces for all parameterizable steps
103103
* Removed auto-unfold of singleton collections from `range()`, `limit()`, and `tail()` local scope steps to improve consistency of output.
104+
* Implemented `P.typeOf()` predicate
105+
* Added `GType` enum to denote types
104106
* Renamed `MergeElementStep` to `MergeElementStep` as it is a base class to `mergeV()` and `mergeE()`.
105107
* Renamed `MergeStep` of `merge()` to `MergeElementStep` for consistency.
106108

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,10 @@ protected void notImplemented(final ParseTree ctx) {
10871087
* {@inheritDoc}
10881088
*/
10891089
@Override public T visitTraversalMethod_asNumber_traversalN(final GremlinParser.TraversalMethod_asNumber_traversalNContext ctx) { notImplemented(ctx); return null; }
1090+
/**
1091+
* {@inheritDoc}
1092+
*/
1093+
@Override public T visitTraversalMethod_asNumber_traversalGType(final GremlinParser.TraversalMethod_asNumber_traversalGTypeContext ctx) { notImplemented(ctx); return null; }
10901094
/**
10911095
* {@inheritDoc}
10921096
*/
@@ -1131,6 +1135,10 @@ protected void notImplemented(final ParseTree ctx) {
11311135
* {@inheritDoc}
11321136
*/
11331137
@Override public T visitTraversalN(GremlinParser.TraversalNContext ctx) { notImplemented(ctx); return null; }
1138+
/**
1139+
* {@inheritDoc}
1140+
*/
1141+
@Override public T visitTraversalGType(GremlinParser.TraversalGTypeContext ctx) { notImplemented(ctx); return null; }
11341142
/**
11351143
* {@inheritDoc}
11361144
*/
@@ -1163,6 +1171,10 @@ protected void notImplemented(final ParseTree ctx) {
11631171
* {@inheritDoc}
11641172
*/
11651173
@Override public T visitTraversalPredicate_neq(final GremlinParser.TraversalPredicate_neqContext ctx) { notImplemented(ctx); return null; }
1174+
/**
1175+
* {@inheritDoc}
1176+
*/
1177+
@Override public T visitTraversalPredicate_typeOf(final GremlinParser.TraversalPredicate_typeOfContext ctx) { notImplemented(ctx); return null; }
11661178
/**
11671179
* {@inheritDoc}
11681180
*/

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,11 @@ public Object visitTraversalN(final GremlinParser.TraversalNContext ctx) {
606606
return TraversalEnumParser.parseTraversalNFromContext(ctx);
607607
}
608608

609+
@Override
610+
public Object visitTraversalGType(final GremlinParser.TraversalGTypeContext ctx) {
611+
return TraversalEnumParser.parseTraversalGTypeFromContext(ctx);
612+
}
613+
609614
@Override
610615
public Object visitTraversalStrategy(final GremlinParser.TraversalStrategyContext ctx) {
611616
return antlr.traversalStrategyVisitor.visitTraversalStrategy(ctx);

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.tinkerpop.gremlin.process.traversal.N;
2323
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
2424
import org.apache.tinkerpop.gremlin.structure.Direction;
25+
import org.apache.tinkerpop.gremlin.process.traversal.GType;
2526

2627
/**
2728
* Traversal enum parser parses all the enums like (e.g. {@link Scope} in graph traversal.
@@ -76,4 +77,15 @@ public static N parseTraversalNFromContext(final GremlinParser.TraversalNContext
7677
text = text.substring(N.class.getSimpleName().length() + 1);
7778
return text.startsWith("big") ? N.valueOf(text) : N.valueOf(text + "_");
7879
}
80+
81+
/**
82+
* Parsing of {@link GType} requires some special handling as grammar allows lowercase for tokens.
83+
*/
84+
public static GType parseTraversalGTypeFromContext(final GremlinParser.TraversalGTypeContext context) {
85+
String text = context.getText();
86+
if (text.startsWith(GType.class.getSimpleName())) {
87+
text = text.substring(GType.class.getSimpleName().length() + 1);
88+
}
89+
return GType.valueOf(text.toUpperCase());
90+
}
7991
}

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,6 +2249,15 @@ public GraphTraversal visitTraversalMethod_asNumber_traversalN(final GremlinPars
22492249
TraversalEnumParser.parseTraversalNFromContext(ctx.traversalN()));
22502250
}
22512251

2252+
/**
2253+
* {@inheritDoc}
2254+
*/
2255+
@Override
2256+
public GraphTraversal visitTraversalMethod_asNumber_traversalGType(final GremlinParser.TraversalMethod_asNumber_traversalGTypeContext ctx) {
2257+
return graphTraversal.asNumber(
2258+
TraversalEnumParser.parseTraversalGTypeFromContext(ctx.traversalGType()));
2259+
}
2260+
22522261
public GraphTraversal[] getNestedTraversalList(final GremlinParser.NestedTraversalListContext ctx) {
22532262
return ctx.nestedTraversalExpr().nestedTraversal()
22542263
.stream()

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalPredicateVisitor.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
package org.apache.tinkerpop.gremlin.language.grammar;
2020

2121
import org.antlr.v4.runtime.tree.ParseTree;
22+
import org.apache.tinkerpop.gremlin.process.traversal.GType;
2223
import org.apache.tinkerpop.gremlin.process.traversal.P;
2324
import org.apache.tinkerpop.gremlin.process.traversal.TextP;
2425

2526
import java.util.Collection;
26-
import java.util.List;
27-
import java.util.Set;
2827

2928
public class TraversalPredicateVisitor extends DefaultGremlinBaseVisitor<P> {
3029

@@ -79,6 +78,20 @@ public P visitTraversalPredicate_neq(final GremlinParser.TraversalPredicate_neqC
7978
return P.neq(getSingleGenericLiteralArgument(ctx));
8079
}
8180

81+
/**
82+
* {@inheritDoc}
83+
*/
84+
@Override
85+
public P visitTraversalPredicate_typeOf(final GremlinParser.TraversalPredicate_typeOfContext ctx) {
86+
final int childIndex = ctx.getChildCount() == 6 ? 4 : 2;
87+
final Object child = ctx.getChild(childIndex);
88+
if (child instanceof GremlinParser.TraversalGTypeContext) {
89+
return P.typeOf(TraversalEnumParser.parseTraversalGTypeFromContext((GremlinParser.TraversalGTypeContext) child));
90+
} else {
91+
return P.typeOf((String) antlr.genericVisitor.visitStringLiteral((GremlinParser.StringLiteralContext) child));
92+
}
93+
}
94+
8295
/**
8396
* {@inheritDoc}
8497
*/
@@ -244,7 +257,7 @@ private Object[] getDoubleGenericLiteralArgument(final ParseTree ctx) {
244257
* Get 1 generic literal argument from the antlr parse tree context, where the arguments have the child index
245258
* of 2 with the short form and 4 on the long form (e.g. eq(1) vs P.eq(1) respectively)
246259
*/
247-
private Object getSingleGenericLiteralArgument(final ParseTree ctx) {;
260+
private Object getSingleGenericLiteralArgument(final ParseTree ctx) {
248261
final int childIndexOfParameterValue = ctx.getChildCount() == 6 ? 4 : 2;
249262

250263
return antlr.argumentVisitor.visitGenericArgument(

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,14 @@ public Void visitUuidLiteral(final GremlinParser.UuidLiteralContext ctx) {
12021202
return null;
12031203
}
12041204

1205+
@Override
1206+
public Void visitTraversalGType(GremlinParser.TraversalGTypeContext ctx) {
1207+
final String[] split = ctx.getText().split("\\.");
1208+
sb.append(processGremlinSymbol(split[0])).append(".");
1209+
sb.append(processGremlinSymbol(split[1].toLowerCase()));
1210+
return null;
1211+
}
1212+
12051213
/**
12061214
* Steps with a {@code <TNewEnd>} defined need special handling to append generics.
12071215
*/
@@ -1333,6 +1341,11 @@ static final class SymbolHelper {
13331341
static {
13341342
TO_CS_MAP.put("graphml", "GraphML");
13351343
TO_CS_MAP.put("graphson", "GraphSON");
1344+
TO_CS_MAP.put("bigdecimal", "BigDecimal");
1345+
TO_CS_MAP.put("bigint", "BigInt");
1346+
TO_CS_MAP.put("datetime", "DateTime");
1347+
TO_CS_MAP.put("uuid", "UUID");
1348+
TO_CS_MAP.put("vp", "VP");
13361349
TO_CS_MAP.forEach((k, v) -> FROM_CS_MAP.put(v, k));
13371350
}
13381351

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,16 @@ public Void visitNullLiteral(final GremlinParser.NullLiteralContext ctx) {
239239
return null;
240240
}
241241

242+
243+
@Override
244+
public Void visitTraversalGType(GremlinParser.TraversalGTypeContext ctx) {
245+
final String[] split = ctx.getText().split("\\.");
246+
sb.append(GO_PACKAGE_NAME);
247+
sb.append(processGremlinSymbol(split[0])).append(".");
248+
sb.append(processGremlinSymbol(split[1].toLowerCase()));
249+
return null;
250+
}
251+
242252
@Override
243253
public Void visitTraversalStrategy(final GremlinParser.TraversalStrategyContext ctx) {
244254
if (ctx.getChildCount() == 1)
@@ -369,6 +379,11 @@ static final class SymbolHelper {
369379
TO_GO_MAP.put("OUT", "Out");
370380
TO_GO_MAP.put("IN", "In");
371381
TO_GO_MAP.put("BOTH", "Both");
382+
TO_GO_MAP.put("bigdecimal", "BigDecimal");
383+
TO_GO_MAP.put("bigint", "BigInt");
384+
TO_GO_MAP.put("datetune", "DateTime");
385+
TO_GO_MAP.put("uuid", "UUID");
386+
TO_GO_MAP.put("vp", "VP");
372387
TO_GO_MAP.put("WithOptions", GO_PACKAGE_NAME + "WithOptions");
373388
TO_GO_MAP.put("IO", GO_PACKAGE_NAME + "IO");
374389
TO_GO_MAP.put("__", GO_PACKAGE_NAME + "T__");

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ public Void visitTraversalN(GremlinParser.TraversalNContext ctx) {
9696
return null;
9797
}
9898

99+
@Override
100+
public Void visitTraversalGType(GremlinParser.TraversalGTypeContext ctx) {
101+
final String[] split = ctx.getText().split("\\.");
102+
sb.append(processGremlinSymbol(split[0])).append(".");
103+
sb.append(processGremlinSymbol(split[1].toLowerCase()));
104+
return null;
105+
}
106+
99107
@Override
100108
public Void visitGenericMapLiteral(final GremlinParser.GenericMapLiteralContext ctx) {
101109
sb.append("new Map([");
@@ -257,6 +265,8 @@ static final class SymbolHelper {
257265
TO_JS_MAP.put("from", "from_");
258266
TO_JS_MAP.put("in", "in_");
259267
TO_JS_MAP.put("with", "with_");
268+
TO_JS_MAP.put("bigdecimal", "bigDeciaml");
269+
TO_JS_MAP.put("bigint", "bigInt");
260270
//
261271
TO_JS_MAP.forEach((k, v) -> FROM_JS_MAP.put(v, k));
262272
}

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.tinkerpop.gremlin.language.grammar.GremlinBaseVisitor;
2525
import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser;
2626
import org.apache.tinkerpop.gremlin.process.traversal.DT;
27+
import org.apache.tinkerpop.gremlin.process.traversal.GType;
2728
import org.apache.tinkerpop.gremlin.process.traversal.Merge;
2829
import org.apache.tinkerpop.gremlin.process.traversal.N;
2930
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
@@ -214,6 +215,12 @@ public Void visitTraversalN(final GremlinParser.TraversalNContext ctx) {
214215
return null;
215216
}
216217

218+
@Override
219+
public Void visitTraversalGType(final GremlinParser.TraversalGTypeContext ctx) {
220+
appendExplicitNaming(ctx.getText(), GType.class.getSimpleName());
221+
return null;
222+
}
223+
217224
@Override
218225
public Void visitTraversalPredicate(final GremlinParser.TraversalPredicateContext ctx) {
219226
switch(ctx.getChildCount()) {
@@ -263,6 +270,8 @@ protected void visitP(final ParserRuleContext ctx, final Class<?> clazzOfP, fina
263270
t -> t instanceof GremlinParser.GenericArgumentContext ||
264271
t instanceof GremlinParser.GenericArgumentVarargsContext ||
265272
t instanceof GremlinParser.StringArgumentContext ||
273+
t instanceof GremlinParser.StringLiteralContext ||
274+
t instanceof GremlinParser.TraversalGTypeContext ||
266275
t instanceof GremlinParser.TraversalPredicateContext).collect(Collectors.toList());
267276
for (int ix = 0; ix < list.size(); ix++) {
268277
visit(list.get(ix));
@@ -326,6 +335,12 @@ public Void visitTraversalPredicate_without(final GremlinParser.TraversalPredica
326335
return null;
327336
}
328337

338+
@Override
339+
public Void visitTraversalPredicate_typeOf(final GremlinParser.TraversalPredicate_typeOfContext ctx) {
340+
visitP(ctx, P.class, "typeOf");
341+
return null;
342+
}
343+
329344
@Override
330345
public Void visitTraversalPredicate_not(final GremlinParser.TraversalPredicate_notContext ctx) {
331346
visitP(ctx, P.class, "not");

0 commit comments

Comments
 (0)