Hi Sophie,

A quick update: I've pushed a commit to the POC PR
that includes the migration of Window to become a
data class instead of an abstract class. It's quite a bit
of code, but it does look like there is a clean
deprecation/migration path.

The basic idea is that we drop the "abstract" modifier
from Window an deprecate its constructor. We add
a public static `Window.withBounds(start,end)` to
replace the constructor.

Because the constructor is deprecated, existing
subclasses will continue to compile, but receive
a deprecation warning.

We'd also slightly modify EnumerableWindowDefinition
to _not_ be a parameterized class and instead
update windowsFor like this:
<W extends Window> Map<Long, W> windowsFor(final long timestamp)

Then, any existing caller that expects to get back
a subclass of windows during the deprecation period
would still get a valid return. For example, if you
had a custom window definition, and you
invoke this method in your tests, assigning it to a
subclass of Window, all your code would still compile,
but you would get deprecation warnings.

After the deprecation period, we could migrate Window
to be a final class with a private constructor safely.

If that sounds reasonable to you, I can update the
KIP accordingly.

Thanks,
-John

On Mon, Jul 27, 2020, at 22:11, John Roesler wrote:
> Thanks for the reply, Sophie.
> 
> Yes, I'd neglected to specify that Windows will implement maxSize()
> by delegating to size(). It's updated now. I'd also neglected to say that
> I plan to alter both windowBy methods to use the new interface now.
> Because Windows will implement the new interface, all implementations
> will continue to work with windowBy.
> So, yes, there are public methods changed, but no compatibility issues
> arise. Existing implementations will only get a deprecation warning.
> 
> The Window type is interesting. It actually seems to serve as just a data
> container. It almost doesn't need to be subclassed at all, since all
> implementations would just need to store the start and end bounds.
> As far as I can tell, the only purpose to subclass it is to implement
> "overlap(Window other)", to tell if the window is both the same type
> as and overlaps with the other window. But weirdly, this is unused
> in the codebase.
> 
> So one way we could go is to try and migrate it to just a final class,
> effectively a tuple of `(start, end)`.
> 
> However, another opportunity is to let it be a witness of the actual type
> of the window, so that you wouldn't be able to join a TimeWindow
> with a SessionWindow, for example.
> 
> However, because of covariance, it's more painful to change Window
> than Windows, so it might not be worth it right now. If anything, it
> would be more feasible to migrate toward the "simple data container"
> approach. What are your thoughts?
> 
> Thanks,
> -John
> 
> 
> On Mon, Jul 27, 2020, at 18:19, Sophie Blee-Goldman wrote:
> > Thanks for taking the time to really fill in the background details for
> > this KIP.
> > The Motivation section is very informative. Hopefully this will also serve
> > as a
> > warning against making similar such mistakes in the future :P
> > 
> > I notice that the `Window` class that
> > parametrizes EnumerableWindowDefinition
> > is also abstract. Did you consider migrating that to an interface as well?
> > 
> > Also, pretty awesome that we can solve the issue with varying fixed sized
> > windows
> > (eg calendar months) on the side. For users who may have already extended
> > Windows,
> > do you plan to just have Windows implement the new #maxSize method and
> > return the existing
> > size until Windows gets removed?
> > 
> > One final note: this seems to be implicitly implied throughout the KIP but
> > just to be clear,
> > you will be replacing any DSL methods that accept Windows with identical
> > DSL methods
> > that take the new EnumerableWindowDefinition as argument. So there is
> > nothing deprecated
> > and nothing added, but there are public methods changed. Is that right?
> > 
> > On Sun, Jul 26, 2020 at 1:23 PM John Roesler <vvcep...@apache.org> wrote:
> > 
> > > Thanks Sophie and Boyang for asking for specifics.
> > >
> > > As far as I can tell, if we were to _remove_ all the non-public-method
> > > members from Windows, including any constructors, we are left with
> > > effectively an interface. I think this was my plan before. I don't think
> > > I realized at the time that it's possible to replace the entire class with
> > > an interface. Now I realize it is possible, hence the motivation to do it.
> > >
> > > We can choose either to maintain forever the tech debt of having to
> > > enforce that Windows look, sound, and act just like an interface, or we
> > > can just replace it with an interface and be done with it. I.e., the
> > > motivation is less maintenence burden for us and for users.
> > >
> > > Coincidentally, I had an interesting conversation with Matthias about
> > > this interface, and he made me realize that "fixed size" isn't the
> > > essential
> > > nature of this entity. Instead being enumerable is. Reframing the 
> > > interface
> > > in this way will enable us to implement variable sized windows like
> > > MonthlyWindows.
> > >
> > > So, now there are two good reasons to vote for this KIP :)
> > >
> > > Anyway, I've updated the proposed interface and the motivation.
> > >
> > > To Sophie latter question, all of the necessary deprecation is listed
> > > in the KIP. We do not have to deprecate any windowBy methods.
> > >
> > > Thanks,
> > > -John
> > >
> > > On Sat, Jul 25, 2020, at 00:52, Boyang Chen wrote:
> > > > Thanks for the KIP John. I share a similar concern with the motivation,
> > > it
> > > > would be good if you could cast light on the actual downside of using a
> > > > base class vs the interface, is it making the code fragile, or requiring
> > > > redundant implementation, etc.
> > > >
> > > > Boyang
> > > >
> > > > On Tue, Jul 21, 2020 at 2:19 PM Sophie Blee-Goldman <sop...@confluent.io
> > > >
> > > > wrote:
> > > >
> > > > > Hey John,
> > > > >
> > > > > Thanks for the KIP. I know this has been bugging you :)
> > > > >
> > > > > That said, I think the KIP is missing some elaboration in the
> > > Motivation
> > > > > section.
> > > > > You mention a number of problems we've had and lived with in the past
> > > --
> > > > > could
> > > > > you give an example of one, and how it would be solved by your
> > > proposal?
> > > > >
> > > > > By the way, I assume we would also need to deprecate all APIs that
> > > accept a
> > > > > Windows
> > > > > parameter in favor of new ones that accept a
> > > FixedSizeWindowDefinition? Off
> > > > > the
> > > > > top of my head that would be the windowedBy methods in KGroupedStream
> > > and
> > > > > CogroupedKStream
> > > > >
> > > > > On Tue, Jul 21, 2020 at 1:46 PM John Roesler <vvcep...@apache.org>
> > > wrote:
> > > > >
> > > > > > Hello all,
> > > > > >
> > > > > > I'd like to propose KIP-645, to correct a small API mistake in
> > > Streams.
> > > > > > Fixing this now allows us to avoid perpetuating the mistake in new
> > > work.
> > > > > > For example, it will allow us to implement KIP-450 cleanly.
> > > > > >
> > > > > > The change itself should be seamless for users.
> > > > > >
> > > > > > Please see https://cwiki.apache.org/confluence/x/6SN4CQ for details.
> > > > > >
> > > > > > Thanks,
> > > > > > -John
> > > > > >
> > > > >
> > > >
> > >
> >

Reply via email to