Hi Anil, On Aug 15, 2006, at 11:31 PM, Anil Gangolli wrote:
comments inline ----- Original Message ----- From: Craig L Russell To: [email protected] Sent: Tuesday, August 15, 2006 11:21 AM Subject: Query interface for Datamapper Hi,Here's what I propose as a starting point for the query interface between Datamapper Managers and Datamapper Persistence.There are enough differences between JDO, JPA, and Hibernate that I found it really awkward to define a set of methods on PersistenceStrategy that covered the functionality. In particular, there are two methods in JPA that both execute the query and determine the result shape, and parameters are passed one by one. In JDO, there is an API that determines the result shape and one method to execute the query, passing parameter values. It's trivial to encapsulate these differences in a Query instance.I've included the Query API below for discussion, along with calling sequence from Mapper.Craig public interface DatamapperPersistenceStrategy { ... /** * Create query. * @param clazz the class of instances to find * @param queryName the name of the query * @throws org.apache.roller.RollerException on any error */ public DatamapperQuery newQuery(Class clazz, String queryName) throws RollerException; }This confused me. Shouldn't this be an interface? Wouldn't each persistence strategy be a factory implementing this interface ?
Doh! Copy/paste error. Of course DatamapperPersistenceStrategy is an interface, implemented by the various back end classes. I've corrected it above so it's clear for future discussions.
public class DatamapperUserManagerImpl { ...public WebsiteData getWebsiteByHandle(String handle, Boolean enabled)throws RollerException { // XXX cache websites by handle? return (WebsiteData)strategy.newQuery(WebsiteData.class, "getByHandle&&Enabled") .execute(new Object[]{handle, enabled}); }OK. I got the pattern here. And here you do exactly what I thought you would, using the strategy as the factory implementation.The earlier idea was to use just say "strategy.getWebsiteByHandle (handle, enabled)", defining each such method on a PersistenceStrategy interface and implementing them in each strategy. This would probably turn out to make the strategy class huge and unwieldy, but there might be a typesafe alternative
I started out thinking the same, but it turned out that most of the implementation of strategy.getWebsiteByHandle was the same as the inline code, and it boiled down to calling or constructing a query. So most of the code simply shifted from the Manager classes to the Strategy class and indeed it became unwieldy.
Craig
public interface DatamapperQuery { /** Execute the query with no parameters. * @return the results of the query */ Object execute(); /** Execute the query with one parameter. * @param param the parameter * @return the results of the query */ Object execute(Object param); /** Execute the query with parameters. * @param params the parameters * @return the results of the query */ Object execute(Object[] params); /** Remove instances selected by the query with no parameters. * @return the results of the query */ void removeAll(); /** Remove instances selected by the query with one parameter. * @param param the parameter * @return the results of the query */ void removeAll(Object param); /** Remove instances selected by the query with parameters. * @param params the parameters * @return the results of the query */ void removeAll(Object[] params); /** Set the result to be a single instance (not a List). * @result the instance on which this method is called */ DatamapperQuery setUnique(); /** Set the types of the parameters. This is only needed if the* parameter types are temporal types, e.g. Date, Time, Calendar. * @param the types of the parameters in corresponding positions.* @result the instance on which this method is called */ DatamapperQuery setTypes(Object[] types); /** Set the range of results for this query. * @fromIncl the beginning row number * @toExcl the ending row number * @return the instance on which this method is called */ DatamapperQuery setRange(long fromIncl, long toExcl); } Craig Russell [EMAIL PROTECTED] http://db.apache.org/jdo
Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!
smime.p7s
Description: S/MIME cryptographic signature
