+1 for introducing the new interface now and deprecating the old one. The major version change then provides the opportunity to remove deprecated code.
On Mon, Nov 26, 2018 at 10:09 AM Lukasz Cwik <lc...@google.com> wrote: > Before 3.0 we will still want to introduce this giving time for people to > migrate, would it make sense to do that now and deprecate the alternatives > that it replaces? > > On Mon, Nov 26, 2018 at 5:59 AM Jeff Klukas <jklu...@mozilla.com> wrote: > >> Picking up this thread again. Based on the feedback from Kenn, Reuven, >> and Romain, it sounds like there's no objection to the idea of >> SimpleFunction and SerializableFunction declaring that they throw >> Exception. So the discussion at this point is about whether there's an >> acceptable way to introduce that change. >> >> IIUC correctly, Kenn was suggesting that we need to ensure backwards >> compatibility for existing user code both at runtime and recompile, which >> means we can't simply add the declaration to the existing interfaces, since >> that would cause errors at compile time for user code directly invoking >> SerializableFunction instances. >> >> I don't see an obvious way that introducing a new functional interface >> would help without littering the API with more variants (it's already a bit >> confusing that i.e. MapElements has multiple via() methods to support three >> different function interfaces). >> >> Perhaps this kind of cleanup is best left for Beam 3.0? >> >> On Mon, Oct 15, 2018 at 6:51 PM Reuven Lax <re...@google.com> wrote: >> >>> Compilation compatibility is a big part of what Beam aims to provide >>> with its guarantees. Romain makes a good point that most users are not >>> invoking SeralizableFunctions themselves (they are usually invoked inside >>> of Beam classes such as MapElements), however I suspect some users do these >>> things. >>> >>> On Sun, Oct 14, 2018 at 2:38 PM Kenneth Knowles <k...@apache.org> wrote: >>> >>>> Romain has brought up two good aspects of backwards compatibility: >>>> >>>> - runtime replacement vs recompile >>>> - consumer (covariant) vs producer (contravariant, such as interfaces >>>> a user implements) >>>> >>>> In this case, I think the best shoice is covariant and contravariant >>>> (invariant) backwards compat including recompile compat. But we shouldn't >>>> assume there is one obvious definition of "backwards compatibility". >>>> >>>> Does it help to introduce a new functional interface? >>>> >>>> Kenn >>>> >>>> On Sun, Oct 14, 2018 at 6:25 AM Romain Manni-Bucau < >>>> rmannibu...@gmail.com> wrote: >>>> >>>>> Beam does not catch Exception for function usage so it will have to do >>>>> it in some places. >>>>> >>>>> A user does not have to execute the function so worse case it impacts >>>>> tests and in any case the most important: it does not impact the user >>>>> until >>>>> it recompiles the code (= runtime is not impacted). >>>>> >>>>> Romain Manni-Bucau >>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>> <http://rmannibucau.wordpress.com> | Github >>>>> <https://github.com/rmannibucau> | LinkedIn >>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>> >>>>> >>>>> Le dim. 14 oct. 2018 à 15:19, Reuven Lax <re...@google.com> a écrit : >>>>> >>>>>> What in Beam codebase is not ready, and how do we know that user code >>>>>> doesn't have the same issue? >>>>>> >>>>>> On Sun, Oct 14, 2018 at 6:04 AM Romain Manni-Bucau < >>>>>> rmannibu...@gmail.com> wrote: >>>>>> >>>>>>> Hmm, tested also and it works until something in the codeflow does >>>>>>> not respect that constraint - see >>>>>>> com.sun.tools.javac.comp.Flow.FlowAnalyzer#errorUncaught. In other words >>>>>>> beam codebase is not ready for that and will make it fail but it is ok >>>>>>> cause we can fix it but user code does not rely on that so it is fine to >>>>>>> update it normally. >>>>>>> >>>>>>> Romain Manni-Bucau >>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>>> <http://rmannibucau.wordpress.com> | Github >>>>>>> <https://github.com/rmannibucau> | LinkedIn >>>>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>>>> >>>>>>> >>>>>>> Le dim. 14 oct. 2018 à 14:39, Reuven Lax <re...@google.com> a >>>>>>> écrit : >>>>>>> >>>>>>>> Just tried it, doesn't appear to work :( >>>>>>>> >>>>>>>> error: unreported exception Exception; must be caught or declared >>>>>>>> to be thrown >>>>>>>> >>>>>>>> On Sun, Oct 14, 2018 at 1:55 AM Romain Manni-Bucau < >>>>>>>> rmannibu...@gmail.com> wrote: >>>>>>>> >>>>>>>>> not with java>=8 AFAIK >>>>>>>>> >>>>>>>>> Romain Manni-Bucau >>>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>>>>> <http://rmannibucau.wordpress.com> | Github >>>>>>>>> <https://github.com/rmannibucau> | LinkedIn >>>>>>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>>>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>>>>>> >>>>>>>>> >>>>>>>>> Le dim. 14 oct. 2018 à 10:49, Reuven Lax <re...@google.com> a >>>>>>>>> écrit : >>>>>>>>> >>>>>>>>>> But it means that other functions that call SerializableFunctions >>>>>>>>>> must now declare exceptions, right? If yes, this is incompatible. >>>>>>>>>> >>>>>>>>>> On Sun, Oct 14, 2018 at 1:37 AM Romain Manni-Bucau < >>>>>>>>>> rmannibu...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>>> No, only parameter types and return type is used to lookup >>>>>>>>>>> methods. >>>>>>>>>>> >>>>>>>>>>> Romain Manni-Bucau >>>>>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>>>>>>> <http://rmannibucau.wordpress.com> | Github >>>>>>>>>>> <https://github.com/rmannibucau> | LinkedIn >>>>>>>>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>>>>>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Le dim. 14 oct. 2018 à 09:45, Reuven Lax <re...@google.com> a >>>>>>>>>>> écrit : >>>>>>>>>>> >>>>>>>>>>>> I've run into this problem before as well. Doesn't changing the >>>>>>>>>>>> signature involve a backwards-incompatible change though? >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Oct 3, 2018 at 5:11 PM Jeff Klukas <jklu...@mozilla.com> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I'm working on https://issues.apache.org/jira/browse/BEAM-5638 >>>>>>>>>>>>> to add exception handling options to single message transforms in >>>>>>>>>>>>> the Java >>>>>>>>>>>>> SDK. >>>>>>>>>>>>> >>>>>>>>>>>>> MapElements' via() method is overloaded to accept either a >>>>>>>>>>>>> SimpleFunction, a SerializableFunction, or a Contextful, all of >>>>>>>>>>>>> which are >>>>>>>>>>>>> ultimately stored as a Contextful where the mapping functionis >>>>>>>>>>>>> expected to >>>>>>>>>>>>> have signature: >>>>>>>>>>>>> >>>>>>>>>>>>> OutputT apply(InputT element, Context c) throws Exception; >>>>>>>>>>>>> >>>>>>>>>>>>> So Contextful.Fn allows throwing checked exceptions, but neither >>>>>>>>>>>>> SerializableFunction nor SimpleFunction do. The user-provided >>>>>>>>>>>>> function has to satisfy the more restrictive signature: >>>>>>>>>>>>> >>>>>>>>>>>>> OutputT apply(InputT input); >>>>>>>>>>>>> >>>>>>>>>>>>> Is there background about why we allow arbitrary checked >>>>>>>>>>>>> exceptions to be thrown in one case but not the other two? Could >>>>>>>>>>>>> we >>>>>>>>>>>>> consider expanding SerializableFunction and SimpleFunction to >>>>>>>>>>>>> the following?: >>>>>>>>>>>>> >>>>>>>>>>>>> OutputT apply(InputT input) throws Exception; >>>>>>>>>>>>> >>>>>>>>>>>>> This would, for example, simplify the implementation of >>>>>>>>>>>>> ParseJsons and AsJsons, where we have to catch an IOException in >>>>>>>>>>>>> MapElements#via only to rethrow as RuntimeException. >>>>>>>>>>>>> >>>>>>>>>>>>