That looks like a very cool, useful contribution!

Chuck

From: <webobjects-dev-bounces+chill=gevityinc....@lists.apple.com> on behalf of 
Ricardo Parada <rpar...@mac.com>
Date: Saturday, March 11, 2017 at 2:41 PM
To: "webobjects-dev@lists.apple.com WebObjects" <webobjects-dev@lists.apple.com>
Subject: ERXQuery Preview

Hi all,

Over the years, I’ve worked on an class for doing ad hoc queries.  This class 
has gotten better and better.  At first, the API of this class and some 
implementation details were not  ready for public consumption in my opinion.

However, recently I took the time to polish the code as much as possible and if 
I can get my employer's approval I would like to contribute this code to 
project Wonder which has given us so much in return during the years.

Here is a preview of its functionality.  Please let me know if you guys think 
this would be a useful contribution.
ERXQuery.java
This class has a fluent API that mimics a select statement:
NSArray<NSDictionary<String,Object>> records =
   ERXQuery.create()
      .select (keys)
      .from (entity)
      .where (qualifier)
      .groupBy (groupings)
      .having (havingQualifier)
      .orderBy (sortings)
      .fetch();

Overview
ERXQuery allows you to use EOF constructs (EOQualifiers, EOAttributes, 
EOSortOrdering, EOAttribute names, relationships, etc.) to create queries of 
the form:
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...

Using Ad Hoc Attributes
You may use the ERXAdHocAttributes class to easily create ad hoc attributes to 
use with your query. For example, the code below creates two ad hoc 
EOAttributes. An ad hoc attribute is an EOAttribute that is not physically 
attached to an entity and that has a definition. They are useful for 
aggregating other attributes. The definition of the attribute can reference 
relationships and attributes as shown below.
// Using a single query against the order entity, count the number of
// orders and line items that match the qualifier.
ERXAdHocAttributes attributes = ERXAdHocAttributes.create(orderEntity)
   .add("itemCount", "COUNT(DISTINCT lineItems.lineItemID)", "intNumber")
   .add("orderCount", "COUNT(DISTINCT orderID)", "intNumber");
NSDictionary<String,Object> row =
   ERXQuery.create()
      .select (attributes)
      .from (orderEntity)
      .where (qualifier)
      .fetch()
      .lastObject();
int orderCount = ((Number) row.objectForKey("orderCount")).intValue();
int itemCount = ((Number) row.objectForKey("itemCount")).intValue();

Fetching into a Custom Record Class
You can also fetch using a custom class of your choice, i.e. Foo, as shown 
below:
// Using java >= 8 is easy with a lambda expression
NSArray<Foo> objs = query.fetch(editingContext, (ec, row) -> new Foo(ec, row));

// Using java < 8 you must provide a RecordConstructor
ERXQuery.RecordConstructor<Foo> recordConstructor =
   new ERXQuery.RecordConstructor<Foo> {
       @Override
       public Foo constructRecord(EOEditingContext ec, NSMutableDictionary row) 
{
          return new Foo(ec, row);
       }
   };
NSArray objs = query.fetch(editingContext, recordConstructor);

Author: Ricardo J. Parada
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to