Hi all,

As per last email, I've implemented the string concat() function without
"scope" and updated the documentation accordingly. Please feel free to
review the PR here https://github.com/apache/tinkerpop/pull/2099. Thanks!

Cheers,

Yang

On Tue, Jun 27, 2023 at 5:43 PM Yang Xia <ya...@bitquilltech.com> wrote:

> Hi all,
>
> As I'm starting to implement the string concat() function and looking
> at the step logic, I feel that the use of "scope" as outlined in the
> proposal (
> https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/proposal-3-remove-closures.asciidoc#concat)
> does not quite fit with the existing definition of scope in TinkerPop.
>
> As concat is a scalar map step, there is very little differentiation
> between local and global scopes (unlike number operations with sum, mean,
> etc). The only real difference is that the local concat will also accept a
> list of strings from incoming traversers, which I don't see as particularly
> useful. I believe the best way forward is to remove scopes from concat
> entirely and only have a single ScalarMapStep implementation of concat, for
> simplicity both in implementation and usage.
>
> Examples of how this single step would behave:
> g.inject(['this', 'is', 'a', 'test']).concat()
> ==>illegal argument
>
> g.inject('this', 'is', 'a', 'test').concat()
> ==>this
> ==>is
> ==>a
> ==>test
>
> g.inject('this', 'is', 'a', 'test').concat(" a", "b")
> ==>this ab
> ==>is ab
> ==>a ab
> ==>test ab
>
> We would also have the flexibility of adding the "scope" option if use
> cases or user requests surface in the future, as opposed to trying to
> deprecate something that turns out to be not useful.
>
> Also to note that, by extension, the concept of "scope" may not apply to
> string manipulation functions in general, but this may remain to be
> discussed as we implement the rest of the functions.
>
> Any thoughts or suggestions?
>
> Cheers,
>
> Yang
>
> On Thu, Mar 2, 2023 at 4:10 PM David Bechberger <d...@bechberger.com>
> wrote:
>
>> Thanks to everyone who provided feedback so far.  Are there any other
>> comments?  If not, then I'd like to get this merged in this week, so we
>> can
>> get started with implementation.
>>
>> Dave
>>
>> On Mon, Feb 27, 2023 at 8:31 PM Dave Bechberger <d...@bechberger.com>
>> wrote:
>>
>> > Thanks to everyone who gave feedback so far. Any other comments on this
>> > proposal?
>> >
>> > I’d like to get this merged in this week so we can get started with
>> > implementation.
>> >
>> > Dave Bechberger
>> >
>> >
>> > On Feb 17, 2023, at 7:18 AM, David Bechberger <d...@bechberger.com>
>> wrote:
>> >
>> > 
>> > I was two fast on my reply before as I did have a question for you
>> > Valentyn on this statement:
>> >
>> >
>> > *I would propose to consider adding `startWith`, `endWith` andmaybe
>> > `contains` string functions.*
>> >
>> > How would you see these steps being used differently than the current
>> > predicates?
>> >
>> > i.e. P.startingWith()/endingWith()/containing()
>> >
>> > Dave
>> >
>> > On Fri, Feb 17, 2023 at 7:12 AM David Bechberger <d...@bechberger.com>
>> > wrote:
>> >
>> >> Thank you for the fixes Valentyn, I've incorporated that PR.
>> >>
>> >> The list I proposed here was a minimum number of functions, so we can
>> >> definitely see what it would take to include something like a string
>> >> formatting function.
>> >>
>> >> Dave
>> >>
>> >> On Thu, Feb 16, 2023 at 8:36 AM Valentyn Kahamlyk
>> >> <valent...@bitquilltech.com.invalid> wrote:
>> >>
>> >>> Hi,
>> >>>
>> >>> Dave, thank you for the detailed proposal!
>> >>>
>> >>> I made small PR with naming fixes:
>> >>> https://github.com/apache/tinkerpop/pull/1973, please take a look.
>> >>>
>> >>> Also I would propose to consider adding `startWith`, `endWith` and
>> >>> maybe `contains` string functions.
>> >>>
>> >>> Another interesting feature to keep in mind is string formatting.
>> >>> for example
>> >>> `g.V(1).values('first_name').concat('
>> ').concat(V(1).values('last_name')`
>> >>> can be simplified as
>> >>> `g.V(1).asString('%s %s', values('first_name'), values('last_name'))`
>> >>>
>> >>> Regards, Valentyn
>> >>>
>> >>>
>> >>> On Tue, Feb 14, 2023 at 8:47 AM David Bechberger <d...@bechberger.com
>> >
>> >>> wrote:
>> >>>
>> >>> > My apologies, I just saw that I didn't include a link in that email.
>> >>> The
>> >>> > proposal is here:
>> >>> >
>> >>> >
>> >>> >
>> >>>
>> https://github.com/apache/tinkerpop/blob/proposal_3/docs/src/dev/future/proposal-3-remove-closures.asciidoc
>> >>> >
>> >>> > Dave
>> >>> >
>> >>> > On Tue, Feb 14, 2023 at 7:09 AM David Bechberger <
>> d...@bechberger.com>
>> >>> > wrote:
>> >>> >
>> >>> > > Hi All,
>> >>> > >
>> >>> > > There are a number of useful operations that Gremlin users often
>> >>> wish to
>> >>> > > perform that are not provided today in the form of traversal
>> steps or
>> >>> > > predicates (P/TextP). For historical reasons these functions were
>> >>> omitted
>> >>> > > and users were able to accomplish these tasks by specifying
>> anonymous
>> >>> > code
>> >>> > > blocks or “closures” to perform these tasks. For example, below
>> is an
>> >>> > > example of how you can achieve a case-insensitive search for any
>> >>> cities
>> >>> > > that contain “Miami”.
>> >>> > >
>> >>> > > g.V().hasLabel('city').
>> >>> > >
>> >>> > >
>> >>> >
>> >>>
>> has('name',filter{it.get().toLowerCase().contains('Miami'.toLowerCase())})
>> >>> > >
>> >>> > > While this is a powerful fallback mechanism in Gremlin to handle
>> use
>> >>> > cases
>> >>> > > where there is no functionality within the Gremlin language to
>> meet
>> >>> the
>> >>> > > requirements. However, for a variety of reasons such as security
>> and
>> >>> > > performance, many/most remote providers of TinkerPop do not allow
>> >>> users
>> >>> > to
>> >>> > > execute closures as part of a query. This leaves users with a
>> >>> problem, as
>> >>> > > the mechanism provided to solve these sorts of use cases is not
>> >>> allowed.
>> >>> > I
>> >>> > > have come up with a proposed framework for removing the need for
>> >>> closures
>> >>> > > by adding the most commonly requested functions as new Gremlin
>> steps.
>> >>> > > Below is a proposal to highlight this and propose a first set of
>> >>> these
>> >>> > > steps for string manipulation, list manipulation, and data
>> >>> manipulation.
>> >>> > >
>> >>> > > What are your thoughts on this approach?
>> >>> > > Any items we missed?
>> >>> > > Concerns?
>> >>> > >
>> >>> > > Thanks,
>> >>> > > Dave
>> >>> > >
>> >>> >
>> >>>
>> >>
>>
>

Reply via email to