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 <[email protected]>
> 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