Generating code based on the spec is completely different than generating code based on the annotations introduced by Immutables.
More importantly, we shouldn’t allow a discussion about pushing the project forward to devolve into a debate around some third-party library that’s not necessary to the change. On Mon, Feb 17, 2025 at 9:42 AM Robert Stupp <sn...@snazy.de> wrote: > Everything you have to code manually requires explicit tests. > > Immutables is a very mature library that has exceptionally good test > coverage that prevents a ton of accidental coding mistakes. We've been > using it for many many years in multiple projects and literally never > produced wrong code. > > We already have code generators in the code base for openapi. I'd okay > to remove that, because the code generated by that generator is IMHO not > great. > > Overall we should focus on the "real stuff" and not bother about > manually writing builders and really immutable types. > > On 17.02.25 18:10, Michael Collado wrote: > > I prefer native Java constructs over third party libraries and compiler > > plugins, whenever possible. I’m a fan of Java records. > > > > Mike > > > > On Mon, Feb 17, 2025 at 6:55 AM Jean-Baptiste Onofré <j...@nanthrax.net> > > wrote: > > > >> Hi Robert, > >> > >> Yes, my intention about Java records (e.g. > >> https://openjdk.org/jeps/395) is to leverage: > >> - Devise an object-oriented construct that expresses a simple > >> aggregation of values. > >> - Focus on modeling immutable data rather than extensible behavior. > >> - Automatically implement data-driven methods such as equals and > accessors. > >> - Preserve long-standing Java principles such as nominal typing and > >> migration compatibility. > >> - Provide inner builder, optionally with technical validation > >> (Objects.NotNull, etc), for instance: > >> > >> public record CatalogDAO(String id, String name, ...) { > >> > >> public static final class Builder { > >> String id; > >> String name; > >> public Builder() {} > >> public Builder id(String id) { > >> this.id = id; > >> return this; > >> } > >> public Builder name(String name) { > >> this.name = name; > >> return this; > >> } > >> public CatalogDAO build() { > >> return new CatalogDAO(id, name); > >> } > >> } > >> > >> } > >> NB: that's just a "raw" example :) > >> > >> That could help us for the "DAO" layer, with clean isolation and data > >> "transport". The "conversion" from Polaris Entity to DAO could be > >> performed by the intermediate logic layer (e.g. > >> PolarisMetaStoreManager), the pure persistence layer can deal with DAO > >> only (e.g. PolarisStore). > >> > >> Good point about immutable collections. In some projects, I "force" > >> the copy of a collection to ensure immutability, something like: > >> > >> record NamespaceDAO(Set<String> children) { > >> public NamespaceDAO { > >> children = Set.copyOf(children); > >> } > >> } > >> > >> OK, that's not super elegant :) but it does the trick ;) > >> > >> Regards > >> JB > >> > >> On Mon, Feb 17, 2025 at 5:28 PM Robert Stupp <sn...@snazy.de> wrote: > >>> Agree with JB, except I think "immutables" serves the need much better. > >>> Java records are okay, but do not ensure that all fields are immutable > - > >>> especially collections. The other pro of immutables is that there are > >>> proper, descriptive builders - hence no need to constructors with a > >>> gazillion parameters. > >>> > >>> On 17.02.25 11:42, Jean-Baptiste Onofré wrote: > >>>> Hi Yufei > >>>> > >>>> I left comments in the PR. > >>>> > >>>> Thanks for that. That's an interesting approach but slightly different > >>>> to what I had in mind. > >>>> > >>>> My proposal was: > >>>> > >>>> 1. The DAOs are Java records clearly descriptive, without "storage > >> operations". > >>>> For instance, we can imagine: > >>>> > >>>> public record CatalogDao(String id, String name, String location, ...) > >> { > >>>> ... > >>>> } > >>>> > >>>> public record NamespaceDao(String id, String name, String parent, ...) > >> {} > >>>> public record TableDao(String id, String name, ...) {} > >>>> > >>>> etc > >>>> > >>>> The advantages are: > >>>> - very simple and descriptive > >>>> - common to any backend implementation > >>>> > >>>> 2. The PolarisStore defines the DAO backend operations and mapping to > >>>> "internal" Polaris entities. Each persistence adapter implements the > >>>> PolarisStore. > >>>> For the persistence adapter implementer, he just has to implement the > >>>> DAO persistence (no need to understand other Polaris parts). > >>>> Each persistence adapter is in its own module (for isolation and > >> dependencies). > >>>> During the Polaris Persistence Meeting last week, we already got > >>>> consensus on the approach proposed by Dennis and I. I propose to do a > >>>> new sync/review with Dennis. > >>>> > >>>> Regards > >>>> JB > >>>> > >>>> On Mon, Feb 17, 2025 at 9:40 AM Yufei Gu <flyrain...@gmail.com> > wrote: > >>>>> Hi Folks: > >>>>> > >>>>> Here is a POC for persistence layer refactor. Please check it out and > >> let > >>>>> me know what you think. Please note this is a POC, we still need a > >> lot of > >>>>> effort to complete the refactor. > >>>>> > >>>>> PR: https://github.com/apache/polaris/pull/1011. > >>>>> Design doc: > >>>>> > >> > https://docs.google.com/document/d/1Vuhw5b9-6KAol2vU3HUs9FJwcgWtiVVXMYhLtGmz53s/edit?tab=t.0 > >>>>> Experiment: > >>>>> > >>>>> - Added a DAO layer for the business entity namespace(except the > >> read). > >>>>> - Integrated with existing DAO components > >> (PolarisMetaStoreManager and > >>>>> PolarisMetaStoreSession). > >>>>> - All tests passed successfully, including a manual local run > >> with Spark > >>>>> sql. > >>>>> > >>>>> Benefits: > >>>>> > >>>>> - Compatible with the existing backend(FDB), as we hide it > behind > >> the > >>>>> new DAO. > >>>>> - Adding new backends(Postgres/MongoDB) is much easier now, esp > >> for > >>>>> Postgres, we could be able to use a similar model as Iceberg > Jdbc > >> catalog. > >>>>> - Allows gradual refactoring to remove old DAO dependencies > >>>>> (PolarisMetaStoreManager and PolarisMetaStoreSession). > >>>>> - Enables parallel development of new backend implementations. > >>>>> > >>>>> Next Steps: > >>>>> > >>>>> - Define business entities one by one to decouple them from FDB. > >>>>> - Create DAO interfaces for each entity to standardize > operations > >> (e.g., > >>>>> CRUD, ID generation). > >>>>> - Expand DAO implementations to support additional backends over > >> time. > >>>>> > >>>>> > >>>>> > >>>>> Yufei > >>> -- > >>> Robert Stupp > >>> @snazy > >>> > -- > Robert Stupp > @snazy > >