Jakob,
Sorry that didn't work for me. The problem is that my Sql criteria contains
a '.' which is throwing off the pathElement. I made a few changes below
that make it work for me.
Alan
---------------------------
private OJBIterator getRsIteratorFromQueryExtentAware(Query query,
ClassDescriptor
cld,
RsIteratorFactory
factory)
{
if (logger.isDebugEnabled())
{
logger.debug("-> Looking for objects of type [" +
cld.getClassNameOfObject()+"]");
}
/*
* PRE CONDITIONS
*/
/* We must use a criteria object */
if(!(query instanceof QueryByCriteria))
{
return getRsIteratorFromQuery(query,cld,factory);
}
Criteria criteria = query.getCriteria();
if(criteria == null)
{
return getRsIteratorFromQuery(query,cld,factory);
}
Enumeration enum = criteria.getElements();
if(enum == null)
{
return getRsIteratorFromQuery(query,cld,factory);
}
/*
* Ok, we have some criteria elements to traverse
*/
ChainingIterator chainingIterator = new ChainingIterator();
boolean pathElementPresent = false;
HashSet processedClasses = new HashSet();
while(enum.hasMoreElements())
{
Object criteriaElement = enum.nextElement();
logger.debug(" --# Criteria element ["+criteriaElement+"] class
"+criteriaElement.getClass().getName());
if (criteriaElement instanceof Criteria)
{
// TODO : nested criteria
//logger.debug(" --# Nested Criteria
["+criteriaElement+"]");
continue;
}
SelectionCriteria selectionCriteria =
(SelectionCriteria)criteriaElement;
String attribute = selectionCriteria.getAttribute();
int dotPos = attribute.lastIndexOf(".");
if(dotPos >= 0)
{
//We are dealing with a path expression, include iterators
for all concrete subclasses
String pathElement =
ClassDescriptor.cleanPath(attribute).substring(0,dotPos);
logger.debug(" --# Looking for concrete classes on
pathElement ["+pathElement+"]");
//TODO revise this cast
Class hintClass =
((QueryByCriteria)query).getClassForPath(pathElement);
if(hintClass != null)
{
// BRJ: do the same class only once
if(processedClasses.contains(hintClass))
{
continue;
}
processedClasses.add(hintClass);
//preserve user supplied hint
pathElementPresent = true;
chainingIterator.addIterator(getRsIteratorFromQuery(query,cld,factory));
}
else
{
List concreteClasses =
getClassObjectsForPathElement(cld,pathElement);
if(concreteClasses == null)
{
throw new NullPointerException("Path element
["+pathElement+"] refers abstract classes only");
}
if (concreteClasses.size() > 0) {
// BRJ: do the same class only once
pathElementPresent = true;
if(processedClasses.contains(concreteClasses.get(0)))
{
continue;
}
processedClasses.add(concreteClasses.get(0));
Iterator it = concreteClasses.iterator();
while(it.hasNext())
{
Class extentClass = (Class)it.next();
logger.debug(" --# Modifying Query to include
class ["+extentClass.getName()+"] for path element ["+pathElement+"]");
((QueryByCriteria)query).addPathClass(pathElement,extentClass);
chainingIterator.addIterator(getRsIteratorFromQuery(query,cld,factory));
}
}
}
}
}
if(pathElementPresent)
{
return chainingIterator;
}
else
{
return getRsIteratorFromQuery(query,cld,factory);
}
}
---------------------------
-----Original Message-----
From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]]
Sent: Friday, December 20, 2002 12:57 PM
To: OJB Users List
Subject: Re: Bug / coding oversight?
hi alan,
i just checked in a new revision of PersistenceBrokerImpl with fixes in
getRsIteratorExtentAware().
please have a look at it.
this fix does NOT contain your modification to satisfy referential
integrity.
jakob
----- Original Message -----
From: "Jakob Braeuchi" <[EMAIL PROTECTED]>
To: "OJB Users List" <[EMAIL PROTECTED]>
Sent: Friday, December 20, 2002 5:56 PM
Subject: Re: Bug / coding oversight?
> hi alan,
>
> when adding your if(chainingIterator==null), i get all my objects twice.
the
> problem is imo the implementation of the extentaware iterator. for each
> criteria containing a path it adds an iterator (resulting in a query!).
>
> in my testcase i have a query with two criteria containing path
expressions,
> so two queries are executed and two iterators are added to the chaining
> iterator. the result is the above mentioned double number of objects.
>
> jakob
>
>
> ----- Original Message -----
> From: "Olmanson, Alan" <[EMAIL PROTECTED]>
> To: "OJB Users List" <[EMAIL PROTECTED]>
> Sent: Friday, December 20, 2002 1:03 AM
> Subject: Bug / coding oversight?
>
>
> > Hello,
> >
> > I think I've run across a bug (more likely a coding oversight).
> >
> > In the PersistenceBrokerImpl in the method
> > getRsIteratorFromQueryExtentAware(Query, ClassDescriptor,
> > RsIteratorFactory);
> >
> > Before the while(enum.hasMoreElements()) loop a chainingIterator is
> defined
> > and set to null.
> >
> > With in the loop the chainingIterator is created.
> >
> > The problem is it's recreated on each iteration of the loop. Shouldn't
it
> > only be created if it is null?
> >
> > I had two criteriaElements added in my Criteria the first was a NotNull
> the
> > other an SQL. I was getting nothing returned until I added:
> >
> > if (chainingIterator == null) {
> > chainingIterator = new ChainingIterator();
> > }
> >
> > Alan
> >
> > --
> > To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
> >
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>