[ https://issues.apache.org/jira/browse/TINKERPOP-2978?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17778857#comment-17778857 ]
ASF GitHub Bot commented on TINKERPOP-2978: ------------------------------------------- kenhuuu commented on code in PR #2302: URL: https://github.com/apache/tinkerpop/pull/2302#discussion_r1369373028 ########## docs/src/dev/provider/gremlin-semantics.asciidoc: ########## @@ -725,6 +725,42 @@ link:https://github.com/apache/tinkerpop/tree/x.y.z/gremlin-core/src/main/java/o link:https://github.com/apache/tinkerpop/tree/x.y.z/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/service/ServiceRegistry.java[ServiceRegistry], link:https://tinkerpop.apache.org/docs/x.y.z/reference/#call-step[reference] +[[combine-step]] +=== combine() + +*Description:* Appends one list to the other and returns the result to the Traversal Stream. + +*Syntax:* `combine(Object)` + +[width="100%",options="header"] +|========================================================= +|Start Step |Mid Step |Modulated |Domain |Range +|N |Y |N |`array`/`Iterable` |`List` +|========================================================= + +*Arguments:* + +* `Object` - A list of items (as an Iterable or an array) a traversal that will produce a list of items. + +*Modulation:* + +None + +*Considerations:* + +A list is returned after the combine operation is applied so duplicates are allowed. `Merge` can be used instead if +duplicates aren't wanted. This step only applies to list types which means that non-iterable types (including null) +will cause exceptions to be thrown. + +*Exceptions* + +* If the incoming traverser isn't a list (array or Iterable) then an `IllegalArgumentException` will be thrown. +* If the argument doesn't resolve to a list (array or Iterable) then an `IllegalArgumentException` will be thrown. + +See: link:https://github.com/apache/tinkerpop/tree/x.y.z/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CombineStep.java[source], +link:https://tinkerpop.apache.org/docs/x.y.z/reference/#combine-step[reference], +link:https://tinkerpop.apache.org/docs/x.y.z/reference/#merge-step[reference], Review Comment: yes it was intended. updated to your suugestion. ########## gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/Combine.feature: ########## @@ -0,0 +1,240 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +@StepClassMap @StepCombine +Feature: Step - combine() + + @GraphComputerVerificationInjectionNotSupported + Scenario: g_injectXnullX_combineXinjectX1XX + Given the empty graph + And the traversal of + """ + g.inject(null).combine(__.inject(1)) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "Incoming traverser for combine step can't be null" + + @GraphComputerVerificationInjectionNotSupported + Scenario: g_V_valuesXnameX_combineXV_foldX + Given the modern graph + And the traversal of + """ + g.V().values("name").combine(__.V().fold()) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "combine step can only take an array or an Iterable type for incoming traversers" + + Scenario: g_V_fold_combineXconstantXnullXX + Given the modern graph + And the traversal of + """ + g.V().fold().combine(__.constant(null)) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "traversal argument for combine step must yield an iterable type, not null" + + @GraphComputerVerificationMidVNotSupported + Scenario: g_V_fold_combineXVX + Given the modern graph + And the traversal of + """ + g.V().fold().combine(__.V()) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "traversal argument for combine step must yield an iterable type, encountered" + + Scenario: g_V_valuesXnameX_fold_combineX2X + Given the modern graph + And the traversal of + """ + g.V().values("name").fold().combine(2) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "combine step can only take an array or an Iterable as an argument, encountered" + + Scenario: g_V_valuesXnameX_fold_combineXnullX + Given the modern graph + And the traversal of + """ + g.V().values("name").fold().combine(null) + """ + When iterated to list + Then the traversal will raise an error with message containing text of "Argument provided for combine step can't be null" + + @GraphComputerVerificationInjectionNotSupported + Scenario: g_V_valuesXnonexistantX_fold_combineXV_valuesXnameX_foldX + Given the modern graph + And the traversal of + """ + g.V().values("nonexistant").fold().combine(__.V().values("name").fold()) + """ + When iterated to list + Then the result should be unordered + | result | + | l[marko,vadas,lop,josh,ripple,peter] | + + @GraphComputerVerificationInjectionNotSupported + Scenario: g_V_valuesXnameX_fold_combineXV_valuesXnonexistantX_foldX + Given the modern graph + And the traversal of + """ + g.V().values("name").fold().combine(__.V().values("nonexistant").fold()) + """ + When iterated to list + Then the result should be unordered + | result | + | l[marko,vadas,lop,josh,ripple,peter] | + + @GraphComputerVerificationInjectionNotSupported Review Comment: updated tag. > Add List Manipulation Steps to Gremlin > -------------------------------------- > > Key: TINKERPOP-2978 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2978 > Project: TinkerPop > Issue Type: Improvement > Components: language > Reporter: Cole Greer > Priority: Major > > Today Gremlin requires that users fall back to closures to handle many common > list manipulation options that users want to do on data in the graph. This > is a problem for many users as many of the providers prevent the use of > closures due to the security risks so for these users there is no way to > manipulate lists directly. > A full list of proposed functions and semantics is detailed here: > https://github.com/apache/tinkerpop/blob/3.7.0/docs/src/dev/future/proposal-3-remove-closures.asciidoc -- This message was sent by Atlassian Jira (v8.20.10#820010)