"I know EOF of the olden times had an LDAP adapter..." Wow, that brings back unpleasant memories... Speaking of EOF (and I don't want to hijack this thread, so feel free to reply in a new one), how long is Cayenne going to support EOModels? It isn't a lot of baggage that is carried around, but still baggage.
On Thu, Dec 30, 2021 at 4:12 AM Andrus Adamchik <aadamc...@gmail.com> wrote: > Not so much of a connector issue, but more of a conceptual limitation. > Relational backend is implied across the stack, from mapping (FKs, joins) > to query translation. I know EOF of the olden times had an LDAP adapter, > and there are JPA engines for NoSQL DBs, but all appear to be really leaky > abstractions. > > If we are to dig in this direction, we will need to start with a model of > "universal mapping". > > Andrus > > > > On Dec 30, 2021, at 4:54 AM, Aristedes Maniatis <a...@ish.com.au.INVALID> > wrote: > > > > Not that I have a need for it, but how pluggable is the JDBC connector > part of Cayenne? That is, could the backend be easily exchanged for json or > some other data source, even if only in a read-only way? Could also be an > interesting way to demonstrate Modeler to new users... > > > > > > Ari > > > > > > On 30/12/21 1:24am, Andrus Adamchik wrote: > >> An idea of in-memory query evaluation fits Cayenne to a degree. Though > it is limited to what we already do with in-memory expression-based > filtering and sorting. A more fancy data transformation (even a simple > "toUpperCase" from your example) runs against the basic ORM philosophy > ("toUpperCase" would be a property that does not directly correspond to a > value in DB). > >> > >> I solved it for myself by splitting use cases in two groups: > >> > >> 1. "Data as object graph" where Cayenne is appropriate (most cases) > >> 2. "Data as data" with extra "plasticity" of changing any piece of data > on the fly > >> > >> For #2 sometimes I'd use Cayenne (e.g. column queries, SQLSelect), but > most often I'd go with DFLib. The main data object in it is a DataFrame > (essentially a dynamic in-memory table). DataFrame is not tied to a > specific object structure, and can be dynamically transformed (columns > added, removed, changed, rows filtered, joins, unions, etc.). DFLib can do > what GINQ can and more, but it intentionally sacrifices a familiar OO > representation to support arbitrary intermediate data states and > frictionless mapping-free persistence. > >> > >> DataFrame df = Csv.load("my.csv") > >> .selectColumns("id", "price") > >> .selectRows($decimal("price").gt(100.)); > >> > >> Jdbc.connector(dataSource) > >> .tableSaver("db_table") > >> .save(df); > >> > >> Andrus > >> > >> > >>> On Dec 28, 2021, at 11:50 PM, Aristedes Maniatis > <a...@ish.com.au.INVALID> wrote: > >>> > >>> I came across this really interesting new feature in groovy 4 today... > >>> > >>> class Person { > >>> String name > >>> int age > >>> > >>> Person(String name, int age) { > >>> this.name = name > >>> this.age = age > >>> } > >>> } > >>> > >>> def persons1 = [new Person('Daniel', 35), new > Person('Linda', 21), new Person('Peter', 30)] > >>> def persons2 = [new Person('Jack', 35), new Person('Rose', > 21), new Person('Smith', 30)] > >>> > >>> > >>> def output = GQ { > >>> from p1 in persons1 > >>> innerjoin p2 in persons2 on p1.age == p2.age > >>> select p1.name.toUpperCase(), p2.name.toUpperCase() > >>> } > >>> > >>> assert [['DANIEL', 'JACK'], ['LINDA', 'ROSE'], ['PETER', > 'SMITH']] == output.toList() > >>> > >>> > >>> So GQ invokes this sql-like query language for Java/groovy objects. > >>> > >>> > >>> Not suggesting it is useful for Cayenne, but interesting nevertheless. > >>> > >>> > >>> Ari > >>> > >>> > >>> > >>> > >>> docs: > https://github.com/apache/groovy/blob/master/subprojects/groovy-ginq/src/spec/doc/ginq-userguide.adoc > >>> > >>> examples: > https://github.com/apache/groovy/blob/master/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy > >>> > >>> src: > https://github.com/apache/groovy/tree/master/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq > >