Created an issue for this item given the feedback here:

https://issues.apache.org/jira/browse/TINKERPOP-1195

will look to move forward on this for 3.2.0.  Please feel free to comment
on the ticket if there are other ideas.

On Wed, Feb 17, 2016 at 9:44 AM, Stephen Mallette <spmalle...@gmail.com>
wrote:

> Pierre, those were good thoughts.  Actually, I think you might have
> unraveled some of the API for me by making this asserting that:
>
> > My understanding is that the ResultSet is an abstraction over a list of
> rows
> > that may be fetched in  background. ... It is not made to compose a
> > chain of callbacks like CompletableFuture does, so it should not
> replace it.
>
> That thinking better separates the concerns of Client and ResultSet.  I'll
> think on this a bit and reply back with any revisions as a result for
> further consideration.
>
> Thanks
>
> On Tue, Feb 16, 2016 at 7:47 AM, Pierre Laporte <
> pierre.lapo...@datastax.com> wrote:
>
>> Hi Stephen
>>
>> Overall, here are my impressions on your proposals:
>>
>> * -1 to have Client.submitAsync() return a ResultSet instead of a CF
>> * +1 to have ResultSet.all() return a List<Row>
>> * -1 to add a method ResultSet.allAsync() which returns a CF
>> * +0 for the getInt -> asInt rename
>>
>> I think there is value in being async to the network stack.  The typical
>> idea
>> for going async is to move the blocking or time consuming operations out
>> of
>> the
>> way as fast as possible.  To that extent I think it makes sense to have
>> the
>> entry point (Client.submit()) have an asynchronous version that returns a
>> CompletableFuture.
>>
>> However, I am not sure it is useful to have a ResultSet.allAsync() method
>> that
>> would return a CF, if the entry point (the Client) already offers an
>> asynchronous mode.  The only use case it would address would be to be
>> blocked
>> during the network I/O send operation but not during the results
>> retrieval.
>>
>> As for replacing CompletableFuture<ResultSet> with ResultSet, I am not
>> sure
>> it
>> is a good idea.  We would lose the chaining capabilities of
>> CompletableFuture,
>> like in the following:
>>
>> client.submitAsync(...).thenApply(MyClass::processResultSet, myExecutor);
>>
>> My understanding is that the ResultSet is an abstraction over a list of
>> rows
>> that may be fetched in background.  It is allowed to block if none has yet
>> been
>> fetched.  It is not made to compose a chain of callbacks like
>> CompletableFuture
>> does, so it should not replace it.
>>
>> --
>>
>> Pierre Laporte
>> Performance Engineer
>> www.datastax.com
>>
>>
>> On 2016-02-13 15:40, Stephen Mallette <spmalle...@gmail.com> wrote:
>> > I've been wanting to change something for some time now in Gremlin
>> Driver
>> ->
>> > pretty much since GA, - but it's a breaking change and will make folks
>> have>
>> > to change up their code a bit so I've hesitated. Basically I want to
>> change>
>> > the submit() and submitAsync() API to no longer be async to the network>
>> > stack. I think people find it confusing and it leads to some overly>
>> > verbose. The change would turn signatures like this:>
>> >
>> > public ResultSet submit(final String gremlin)>
>> > CompletableFuture<ResultSet> submitAsync(final String gremlin)>
>> >
>> > into this:>
>> >
>> > public List<Result> submit(final String gremlin)>
>> > public ResultSet submitAsync(final String gremlin)>
>> >
>> > Under this new model, submit() blocks until the entire result is
>> accounted>
>> > for and submitAsync() blocks until the message hits the client side
>> network>
>> > stack and ResultSet behaves like a Future/Iterator as it does now.>
>> >
>> > So rather than:>
>> >
>> > Cluster cluster = Cluster.open();>
>> > Client client = cluster.connect();>
>> > int x = client.submit("1+1").all().get().get(0).getInt();>
>> > int y = client.submitAsync("1+1").get().all().get().get(0).getInt();>
>> >
>> > we have:>
>> >
>> > Cluster cluster = Cluster.open();>
>> > Client client = cluster.connect();>
>> > int x = client.submit("1+1").get(0).getInt();>
>> > int y = client.submitAsync("1+1").all().get().get(0).getInt();>
>> >
>> > While we haven't really reduced the amount of code significantly, a
>> bunch>
>> > of confusion is avoided here because submit() no longer requires the
>> added>
>> > call to all().get() to block until completion.>
>> >
>> > The example is a little dumb because it only returns one Result, in
>> which>
>> > case you would likely do:>
>> >
>> > int x = client.submit("1+1").get(0).getInt();>
>> > int y = client.submitAsync("1+1").one().getInt();>
>> >
>> > Those two calls are functionally equivalent in terms of blocking.>
>> >  submitAsync() almost looks nicer in this case.  That leads me back to>
>> > all() which returns CompletableFuture<List<Result>>...perhaps that
>> should>
>> > change so that there is both all() and allAsync():>
>> >
>> > public List<Result> all()>
>> > public CompletableFuture<List<Result>> allAsync()>
>> >
>> > In this case, the previous blocking example for all() simplifies to:>
>> >
>> > int y = client.submitAsync("1+1").all().get(0).getInt();>
>> > int y = client.submitAsync("1+1").allAsync().get().get(0).getInt();>
>> >
>> > The same could be done for the some() method.  I think the point is here
>> to>
>> > clearly mark for the users which methods are behaving async and which
>> are>
>> > going to block.>
>> >
>> > Finally, I think it would be better to deprecate the get* methods on
>> Result>
>> > in favor of as*.  "as" seems to better describe what's happening when
>> those>
>> > methods on Result are called: type coercion and breaks up all the "get">
>> > looking calls, thus:>
>> >
>> > int y = client.submitAsync("1+1").all().get(0).asInt();>
>> > int y = client.submitAsync("1+1").allAsync().get().get(0).asInt();>
>> >
>> > I'd like to see this change in play for 3.2.0 if possible.  Please let
>> me>
>> > know if there are any concerns or better ideas for this API. If there
>> are>
>> > no objections in the next 72 hours (Tuesday, February 16, 2016 at
>> 9:30am>
>> > EST), I'll assume lazy consensus and proceed forward.>
>> >
>> > Thanks,>
>> >
>> > Stephen>
>> >
>>
>
>

Reply via email to