Re: Patch for CAY-360

From: Cris Daniluk (cris.danilu..mail.com)
Date: Wed Sep 14 2005 - 08:58:33 EDT

  • Next message: Cris Daniluk: "Re: CayenneDataObject#setDataContext()"

    I finally had a chance to look through this and it seems quite cool,
    actually. However, it seems to name and therefore register all
    queries, even if they aren't supposed to be:

    SelectQuery unnamedQuery = new SelectQuery(Order.class, "(isFilled =
    0) or (orderID = $orderID)");
    List result = dataContext.performQuery(unnamedQuery.queryWithParameters(tmap,
    false));

    Since I didn't name it, I don't think Cayenne should be caching this
    for me, should it? It will probably result in an NPE, anyway. Maybe
    there should be a check, like:

    if (name != null && !"".equals(name)) {
      query.setName(name + parametersHash.toHashCode());
    }

    Oh... is there any downsides to if the parameter map is arbitrarily
    long? Looks like it should be fine.

    On 9/6/05, Michael Gentry (Yes, I'm a Contractor)
    <michael_gentr..anniemae.com> wrote:
    > Could a few eyeballs look over this and give me feedback? It seems to work
    > with my test case.
    >
    > In org.objectstyle.cayenne.query.SelectQuery.java:354 (at least in my 1.2
    > checkout):
    >
    >
    > public SelectQuery queryWithParameters(Map parameters, boolean
    > pruneMissing) {
    > // create a query replica
    > SelectQuery query = new SelectQuery();
    > query.setDistinct(distinct);
    >
    > this.selectProperties.copyToProperties(query.selectProperties);
    >
    > query.setLoggingLevel(logLevel);
    > query.setParentObjEntityName(parentObjEntityName);
    > query.setParentQualifier(parentQualifier);
    > query.setRoot(root);
    >
    > // TODO: implement algorithm for building the name based on the
    > original name and
    > // the hashcode of the map of parameters. This way query clone can
    > take advantage
    > // of caching.
    >
    > Iterator keyValuePairs = parameters.entrySet().iterator();
    > HashCodeBuilder parametersHash = new HashCodeBuilder();
    >
    > while (keyValuePairs.hasNext()) {
    > Map.Entry entry = (Map.Entry) keyValuePairs.next();
    >
    > parametersHash.append(entry.getKey());
    > parametersHash.append(entry.getValue());
    > }
    >
    > query.setName(name + parametersHash.toHashCode());
    >
    > if (prefetches != null) {
    > query.addPrefetches(prefetches);
    > }
    >
    > if (orderings != null) {
    > query.addOrderings(orderings);
    > }
    >
    > if (customDbAttributes != null) {
    > query.addCustomDbAttributes(customDbAttributes);
    > }
    >
    > // substitute qualifier parameters
    > if (qualifier != null) {
    > query.setQualifier(qualifier.expWithParameters(parameters,
    > pruneMissing));
    > }
    >
    > return query;
    > }
    >
    >
    > I bolded the portions of interest. Of course, the TODO can be removed if
    > everything thinks this is valid.
    >
    > Thanks,
    >
    > /dev/mrg
    > --
    > I'm Victor. I'm the cleaner.
    >
    >



    This archive was generated by hypermail 2.0.0 : Wed Sep 14 2005 - 08:58:34 EDT