+1 to everything here. * Thanks to James for starting with a design discussion rather than a PR * And also thanks for starting it on the mailing list (where the most people will see it) * As Jacques says, now is a good time to move the discussion to a Jira case * Thank you both for keeping up the push to modernize this important but challenging component while keeping necessary compatibility
On Wed, Dec 22, 2021 at 10:25 AM Jacques Nadeau <jacq...@apache.org> wrote: > > Hi James, I think it is great that you are pushing this effort forward. I > have a few requests: > > - Can we have detailed discussions around code, etc on Jira instead of the > ml? It's really hard to read here and also tends to get lost over time. > - If we think we need to make one or more breaking changes, I hope we can > minimize the number of times we need to make a breaking change. For > example, If we change the generic signature of MetadataHandler, there are > probably some other changes we should discuss before finalizing the > specific breaking change so we don't break it twice. > - I'm really interested in this issue but I'm also planning on spending > most of the next 5 days or so with family due to our holiday traditions. > Can we iterate on this set of things next week? > > > > On Tue, Dec 21, 2021 at 4:38 PM James Starr <jamesst...@gmail.com> wrote: > > > While learning calcite, then during subsequent discussions, the legacy code > > in the metadata sub-system caused significant understanding/discussion. > > > > Currently to define a rel metadata type: > > > > public class MyMetadata extends Metadata { > > MetadataDef DEF = ... > > > > VALUE myMethod1(); > > > > class Handler extends RelHandler<MyMetadata> { > > VALUE myMethod2(RelNode, MetadataQuery) > > } > > } > > > > However, it could be reduced to: > > > > class MyMetadataHandler extends RelHandler { > > VALUE myMethod(RelNode, MetadataQuery) > > } > > > > In BuiltInMetadata the resulting definitions would look like: > > > > @Deprecated // to be removed before 2.0 > > > > public class MyMetadata extends Metadata { > > > > MetadataDef DEF = ... > > > > VALUE myMethod1(); > > > > > > @FunctionalInterface > > @Deprecated // to be removed before 2.0 > > > > class Handler extends MyMetadataHandler { > > > > @Deprecated // to be removed before 2.0 > > > > @Override default MetadataDef<MyMetadata> getDef() { > > > > return DEF; > > > > } > > > > } > > } > > > > > > @FunctionalInterface > > > > class MyMetadataHandler extends RelHandler { > > VALUE myMethod(RelNode, MetadataQuery) > > } > > > > > > This would minimize breaks to downstream projects since reference to > > existing handlers would not be broken and downstream projects could migrate > > at their own leisure. > > > > I would like to remove the generic from MetadataHandler as part of cleaning > > up the boilerplate for defining Rel Metadata types[CALCITE-4942]. > > Currently, it refers to the sister Metadata class that is no longer used in > > a non-deprecated code. Furthermore, it does not not provide type safety to > > any code, as all usages of it are either <?> or <? extends Metadata>. This > > would be a breaking change for downstream projects that have a custom > > metadata type or have their own implementation of MetadataHandlerProvider. > > Most downstream projects have neither of them, and if they do, removing the > > generic should be straight forward. Alternatively, it could be left as is > > and/or the "extends Metadata" constraint could be removed. > > > > As part of this, I could also split all the Handlers into functional > > interfaces, which would help with Jacques work to not use Janino. > > > > My Draft request: https://github.com/apache/calcite/pull/2655 > > > > James > >