|
From: <one...@us...> - 2002-11-05 15:24:40
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl
In directory usw-pr-cvs1:/tmp/cvs-serv4736/hibernate/impl
Modified Files:
SessionFactoryImpl.java SessionImpl.java
Log Message:
queries against mapped classes now pick up *all* subclasses, wether mapped as subclasses or not
fixed a bug when the same classname appeared twice in a query
Index: SessionFactoryImpl.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/SessionFactoryImpl.java,v
retrieving revision 1.56
retrieving revision 1.57
diff -C2 -d -r1.56 -r1.57
*** SessionFactoryImpl.java 30 Oct 2002 15:28:04 -0000 1.56
--- SessionFactoryImpl.java 5 Nov 2002 15:24:35 -0000 1.57
***************
*** 589,601 ****
public String[] getImplementors(Class clazz) {
! if ( classPersisters.containsKey(clazz) ) return null;
ArrayList results = new ArrayList();
! Iterator iter = classPersisters.keySet().iterator();
while ( iter.hasNext() ) {
! Object o = iter.next();
! if ( o instanceof String ) continue;
! Class persistent = (Class) o;
! if ( clazz.isAssignableFrom(persistent) ) {
! results.add( persistent.getName() );
}
}
--- 589,606 ----
public String[] getImplementors(Class clazz) {
! //if ( classPersisters.containsKey(clazz) ) return null;
ArrayList results = new ArrayList();
! Iterator iter = classPersisters.values().iterator();
while ( iter.hasNext() ) {
! ClassPersister p = (ClassPersister) iter.next();
! if (
! (p instanceof Queryable) && (
! clazz.equals( p.getMappedClass() ) || (
! ( ! ( (Queryable) p ).isInherited() ) &&
! clazz.isAssignableFrom( p.getMappedClass() )
! )
! )
! ) {
! results.add( p.getClassName() );
}
}
Index: SessionImpl.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/SessionImpl.java,v
retrieving revision 1.147
retrieving revision 1.148
diff -C2 -d -r1.147 -r1.148
*** SessionImpl.java 5 Nov 2002 11:48:07 -0000 1.147
--- SessionImpl.java 5 Nov 2002 15:24:35 -0000 1.148
***************
*** 1057,1063 ****
QueryTranslator[] q = getQueries(query, false);
! if (q.length==0) return Collections.EMPTY_LIST;
!
! List result = null;
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
--- 1057,1061 ----
QueryTranslator[] q = getQueries(query, false);
! List results = Collections.EMPTY_LIST;
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
***************
*** 1067,1078 ****
for ( int i=0; i<q.length; i++ ) {
! List currentResult = q[i].find(this, values, types, true, selection, namedParams);
! if (result==null) {
! result = currentResult;
! }
! else {
! result.addAll(currentResult);
! }
!
}
}
--- 1065,1071 ----
for ( int i=0; i<q.length; i++ ) {
! List currentResults = q[i].find(this, values, types, true, selection, namedParams);
! currentResults.addAll(results);
! results = currentResults;
}
}
***************
*** 1080,1084 ****
dontFlushFromFind--;
}
! return result;
}
--- 1073,1077 ----
dontFlushFromFind--;
}
! return results;
}
***************
*** 1123,1126 ****
--- 1116,1121 ----
QueryTranslator[] q = getQueries(query, true);
+ if (q.length==0) return Collections.EMPTY_LIST.iterator();
+
Iterator result = null;
Iterator[] results = null;
***************
*** 1147,1152 ****
if (values.length!=0) log.trace( "parameters: " + StringHelper.toString(values) );
}
!
! QueryTranslator q = factory.getScalarQuery(query);
autoFlushIfRequired( q.getQuerySpaces() );
return q.scroll(values, types, selection, namedParams, this);
--- 1142,1149 ----
if (values.length!=0) log.trace( "parameters: " + StringHelper.toString(values) );
}
! String[] concreteQueries = QueryTranslator.concreteQueries(query, factory);
! if ( concreteQueries.length>1 ) throw new HibernateException("This query cannot be scrolled: " + query);
! if ( concreteQueries.length==0 ) return null; //TODO: fix this and return an empty ScrollableResults
! QueryTranslator q = factory.getScalarQuery( concreteQueries[0] );
autoFlushIfRequired( q.getQuerySpaces() );
return q.scroll(values, types, selection, namedParams, this);
***************
*** 1168,1174 ****
}
! QueryTranslator q = factory.getQuery(query);
! autoFlushIfRequired( q.getQuerySpaces() );
! return q.findIdentifiers(values, types, this);
}
--- 1165,1182 ----
}
! QueryTranslator[] q = getQueries(query, false);
!
! List result = Collections.EMPTY_LIST;
!
! //execute the queries and return all result lists as a single list
!
! for ( int i=0; i<q.length; i++ ) {
!
! List currentResult = q[i].findIdentifiers(values, types, this);
! currentResult.addAll(result);
! result = currentResult;
! }
!
! return result;
}
***************
*** 1989,1993 ****
for (int i=0; i<fields.length; i++) {
Object result = wrap( fields[i], types[i] );
! if ( result!=fields[i] ) { // && result!=null <---- what was that for??
fields[i] = result;
substitute = true;
--- 1997,2001 ----
for (int i=0; i<fields.length; i++) {
Object result = wrap( fields[i], types[i] );
! if ( result!=fields[i] ) {
fields[i] = result;
substitute = true;
***************
*** 2543,2556 ****
public List filter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException {
! FilterTranslator q = getFilterTranslator(collection, filter, values, types, selection, namedParams, false);
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
!
try {
! return q.find(this, values, types, true, selection, namedParams);
}
finally {
dontFlushFromFind--;
}
}
--- 2551,2575 ----
public List filter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException {
! String[] concreteFilters = QueryTranslator.concreteQueries(filter, factory);
! FilterTranslator[] filters = new FilterTranslator[ concreteFilters.length ];
!
! for ( int i=0; i<concreteFilters.length; i++ ) {
! filters[i] = getFilterTranslator(collection, concreteFilters[i], values, types, selection, namedParams, false);
! }
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
!
! List results = Collections.EMPTY_LIST;
try {
! for ( int i=0; i<concreteFilters.length; i++ ) {
! List currentResults = filters[i].find(this, values, types, true, selection, namedParams);
! currentResults.addAll(results);
! results = currentResults;
! }
}
finally {
dontFlushFromFind--;
}
+ return results;
}
***************
*** 2558,2571 ****
public Iterator iterateFilter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException {
! FilterTranslator q = getFilterTranslator(collection, filter, values, types, selection, namedParams, true);
!
! dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
!
! try {
! return q.iterate(values, types, selection, namedParams, this);
}
! finally {
! dontFlushFromFind--;
}
}
--- 2577,2605 ----
public Iterator iterateFilter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException {
! String[] concreteFilters = QueryTranslator.concreteQueries(filter, factory);
! FilterTranslator[] filters = new FilterTranslator[ concreteFilters.length ];
!
! for ( int i=0; i<concreteFilters.length; i++ ) {
! filters[i] = getFilterTranslator(collection, concreteFilters[i], values, types, selection, namedParams, true);
}
!
! if (filters.length==0) return Collections.EMPTY_LIST.iterator();
!
! Iterator result = null;
! Iterator[] results = null;
! boolean many = filters.length>1;
! if (many) results = new Iterator[filters.length];
!
! //execute the queries and return all results as a single iterator
! for ( int i=0; i<filters.length; i++ ) {
!
! result = filters[i].iterate(values, types, selection, namedParams, this);
! if ( many ) {
! results[i] = result;
! }
!
}
+
+ return many ? new JoinedIterator(results) : result;
}
|