Re: Recall object by it's PK? (e.g. w/Lucene)

From: Eric Schneider (eri..entralparksoftware.com)
Date: Mon Apr 19 2004 - 14:58:48 EDT

  • Next message: Andrus Adamchik: "Re: Recall object by it's PK? (e.g. w/Lucene)"

    Craig,

    > But Cayenne can't resolve the expression (presumably because the PK
    > property is not part of the mappings in the XML file?)

    Yeah, that's what's happening. What you looking for is a inDbExp() method.
    Which unfortunately it doesn't exist. :-\

    What I'd suggest doing is chaining the list into an OR expression.
    Something like:

    Expression qual = null;
    for (int i = 0; i < hits.length(); i++) {
     if (qual == null) {
      qual = ExpressionFactory.matchDbExp("AD_ID_PK_COLUMN",
    hits.doc(i).get("Id"));
     } else {
      qual = qual.orExp(ExpressionFactory.matchDbExp("AD_ID_PK_COLUMN",
    hits.doc(i).get("Id")));
     }
    }

    Hope this helps...

    e.

    ----- Original Message -----
    From: "Craig Jones" <crai..ankardsaweigh.com>
    To: <cayenne-use..bjectstyle.org>
    Sent: Monday, April 19, 2004 2:45 PM
    Subject: Recall object by it's PK? (e.g. w/Lucene)

    > Hi,
    >
    > I need help figuring out how to recall a data object given the PK.
    >
    > I want to use Lucene to do full-text searching on my data. My data
    > object includes an auto-generated PK, a description field, and some
    > other fields. I figure I'll have Lucene index the description and store
    > the PK value to give back to me when I do a search. I found in the
    > Cayenne documentation how to have the data object return the PK as a
    > read-only property, as follows, so I know how to tell Lucene what the PK
    > is.
    >
    > /** Read-only access to PK */
    > public Integer getId() {
    > return (getObjectId() != null &&
    > !getObjectId().isTemporary())
    > ?
    > (Integer)getObjectId().getIdSnapshot().get(AD_ID_PK_COLUMN)
    > : null;
    > }
    >
    > My question is, after Lucene does a search and gives me back a list of
    > PK numbers, how do I get Cayenne to fetch back the object(s) that
    > correspond to those values? I tried doing an IN expression as follows
    >
    >
    > // (Lucene query returns something called a Hits object here)
    >
    > ArrayList idList = new ArrayList(hits.length());
    > for (int i = 0; i < hits.length(); i++) {
    > idList.add(Integer.getInteger(hits.doc(i).get("Id")));
    > }
    >
    > Expression qual = ExpressionFactory.inExp("getId", idList); //
    > Tried with and w/o the "get"
    > SelectQuery cayenneQuery = new SelectQuery(MyObject.class,
    > qual);
    > return ctxt.performQuery(cayenneQuery);
    >
    > But Cayenne can't resolve the expression (presumably because the PK
    > property is not part of the mappings in the XML file?)
    >
    > org.objectstyle.cayenne.CayenneRuntimeException: [v.1.0.5 December 22
    > 2003] Global exception.
    > <clip>
    > Caused by: org.objectstyle.cayenne.exp.ExpressionException: [v.1.0.5
    > December 22 2003] Can't resolve path component: [MyObject.getId].
    > at
    > org.objectstyle.cayenne.map.Entity$PathIterator.next(Entity.java:309)
    > at
    > org.objectstyle.cayenne.access.trans.QueryAssemblerHelper.appendObjPath(
    > QueryAssemblerHelper.java:127)
    > at
    > org.objectstyle.cayenne.access.trans.QualifierTranslator.objectNode(Qual
    > ifierTranslator.java:355)
    > at
    > org.objectstyle.cayenne.exp.ExpressionTraversal.traverseExpression(Expre
    > ssionTraversal.java:90)
    > at
    > org.objectstyle.cayenne.exp.ExpressionTraversal.traverseExpression(Expre
    > ssionTraversal.java:117)
    > <clip>
    >
    > How do I tell Cayenne that the getId property is available for searching
    > without mucking up the auto-PK generation?
    >
    > Thanks in Advance,
    >
    > // Craig
    > Orange, CA
    >
    > P.S. I don't suppose that there is any tutorial information available on
    > using Lucene with Cayenne that I missed somewhere? If not, I guess I
    > get to be the one to write it, huh?



    This archive was generated by hypermail 2.0.0 : Mon Apr 19 2004 - 14:58:47 EDT