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