Skip to content

Commit

Permalink
TINKERPOP-3130 Allowed none() as anonymous and chained
Browse files Browse the repository at this point in the history
  • Loading branch information
spmallette committed Feb 7, 2025
1 parent 04ae983 commit 65337de
Show file tree
Hide file tree
Showing 14 changed files with 152 additions and 88 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
=== TinkerPop 4.0.0 (NOT OFFICIALLY RELEASED YET)
* Bumped SLF4j to 2.0.16.
* Modified grammar to make `discard()` usage more consistent as a filter step where it can now be used to chain additional traversal steps and be used anonymously.
[[release-4-0-0-beta-1]]
=== TinkerPop 4.0.0-beta.1 (January 17, 2025)
Expand Down Expand Up @@ -106,6 +107,8 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
* Changed Gremlin grammar to make use of `g` to spawn child traversals a syntax error.
* Added `unexpected-response` handler to `ws` for `gremlin-javascript`
* Fixed bug in `TinkerTransactionGraph` where a read-only transaction may leave elements trapped in a "zombie transaction".
* Modified grammar to make `none()` usage more consistent as a filter step where it can now be used to chain additional traversal steps and be used anonymously.
* Added missing anonymous support for `disjunct()` in Python and Javascript.
[[release-3-7-3]]
=== TinkerPop 3.7.3 (October 23, 2024)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,6 @@ protected void notImplemented(final ParseTree ctx) {
* {@inheritDoc}
*/
@Override public T visitChainedTraversal(final GremlinParser.ChainedTraversalContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
@Override public T visitChainedParentOfGraphTraversal(final GremlinParser.ChainedParentOfGraphTraversalContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -355,7 +351,11 @@ protected void notImplemented(final ParseTree ctx) {
* {@inheritDoc}
*/
@Override public T visitTraversalMethod_difference_Object(final GremlinParser.TraversalMethod_difference_ObjectContext ctx) { notImplemented(ctx); return null; }
/**
/**
* {@inheritDoc}
*/
@Override public T visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
@Override public T visitTraversalMethod_disjunct_Object(final GremlinParser.TraversalMethod_disjunct_ObjectContext ctx) { notImplemented(ctx); return null; }
Expand Down Expand Up @@ -1127,10 +1127,6 @@ protected void notImplemented(final ParseTree ctx) {
* {@inheritDoc}
*/
@Override public T visitTraversalSackMethod(final GremlinParser.TraversalSackMethodContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
@Override public T visitTraversalSelfMethod(final GremlinParser.TraversalSelfMethodContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -1255,10 +1251,6 @@ protected void notImplemented(final ParseTree ctx) {
* {@inheritDoc}
*/
@Override public T visitTraversalTerminalMethod_toBulkSet(final GremlinParser.TraversalTerminalMethod_toBulkSetContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
@Override public T visitTraversalSelfMethod_discard(final GremlinParser.TraversalSelfMethod_discardContext ctx) { notImplemented(ctx); return null; }
/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,14 @@ public GraphTraversal visitTraversalMethod_difference_Object(final GremlinParser
return graphTraversal.difference(literalOrVar);
}

/**
* {@inheritDoc}
*/
@Override
public Traversal visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) {
return graphTraversal.discard();
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@ public TraversalRootVisitor(final GremlinAntlrToJava antlr, final Traversal trav
public Traversal visitNestedTraversal(final GremlinParser.NestedTraversalContext ctx) {
if (ctx.getChild(0) instanceof GremlinParser.RootTraversalContext) {
return visitChildren(ctx);
} else if (ctx.getChild(2) instanceof GremlinParser.ChainedParentOfGraphTraversalContext) {
return new TraversalRootVisitor<Traversal>(antlr.createAnonymous.get()).
visitChainedParentOfGraphTraversal(ctx.chainedTraversal().chainedParentOfGraphTraversal());
} else {
return new TraversalMethodVisitor(antlr, antlr.createAnonymous.get()).visitChainedTraversal(ctx.chainedTraversal());
}
Expand All @@ -79,53 +76,14 @@ public Traversal visitRootTraversal(final GremlinParser.RootTraversalContext ctx
(GremlinParser.TraversalSourceSpawnMethodContext) ctx.getChild(childIndexOfTraversalSourceSpawnMethod));

if (ctx.getChildCount() == 5) {
// handle chained traversal
final int childIndexOfChainedTraversal = 4;

if (ctx.getChild(childIndexOfChainedTraversal) instanceof GremlinParser.ChainedParentOfGraphTraversalContext) {
final TraversalRootVisitor traversalRootVisitor = new TraversalRootVisitor(traversal);
return traversalRootVisitor.visitChainedParentOfGraphTraversal(
(GremlinParser.ChainedParentOfGraphTraversalContext) ctx.getChild(childIndexOfChainedTraversal));
} else {
final TraversalMethodVisitor traversalMethodVisitor = new TraversalMethodVisitor(antlr, traversal);
return traversalMethodVisitor.visitChainedTraversal(
(GremlinParser.ChainedTraversalContext) ctx.getChild(childIndexOfChainedTraversal));
}
final TraversalMethodVisitor traversalMethodVisitor = new TraversalMethodVisitor(antlr, traversal);
return traversalMethodVisitor.visitChainedTraversal(
(GremlinParser.ChainedTraversalContext) ctx.getChild(4));
} else {
return traversal;
}
}

/**
* {@inheritDoc}
*/
@Override
public Traversal visitTraversalSelfMethod(final GremlinParser.TraversalSelfMethodContext ctx) {
return visitChildren(ctx);
}

/**
* {@inheritDoc}
*/
@Override
public Traversal visitTraversalSelfMethod_discard(final GremlinParser.TraversalSelfMethod_discardContext ctx) {
this.traversal = traversal.discard();
return this.traversal;
}

/**
* {@inheritDoc}
*/
@Override
public Traversal visitChainedParentOfGraphTraversal(final GremlinParser.ChainedParentOfGraphTraversalContext ctx) {
if (ctx.getChildCount() == 1) {
return visitChildren(ctx);
} else {
visit(ctx.getChild(0));
return visit(ctx.getChild(2));
}
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,11 +265,6 @@ public Void visitChainedTraversal(final GremlinParser.ChainedTraversalContext ct
return visitChildren(ctx);
}

@Override
public Void visitChainedParentOfGraphTraversal(final GremlinParser.ChainedParentOfGraphTraversalContext ctx) {
return visitChildren(ctx);
}

@Override
public Void visitNestedTraversal(final GremlinParser.NestedTraversalContext ctx) {
if (ctx.ANON_TRAVERSAL_ROOT() == null)
Expand Down Expand Up @@ -557,6 +552,11 @@ public Void visitTraversalMethod_difference_Object(final GremlinParser.Traversal
return visitChildren(ctx);
}

@Override
public Void visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) {
return visitChildren(ctx);
}

@Override
public Void visitTraversalMethod_disjunct_Object(final GremlinParser.TraversalMethod_disjunct_ObjectContext ctx) {
return visitChildren(ctx);
Expand Down Expand Up @@ -1605,11 +1605,6 @@ public Void visitTraversalSackMethod(final GremlinParser.TraversalSackMethodCont
return visitChildren(ctx);
}

@Override
public Void visitTraversalSelfMethod(final GremlinParser.TraversalSelfMethodContext ctx) {
return visitChildren(ctx);
}

@Override
public Void visitTraversalComparator(final GremlinParser.TraversalComparatorContext ctx) {
return visitChildren(ctx);
Expand Down Expand Up @@ -1809,11 +1804,6 @@ public Void visitTraversalTerminalMethod_toBulkSet(final GremlinParser.Traversal
return visitChildren(ctx);
}

@Override
public Void visitTraversalSelfMethod_discard(final GremlinParser.TraversalSelfMethod_discardContext ctx) {
return visitChildren(ctx);
}

@Override
public Void visitWithOptionKeys(final GremlinParser.WithOptionKeysContext ctx) {
return visitChildren(ctx);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -960,6 +960,13 @@ public static <A> GraphTraversal<A, Set<?>> difference(final GValue<Object> valu
return __.<A>start().difference(values);
}

/**
* @see GraphTraversal#discard()
*/
public static <A> GraphTraversal<A, A> discard() {
return __.<A>start().discard();
}

/**
* @see GraphTraversal#disjunct(Object)
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1298,4 +1298,11 @@ public void shouldParseTraversalMethod_substring_long() throws Exception {
public void shouldParseTraversalMethod_substring_long_long() throws Exception {
compare(g.V().substring(1, 3), eval("g.V().substring(1, 3)"));
}

@Test
public void shouldParseTraversalMethod_discard_somethingAfter() throws Exception {
compare(g.V().discard().path(), eval("g.V().discard().path()"));
compare(g.V().discard().E(), eval("g.V().discard().E()"));
compare(g.V().discard().discard(), eval("g.V().discard().discard()"));
}
}
8 changes: 8 additions & 0 deletions gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,14 @@ public static GraphTraversal<object, object> Difference(object differenceObject)
return new GraphTraversal<object, object>().Difference(differenceObject);
}

/// <summary>
/// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the none step to that traversal.
/// </summary>
public static GraphTraversal<object, object> Discard()
{
return new GraphTraversal<object, object>().Discard();
}

/// <summary>
/// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the disjunct step to that traversal.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1780,6 +1780,8 @@ export const statics = {
dateAdd: (...args: any[]) => callOnEmptyTraversal('dateAdd', args),
dateDiff: (...args: any[]) => callOnEmptyTraversal('dateDiff', args),
dedup: (...args: any[]) => callOnEmptyTraversal('dedup', args),
discard: (...args: any[]) => callOnEmptyTraversal('discard', args),
disjunct: (...args: any[]) => callOnEmptyTraversal('disjunct', args),
drop: (...args: any[]) => callOnEmptyTraversal('drop', args),
element: (...args: any[]) => callOnEmptyTraversal('element', args),
elementMap: (...args: any[]) => callOnEmptyTraversal('elementMap', args),
Expand Down Expand Up @@ -1820,6 +1822,7 @@ export const statics = {
mergeE: (...args: any[]) => callOnEmptyTraversal('mergeE', args),
mergeV: (...args: any[]) => callOnEmptyTraversal('mergeV', args),
min: (...args: any[]) => callOnEmptyTraversal('min', args),
none: (...args: any[]) => callOnEmptyTraversal('none', args),
not: (...args: any[]) => callOnEmptyTraversal('not', args),
optional: (...args: any[]) => callOnEmptyTraversal('optional', args),
or: (...args: any[]) => callOnEmptyTraversal('or', args),
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 5 additions & 15 deletions gremlin-language/src/main/antlr4/Gremlin.g4
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ transactionPart
rootTraversal
: traversalSource DOT traversalSourceSpawnMethod
| traversalSource DOT traversalSourceSpawnMethod DOT chainedTraversal
| traversalSource DOT traversalSourceSpawnMethod DOT chainedParentOfGraphTraversal
;

traversalSourceSelfMethod
Expand Down Expand Up @@ -163,12 +162,6 @@ traversalSourceSpawnMethod_union
chainedTraversal
: traversalMethod
| chainedTraversal DOT traversalMethod
| chainedTraversal DOT chainedParentOfGraphTraversal
;

chainedParentOfGraphTraversal
: traversalSelfMethod
| chainedParentOfGraphTraversal DOT traversalSelfMethod
;

nestedTraversal
Expand Down Expand Up @@ -209,6 +202,7 @@ traversalMethod
| traversalMethod_cyclicPath
| traversalMethod_dedup
| traversalMethod_difference
| traversalMethod_discard
| traversalMethod_disjunct
| traversalMethod_drop
| traversalMethod_elementMap
Expand Down Expand Up @@ -454,6 +448,10 @@ traversalMethod_difference
: 'difference' LPAREN genericLiteralArgument RPAREN #traversalMethod_difference_Object
;

traversalMethod_discard
: 'discard' LPAREN RPAREN
;

traversalMethod_disjunct
: 'disjunct' LPAREN genericLiteralArgument RPAREN #traversalMethod_disjunct_Object
;
Expand Down Expand Up @@ -1102,10 +1100,6 @@ traversalSackMethod
: traversalBarrier
;

traversalSelfMethod
: traversalSelfMethod_discard
;

// Additional special rules that are derived from above
// These are used to restrict broad method signatures that accept lambdas
// to a smaller set.
Expand Down Expand Up @@ -1237,10 +1231,6 @@ traversalTerminalMethod_toBulkSet
: 'toBulkSet' LPAREN RPAREN
;

traversalSelfMethod_discard
: 'discard' LPAREN RPAREN
;

// Gremlin specific lexer rules

withOptionKeys
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,10 @@ def dedup(cls, *args):
def difference(cls, *args):
return cls.graph_traversal(None, None, GremlinLang()).difference(*args)

@classmethod
def discard(cls, *args):
return cls.graph_traversal(None, None, GremlinLang()).discard(*args)

@classmethod
def disjunct(cls, *args):
return cls.graph_traversal(None, None, GremlinLang()).disjunct(*args)
Expand Down Expand Up @@ -1469,6 +1473,10 @@ def min_(cls, *args):
def none(cls, *args):
return cls.graph_traversal(None, None, GremlinLang()).none(*args)

@classmethod
def none(cls, *args):
return cls.graph_traversal(None, None, Bytecode()).none(*args)

@classmethod
def not_(cls, *args):
return cls.graph_traversal(None, None, GremlinLang()).not_(*args)
Expand Down Expand Up @@ -1945,6 +1953,14 @@ def dedup(*args):
return __.dedup(*args)


def discard(*args):
return __.discard(*args)


def disjunct(*args):
return __.disjunct(*args)


def drop(*args):
return __.drop(*args)

Expand Down Expand Up @@ -2149,6 +2165,10 @@ def min_(*args):
return __.min_(*args)


def none(*args):
return __.none(*args)


def not_(*args):
return __.not_(*args)

Expand Down Expand Up @@ -2435,6 +2455,10 @@ def where(*args):

statics.add_static('date_diff', date_diff)

statics.add_static('discard', discard)

statics.add_static('disjunct', disjunct)

statics.add_static('dedup', dedup)

statics.add_static('drop', drop)
Expand Down Expand Up @@ -2537,6 +2561,8 @@ def where(*args):

statics.add_static('min_', min_)

statics.add_static('none', none)

statics.add_static('not_', not_)

statics.add_static('optional', optional)
Expand Down
Loading

0 comments on commit 65337de

Please sign in to comment.