You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Mark Wardle <ma...@wardle.org> on 2016/06/12 20:53:34 UTC

Helper methods - aggregate for expression and SQL without SQL...

Dear all,

I'm implementing a new project using Cayenne based on some code currently
running in a live application built using WO/EOF/Wonder (see
https://github.com/wardle/rsterminology)

Migrating to Cayenne has been very straightforward so far.

Within Project Wonder, there are a large number of utility methods to make
it easy to deal with qualifiers (expressions) and perform database agnostic
batch operations without using SQL.

ERXEOControlUtilities.objectCountWithQualifier(ec, entityName, qual);

which takes a qualifier (essentially a Cayenne expression) and an entity
and performs a count.

ERXEOAccessUtilities.insertRow(ec, entityName, data);

which takes a context, entity name and dictionary (a map) and inserts the
values without having to deal with entities (a bit like a DataRow I think
in Cayenne?).

For example, we have
ERXEOAccessUtilities.updateRowsDescribedByQualifier(ec, entityName, qual,
data);
which takes a context, entity name, qualifier and a dictionary of data and
updates rows based on that data.

Are there equivalent utility methods within Cayenne please? I have found
SQLTemplate but, it looks as if I'd have to hand-tune the expression to
update and get embroiled in creating to logic to understand the DbEntity
and its properties in order to map a map. It feels as if I'm probably
fighting the framework and so normally that suggests I'm approaching it
wrong!

Advice for a WO-er appreciated.

Best wishes,

Mark

Re: Helper methods - aggregate for expression and SQL without SQL...

Posted by Mark Wardle <ma...@wardle.org>.
Thank you both Hugi and Michael - very useful.

It seems to me that this kind of aggregation functionality requirement is common enough to warrant adding a @sum/@avg/@max/@count to the Property much like in EOF? Perhaps I’ll create myself a custom superclass template for my entities...

Mark

> On 13 Jun 2016, at 14:51, Hugi Thordarson <hu...@karlmenn.is> wrote:
> 
> Hi Mark,
> 
> here are also a few utility methods we use to execute aggregate methods, updated for Cayenne 4.0.M4.
> 
> https://bitbucket.org/loftfar/jambalaya/src/6b952b8f65e6ac45b77e16bcfa5e97f2b9a27245/src/main/java/jambalaya/CayenneUtils.java?at=master&fileviewer=file-view-default
> 
> Cheers,
> - hugi
> 
> 
> 
>> On 12. jún. 2016, at 23:30, Michael Gentry <bl...@gmail.com> wrote:
>> 
>> Hi Mark,
>> 
>> For doing a count (and a few others), you can try using this:
>> 
>> https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/utilities/AggregateUtils.java
>> 
>> Example usage code is here:
>> 
>> https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/Aggregates.java
>> 
>> For your insert/update rows, I think you'll have to write that yourself.
>> If your "data" dictionary/map object uses keys that match your entity's
>> attribute names, You can probably loop over they keys and write the values
>> using CayenneDataObject's writeProperty() method (CDO is a superclass of
>> your actual entities).
>> 
>> mrg
>> 
>> 
>> 
>> On Sun, Jun 12, 2016 at 4:53 PM, Mark Wardle <ma...@wardle.org> wrote:
>> 
>>> Dear all,
>>> 
>>> I'm implementing a new project using Cayenne based on some code currently
>>> running in a live application built using WO/EOF/Wonder (see
>>> https://github.com/wardle/rsterminology)
>>> 
>>> Migrating to Cayenne has been very straightforward so far.
>>> 
>>> Within Project Wonder, there are a large number of utility methods to make
>>> it easy to deal with qualifiers (expressions) and perform database agnostic
>>> batch operations without using SQL.
>>> 
>>> ERXEOControlUtilities.objectCountWithQualifier(ec, entityName, qual);
>>> 
>>> which takes a qualifier (essentially a Cayenne expression) and an entity
>>> and performs a count.
>>> 
>>> ERXEOAccessUtilities.insertRow(ec, entityName, data);
>>> 
>>> which takes a context, entity name and dictionary (a map) and inserts the
>>> values without having to deal with entities (a bit like a DataRow I think
>>> in Cayenne?).
>>> 
>>> For example, we have
>>> ERXEOAccessUtilities.updateRowsDescribedByQualifier(ec, entityName, qual,
>>> data);
>>> which takes a context, entity name, qualifier and a dictionary of data and
>>> updates rows based on that data.
>>> 
>>> Are there equivalent utility methods within Cayenne please? I have found
>>> SQLTemplate but, it looks as if I'd have to hand-tune the expression to
>>> update and get embroiled in creating to logic to understand the DbEntity
>>> and its properties in order to map a map. It feels as if I'm probably
>>> fighting the framework and so normally that suggests I'm approaching it
>>> wrong!
>>> 
>>> Advice for a WO-er appreciated.
>>> 
>>> Best wishes,
>>> 
>>> Mark
>>> 
> 


Re: Helper methods - aggregate for expression and SQL without SQL...

Posted by Hugi Thordarson <hu...@karlmenn.is>.
Hi Mark,

here are also a few utility methods we use to execute aggregate methods, updated for Cayenne 4.0.M4.

https://bitbucket.org/loftfar/jambalaya/src/6b952b8f65e6ac45b77e16bcfa5e97f2b9a27245/src/main/java/jambalaya/CayenneUtils.java?at=master&fileviewer=file-view-default

Cheers,
- hugi



> On 12. jún. 2016, at 23:30, Michael Gentry <bl...@gmail.com> wrote:
> 
> Hi Mark,
> 
> For doing a count (and a few others), you can try using this:
> 
> https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/utilities/AggregateUtils.java
> 
> Example usage code is here:
> 
> https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/Aggregates.java
> 
> For your insert/update rows, I think you'll have to write that yourself.
> If your "data" dictionary/map object uses keys that match your entity's
> attribute names, You can probably loop over they keys and write the values
> using CayenneDataObject's writeProperty() method (CDO is a superclass of
> your actual entities).
> 
> mrg
> 
> 
> 
> On Sun, Jun 12, 2016 at 4:53 PM, Mark Wardle <ma...@wardle.org> wrote:
> 
>> Dear all,
>> 
>> I'm implementing a new project using Cayenne based on some code currently
>> running in a live application built using WO/EOF/Wonder (see
>> https://github.com/wardle/rsterminology)
>> 
>> Migrating to Cayenne has been very straightforward so far.
>> 
>> Within Project Wonder, there are a large number of utility methods to make
>> it easy to deal with qualifiers (expressions) and perform database agnostic
>> batch operations without using SQL.
>> 
>> ERXEOControlUtilities.objectCountWithQualifier(ec, entityName, qual);
>> 
>> which takes a qualifier (essentially a Cayenne expression) and an entity
>> and performs a count.
>> 
>> ERXEOAccessUtilities.insertRow(ec, entityName, data);
>> 
>> which takes a context, entity name and dictionary (a map) and inserts the
>> values without having to deal with entities (a bit like a DataRow I think
>> in Cayenne?).
>> 
>> For example, we have
>> ERXEOAccessUtilities.updateRowsDescribedByQualifier(ec, entityName, qual,
>> data);
>> which takes a context, entity name, qualifier and a dictionary of data and
>> updates rows based on that data.
>> 
>> Are there equivalent utility methods within Cayenne please? I have found
>> SQLTemplate but, it looks as if I'd have to hand-tune the expression to
>> update and get embroiled in creating to logic to understand the DbEntity
>> and its properties in order to map a map. It feels as if I'm probably
>> fighting the framework and so normally that suggests I'm approaching it
>> wrong!
>> 
>> Advice for a WO-er appreciated.
>> 
>> Best wishes,
>> 
>> Mark
>> 


Re: Helper methods - aggregate for expression and SQL without SQL...

Posted by Michael Gentry <bl...@gmail.com>.
Hi Mark,

For doing a count (and a few others), you can try using this:

https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/utilities/AggregateUtils.java

Example usage code is here:

https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/Aggregates.java

For your insert/update rows, I think you'll have to write that yourself.
If your "data" dictionary/map object uses keys that match your entity's
attribute names, You can probably loop over they keys and write the values
using CayenneDataObject's writeProperty() method (CDO is a superclass of
your actual entities).

mrg



On Sun, Jun 12, 2016 at 4:53 PM, Mark Wardle <ma...@wardle.org> wrote:

> Dear all,
>
> I'm implementing a new project using Cayenne based on some code currently
> running in a live application built using WO/EOF/Wonder (see
> https://github.com/wardle/rsterminology)
>
> Migrating to Cayenne has been very straightforward so far.
>
> Within Project Wonder, there are a large number of utility methods to make
> it easy to deal with qualifiers (expressions) and perform database agnostic
> batch operations without using SQL.
>
> ERXEOControlUtilities.objectCountWithQualifier(ec, entityName, qual);
>
> which takes a qualifier (essentially a Cayenne expression) and an entity
> and performs a count.
>
> ERXEOAccessUtilities.insertRow(ec, entityName, data);
>
> which takes a context, entity name and dictionary (a map) and inserts the
> values without having to deal with entities (a bit like a DataRow I think
> in Cayenne?).
>
> For example, we have
> ERXEOAccessUtilities.updateRowsDescribedByQualifier(ec, entityName, qual,
> data);
> which takes a context, entity name, qualifier and a dictionary of data and
> updates rows based on that data.
>
> Are there equivalent utility methods within Cayenne please? I have found
> SQLTemplate but, it looks as if I'd have to hand-tune the expression to
> update and get embroiled in creating to logic to understand the DbEntity
> and its properties in order to map a map. It feels as if I'm probably
> fighting the framework and so normally that suggests I'm approaching it
> wrong!
>
> Advice for a WO-er appreciated.
>
> Best wishes,
>
> Mark
>